Процесс MySQL идет более 100% загрузки процессора


10

У меня проблемы с моим LAMP-сервером. В последнее время все стало очень медленно, хотя количество посетителей на моих сайтах сильно не изменилось. Когда я запускаю topкоманду, она говорит, что процесс MySQL занял 150-200% процессорного времени. Как это возможно, я всегда думал, что 100% это максимум?

Я использую серверную версию Ubuntu 9.04 с 1,5 ГБ оперативной памяти.

my.cnf настройки:

key_buffer      = 64M
max_allowed_packet  = 16M
thread_stack        = 192K
thread_cache_size       = 8

myisam-recover         = BACKUP
max_connections        = 200
table_cache            = 512
table_definition_cache = 512
thread_concurrency     = 2

read_buffer_size = 1M
sort_buffer_size = 4M
join_buffer_size = 1M

query_cache_limit   = 1M  # the maximum size of individual query results
query_cache_size    = 128M

Вот вывод MySQLTuner :

MySQLTuner выход

Команда top:

максимальный выход

Что может быть причиной этой проблемы? Могу ли я внести изменения в мой, my.cnfчтобы предотвратить зависание сервера?

Ответы:


15
  1. Увеличьте ключевой буфер (у вас сейчас 64 МБ, но суммарные индексы составляют 116 МБ, поэтому установите не менее 128 МБ). Должно помочь немедленно.
  2. Запустите mysqloptimize и mysqlrepair на ваших столах
  3. Увеличьте кеш таблиц / уменьшите общее количество таблиц, чтобы увеличить частоту обращений к кешам таблиц. Возможно, у вас есть неиспользованные или старые таблицы, которые можно удалить.

Другие рекомендуемые варианты конфигурации:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 4
  • лог-запросы, не использующие индексы-

Проверьте файл журнала через некоторое время.


Спасибо за рекомендации, я попробую их и сообщу, помогло ли это.
Темновит

скажите пожалуйста, как вы рассчитали, что суммарные показатели 116M?
Темновит

получил сам :)
Темновит

5

У вас есть процессор с несколькими ядрами или несколько процессоров. Если у вас два ядра и процесс использует 100% обоих ядер, он будет отображаться как 200% сверху.

Аналогично, это, вероятно, работает как задумано - с вашей конфигурацией все в порядке. Если вы испытываете частые зависания, из того, что вы опубликовали, вы можете захотеть добавить правильные индексы в свои таблицы (или оптимизировать свои запросы).


5

Запустите, top -Hчтобы увидеть все запущенные потоки, а не только общий процесс. Кроме того, если вы нажмете 1клавишу в верхней части, он покажет вам использование процессора для отдельных процессоров / ядер.


Спасибо, это действительно помогло мне - много лет использовал топ и не знал, что у него есть такая способность. Я обнаружил, что существует один «вечный» поток mysql, который все время потребляет 60% ЦП, в то время как потоки запросов приходят и уходят поверх этого. Теперь, чтобы узнать, что на самом деле делает эта тема ...
scipilot

1

Mysql имеет несколько процессов (потоков), работающих независимо, например, один отвечает за запись данных из памяти на диск. При наличии нескольких ядер в ЦП (и / или нескольких ЦП) работает более одного потока, и поэтому он может работать более чем на 100% одного ядра - на упрощенном уровне, возможно, работает 75% каждого из двух ядер , давая 150%.


1

Я заметил проблему, не связанную с процессором. Если вы используете apache и MySQL на одном сервере, вы можете достичь плохих условий ( ОЗУ ), когда ваша активность apache возрастет.

MySQLTunner сообщает вам, что, используя 200 доступных подключений (ваш максимальный параметр подключения), вы будете заполнять оперативную память. Допустим, у вас ограничен процесс Apache до 150, и вам наверняка не хватит оперативной памяти, когда MySQL и apache попытаются использовать 150 соединений (поскольку Apache также является хорошим потребителем ОЗУ).

Так что речь идет об оперативной памяти, и вы, возможно, еще не нажали :-) Верхние команды показывают только 15 процессов Apache (но вы загружаетесь в среднем 3/6/16, так что это означает, что шторм был 15 минут назад и сейчас в оставляя).

Что касается проблемы с процессором, чтобы дополнить хороший ответ shakalandy , это может быть из-за одного запроса. Это может быть огромная таблица, выполнение множества заданий по переиндексации, использование большого количества временных файлов, отсутствие индекса (удаление?) И т. Д. Единственный способ обнаружить его - активировать журнал медленных запросов (может быть, с высоким порогом, как 8s). Затем используйте инструмент mysqlsla для анализа этого медленного журнала запросов и выполните некоторые объяснения по идентифицированным запросам.


Спасибо, действительно, MySQL не единственный процесс вокруг :)
Темновит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.