В последние дни сервер mysql на моем vps начинает давать сбой, иногда сразу после перезапуска. Я обнаружил эту проблему на сайте WordPress. После service mysql start
многие процессы apache2 перегружают память и процессор. Это скриншот сверху.
Я не нашел ничего полезного в журналах apache, журнал ошибок mysql показывает сообщения о нехватке памяти:
140922 12:24:43 [Note] Plugin 'FEDERATED' is disabled.
140922 12:24:43 InnoDB: The InnoDB memory heap is disabled
140922 12:24:43 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140922 12:24:43 InnoDB: Compressed tables use zlib 1.2.8
140922 12:24:43 InnoDB: Using Linux native AIO
140922 12:24:43 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
140922 12:24:43 InnoDB: Completed initialization of buffer pool
140922 12:24:43 InnoDB: Fatal error: cannot allocate memory for the buffer pool
140922 12:24:43 [ERROR] Plugin 'InnoDB' init function returned error.
140922 12:24:43 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140922 12:24:43 [ERROR] Unknown/unsupported storage engine: InnoDB
140922 12:24:43 [ERROR] Aborting
140922 12:24:43 [Note] /usr/sbin/mysqld: Shutdown complete
Сначала я подумал, что может быть проблема в db, и проверил базу данных с помощью mysqlcheck --all-databases
но все в порядке, я попытался сбросить и создать новую базу данных, не повезло.
Также я попытался удалить папку плагинов wordpress. Wordpress - последняя версия, комментарии отключены, 3 пользователя, мало посетителей (корпоративный блог).
Теперь я не знаю, где искать и как диагностировать проблему, mysql живет не более 10-20 секунд, если в apache включена конфигурация wordpress.
ОБНОВЛЕНИЕ: я удалил папку WP и загружаю новый WP без какой-либо конфигурации. Если wp site включен, vps начинает перегружаться, apache не может отвечать на запросы. Без включенного WP все работает гладко. Я пока не уничтожаю эту каплю, потому что хочу найти причину проблемы. Может это какой-то эксплоит в vps?
ОБНОВЛЕНИЕ 2: после поиска в журналах и netstat я обнаружил, что проблема возникает, когда:
По какой причине apache может перейти в состояние CLOSE_WAIT после фиктивного запроса отсутствующего файла?
Похоже, у вас просто закончилась оперативная память, поскольку возникает ошибка cannot allocate memory for the buffer pool
.
Ваши варианты:
Только ваш apache использует всю память, которую ваша система может себе позволить. Нет места для вашего mysql. Вы захотите настроить параметры apache, чтобы он потреблял меньше памяти. Наибольшее влияние должно оказать уменьшение критериев максимального количества детей в настройках apache. Используя ваш самый большой экземпляр apache в качестве примера, кажется, что вы можете позволить себе максимум 14 дочерних элементов, прежде чем система выйдет из строя из-за отсутствия оперативной памяти, которая составляет ~ 34 МБ.
Если ожидается, что каждый из ваших apache, например, займет до 30 МБ, и у вас есть 128 МБ для базы данных и еще 128 МБ для ОС, мы могли бы сделать очень упрощенную математику. 512 (всего) - 128 (db) - 128 (os) оставит 256 для apache. 30 МБ каждый означает, что вы можете позволить себе только 8 детей apache. Хотя их больше, на верхнем скриншоте видно как минимум 22 ребенка.
512 МБ - это небольшой объем для работы сайта, вам нужно будет проделать большую настройку, чтобы оптимизировать имеющийся у вас маленький барабан. Кроме того, такой движок, как InnoDB, может не быть для вас хорошим решением, поскольку он сильно зависит от оперативной памяти. Другой движок, например myisam, может лучше удовлетворить ваши потребности.