Мы запускаем социальный сайт на основе 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 = 26 ГБ
innodb_io_capacity = 300
innodb_log_file_size = 3G
performance_schema = ВКЛ
table_definition_cache = 10000
join_buffer_size = 256 МБ
пропустить имя-разрешение
key_buffer_size = 512 МБ
max_allowed_packet = 512 МБ
thread_stack = 192 КБ
thread_cache_size = 10
myisam_recover_options = РЕЗЕРВНОЕ КОПИРОВАНИЕ
max_connections = 1000
query_cache_type = 1
query_cache_limit = 256 КБ
query_cache_min_res_unit = 2 КБ
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"
Для каждого запроса это медленный запуск EXPLAIN по запросу. Вы можете установить Percona Tools и запустить pt-visual-объяснение , чтобы лучше представить оператор EXPLAIN
.
Если вы используете движок InnoDB, вы можете увидеть, что это такое. выполнение с помощью:
mysql -e "show engine innodb status \G"
Другие подробности можно найти в MySQL Performance Schema , которая также включает профилировщик . Здесь статья Percona о профилировщике.
Если вы хотите получить более полное представление об использовании процессора, вы можете использовать perf
+ FlameGraphs .