Я столкнулся с проблемой в последние несколько дней, у меня есть сервер базы данных с двумя четырехъядерными процессорами и 24 ГБ оперативной памяти, недавно мы столкнулись с большой проблемой: сервер работает нормально с частотой процессора около 130%, тогда он будет просто случайным образом увеличиваться до 750% почти полностью исчерпали все ядра, и это доводит наш сайт до состояния суперсканирования. Я перезапустил процесс mysql, и он разрешил его, а через 10 минут это повторилось. В последний раз, когда это произошло, я оставил его на уровне 750%, а через несколько минут он снова опустился. Я сделал дамп процесса, когда это происходило, и у него в очереди около 4000 запросов, в которых говорится о копировании / отправке в таблицу tmp.
Если кто-то знает об этой проблеме или является экспертом по базам данных mysql innodb и php, дайте мне знать, что я даже готов заплатить за это исправление, цена не является проблемой, просто хочу, чтобы проблема была решена.
Не перезапускайте MySQL просто так. Обычно это совсем не помогает - неприятный запрос или ситуация вернутся рано или поздно, и после перезапуска MySQL все равно нужно разогреться. Перезапуск очистит кеши и так далее.
Я подозреваю, что это происходит из-за того, что на вашем веб-сайте происходит какая-то ненормальная активность (например, DoS-атака или эффект Slashdot / Reddit), или, возможно, недавнее обновление включало новую причудливую ошибку, убивающую базу данных. Проверьте свои журналы http или, чтобы получить более визуальное представление, запустите журналы Apache через Webalizer или аналогичную программу.
Если ваша проблема не связана с веб-активностью или вы хотите предотвратить подобные проблемы в будущем, типичные ситуации для вышеописанных шипов:
Неоптимально настроенный my.cnf - вы настроили настройки InnoDB? Можем ли мы взглянуть на ваш my.cnf?
Отсутствуют индексы в часто используемой таблице.
Тип таблицы как MyISAM, а затем несколько длительных операций SELECT в сочетании с большим количеством операций UPDATE / INSERT / DELETE приводят к огромным очередям запросов. На самом деле это то, что я думаю, может быть вашей проблемой: вы АБСОЛЮТНО уверены, что ваши таблицы находятся в формате InnoDB, и эта таблица не случайно (или даже намеренно) находится в MyISAM?
Слишком маленький tmp_table_size
значение в my.cnf; это может быть ситуация, если ваша база данных выполняет запросы с множеством сортов, большими наборами результатов или аналогичными. Слишком маленький размер tmp_table_size приводит к ситуации, когда MySQL создает таблицу tmp, необходимую для запроса на жесткий диск, вместо того, чтобы сохранять ее в ОЗУ. Для одного запроса это не так уж и плохо, но если многие запросы делают это одновременно, производительность вашего жесткого диска будет большим узким местом. Я подозреваю, что это еще одна вещь, которая может вызвать у вас проблемы на данный момент.
Базы данных расположены в SAN или другом хранилище, и по какой-либо причине сама SAN тормозит; может быть, какой-то другой сервер активно его использует.
Файловая система и / или лифт ввода-вывода убивают производительность. Например, если у вас есть типичный дистрибутив Linux, в настоящее время он поставляется вместе с CFQ как лифт ввода / вывода по умолчанию. Это может быть далеко не оптимальным для использования базы данных - крайний срок или упреждающий намного лучше для этого, я обычно использую крайний срок. Я могу рассказать вам, как проверить и / или изменить текущий лифт ввода-вывода, если вы сомневаетесь - операция безопасна и может быть выполнена онлайн. Когда дело доходит до файловых систем, ext3 может быть не самой производительной с огромными файлами базы данных, особенно при высоком уровне параллелизма.
А потом несколько вопросов к вам:
Если это InnoDB, что делает SHOW GLOBAL INNODB STATUS
скажите во время всплесков?
Огромны ли таблицы, которые нужны вашему веб-сайту? Мы говорим о тысячах строк, миллионах строк ...? И с точки зрения хранения, они занимают много места на диске?
Какую операционную систему вы используете? А что такое файловая система? Настроена ли вообще файловая система? Базы данных находятся на локальных дисках или в каком-то общем хранилище, например SAN?
У вас 24 ГБ памяти, да. Но что значит free
докладывать вам во время всплесков?
Какой у вас веб-сайт? Легко ли он кэшируется (например, новостной сайт, содержание которого меняется относительно редко) или сверхдинамичный сайт, подобный Facebook?