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

Процесс MySQL использует более 100% ЦП

У меня возникли проблемы с моим сервером 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:

В top команда:

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

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

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

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

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

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

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

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

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

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

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

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

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