Назад | Перейти на главную страницу

Как снизить нагрузку на ЦП при выполнении запросов MySQL?

У нас есть социальный сайт на основе Wowonder для небольшого сообщества, и как только мы набираем 100 пользователей в сети, наш сайт становится очень медленным из-за высокой загрузки ЦП. Сам сценарий должен быть в порядке, потому что ни у кого из других клиентов нет проблем с этим, поэтому я считаю, что что-то с нашей стороны обречено. Это наш отчет о взглядах с сотней пользователей онлайн: отчет о взглядах. Как видите, загрузка нашего ЦП слишком высока, даже после настройки политик кеширования. Мы пробовали работать без query_cache, но результат был тот же.

[mysqld] innodb_buffer_pool_instances = 26 innodb_file_per_table = 1 innodb_read_io_threads = 16 innodb_write_io_threads = 16 innodb_buffer_pool_size = 26G innodb_io_capacity=300 innodb_log_file_size=3G performance_schema=ON table_definition_cache=10000 join_buffer_size=256M skip-name-resolve key_buffer_size = 512M max_allowed_packet = 512M thread_stack = 192K thread_cache_size = 10 myisam_recover_options = BACKUP max_connections = 1000 query_cache_type = 1 query_cache_limit = 256K query_cache_min_res_unit = 2k query_cache_size = 50M

Как было сказано ранее, сам код должен быть в порядке, потому что он хорошо работает в других экземплярах, но не в этом. Любые идеи будут высоко оценены. Дайте мне знать, если я могу чем-то помочь, у меня нет идей.

Как правило, высокая загрузка ЦП означает медленные (плохо проиндексированные или плохо спроектированные) запросы. Конфигурация обычно имеет гораздо меньшее влияние, а плохая конфигурация обычно снижает загрузку вашего процессора и запросы.

Сказав это, некоторые части вашей конфигурации ужасно плохи:

join_buffer_size=256M

Это, скорее всего, увеличивает загрузку вашего процессора. и нанесение вреда вашей производительности. Закомментируйте, оставьте значение по умолчанию.

Вам почти наверняка не нужно отказываться от значений по умолчанию, поэтому закомментируйте их:

thread_stack        = 192K
thread_cache_size       = 10

Обычно они приносят больше вреда, чем пользы:

query_cache_type = 1
query_cache_limit = 256K
query_cache_min_res_unit = 2k
query_cache_size = 50M

Рассмотрите возможность замены на:

query_cache_type = 0
query_cache_size = 0

Мой ответ - дополнить @Gordan Bobic

Проверьте, какие запросы выполняются медленно:

mysql -e "SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND<>'Sleep' and TIME > 5"

Для каждого медленного запроса ОБЪЯСНИТЕ по запросу. Вы можете установить Percona Tools и запустить pt-visual-объяснять чтобы лучше представить EXPLAIN заявление.

Если вы используете движок InnoDB, вы можете увидеть, что он делает:

mysql -e "show engine innodb status \G"

Другие подробности можно найти в Схема производительности MySQL который включает профайлер слишком. Вот это статья Percona о профилировщике.

Если вы хотите получить лучшее представление об использовании ЦП, вы можете использовать perf + ПламяГрафы.