WordPress тормозит

Заказчик: сайт 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 на него, смотрим нагрузку:

Выводы:

  1. проблема с диском на исходном сервере действительно есть
  2. основная проблема не устранена, та же высокая загрузка процессов mysqld (на графике не видно)
  3. нужно анализировать запросы 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. Время формирование страницы уменьшилась до 1.5 секунды, было от 15.
  2. Купленные темы и стандартные плагины не всегда оптимальны
  3. Заказчику рекомендовано сменить сервер в виду нерешенных проблем с хранилищем.