Wordpress too-slow
Заказчик: сайт Wordpress тормозит.
Сервер физический: сервер CPU 8 ядер, 16 GB RAM, Soft RAID 10
Размер дампа БД: 140 MB
Размер сайт на диске: 2.1G (c кэшем WP)
Время формирования страницы: от 15 секунд.
Показатели:
Одновременно на сайте: около 100 пользователей
Загрузка CPU
Запросы в MyTop
Показатели Zabbix.
Обращаем внимание на высокие значения времени процессов ядра (красный цвет на графике CPU) и на среднее количество запросов в MySQL.
Размер таблиц:
+--------------------------+--------+------------+-------------+--------------+
| table_name | ENGINE | table_rows | DATA_LENGTH | INDEX_LENGTH |
+--------------------------+--------+------------+-------------+--------------+
| zz_postmeta | MyISAM | 1245642 | 94746048 | 41702400 |
| zz_posts | MyISAM | 148600 | 36695272 | 13848576 |
| zz_term_relationships | MyISAM | 38565 | 809865 | 1587200 |
| zz_yoast_seo_meta | InnoDB | 28758 | 2326528 | 0 |
| zz_terms | MyISAM | 10849 | 462468 | 911360 |
| zz_term_taxonomy | MyISAM | 10849 | 423544 | 370688 |
| zz_usermeta | MyISAM | 3750 | 301760 | 144384 |
| zz_options | MyISAM | 1359 | 448094228 | 346112 |
| zz_yoast_seo_links | InnoDB | 983 | 147456 | 65536 |
| zz_users | MyISAM | 235 | 26144 | 29696 |
| zz_statistics_visitor | InnoDB | 34 | 16384 | 81920 |
| zz_ewwwio_images | InnoDB | 9 | 16384 | 32768 |
| zz_statistics_pages | InnoDB | 7 | 16384 | 49152 |
| zz_statistics_visit | InnoDB | 6 | 16384 | 16384 |
| zz_commentmeta | MyISAM | 2 | 88 | 9216 |
| zz_comments | MyISAM | 1 | 152 | 7168 |
| zz_statistics_exclusions | InnoDB | 0 | 16384 | 32768 |
| zz_statistics_useronline | InnoDB | 0 | 16384 | 0 |
| zz_statistics_search | InnoDB | 0 | 16384 | 49152 |
| zz_termmeta | MyISAM | 0 | 0 | 4096 |
| zz_statistics_historical | InnoDB | 0 | 16384 | 49152 |
| zz_links | MyISAM | 0 | 0 | 1024 |
+--------------------------+--------+------------+-------------+--------------+
Поиск решения:
Предположения 1: Проблема с хранилищем
Загрузка процессов ядра, Soft RAID 10. Тестируем:
# date; sync; dd if=/dev/zero of=/home/test/bigfile bs=1M count=1024; sync; date;
Mon Jul 9 20:36:43 CEST 2018
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.3009 s, 467 MB/s
Mon Jul 9 20:38:33 CEST 2018
1 минута 50 секунд - это катастрофа!
Тестирование:
Кладем копию сайта на другой сервер с SSD хранилищем, перенаправляем DNS на него, смотрим нагрузку:
Выводы:
- проблема с диском на исходном сервере действительно есть
- основная проблема не устранена, та же высокая загрузка процессов mysqld (на графике не видно)
- нужно анализировать запросы mysql
Предположения 2: Неоптимизированные запросы mysql
Поиск:
Включаем лог медленных запросов на тестовом сервере. Смотрим и анализируем. Замечаем множественные повторения таких :
# Query_time: 3.142688 Lock_time: 0.000074 Rows_sent: 3 Rows_examined: 254237
# Query_time: 3.318022 Lock_time: 0.001266 Rows_sent: 3 Rows_examined: 254237
# Query_time: 4.179673 Lock_time: 0.000076 Rows_sent: 0 Rows_examined: 745311
SELECT SQL_CALC_FOUND_ROWS zz_posts.ID FROM zz_posts INNER JOIN zz_postmeta ON ( zz_posts.ID = zz_postmeta.post_id ) WHERE 1=1 AND (
( zz_postmeta.meta_key = 'dt_string' AND zz_postmeta.meta_value = 'tvhVl5BZ1402' )
) AND zz_posts.post_type = 'dt_links' AND (zz_posts.post_status = 'publish') GROUP BY zz_posts.ID ORDER BY zz_posts.post_date DESC LIMIT 0, 30;
Смотрим на индексы таблицы postmeta: Добавим еще один: Результат:
Выводы:
- Время формирование страницы уменьшилась до 1.5 секунды, было от 15.
- Купленные темы и стандартные плагины не всегда оптимальны
- Заказчику рекомендовано сменить сервер в виду нерешенных проблем с хранилищем.