У нас есть социальный сайт на основе 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
+ ПламяГрафы.