php-fpm вызывает oom-killer
Я вижу проблему, когда PHP-FPM работает отлично в течение нескольких дней, а затем решает заполнить всю память + подкачку и вызвать OOM-Killer. После того, как это произойдет, сервер будет полностью мертв, и вы уже не сможете подключиться к нему по SSH. Должен произойти жесткий перезапуск, чтобы привести вещи в норму.
Мне интересно, почему это происходит и есть ли исправление или обходной путь, такой как ограничение объема памяти, которое он может использовать, или перезапуск процесса, если он начинает использовать слишком много.
Последние несколько раз я записывал дампы ядра.
Мой php-fpm.conf
Мой www.conf:
Дайте мне знать, если есть что-то еще, что я могу дать вам для получения дополнительной информации о том, почему это может происходить.
3 ответа
Вокруг ООМ много полезной информации. Если вы хотите понять, что происходит, я рекомендую поискать его по ключевым словам, подобным этому
У меня это было однажды в проекте клиента, и я должен был позаботиться об этом. К сожалению, ничего из рекомендованного выше не помогло, так как это связано с ядром. OOM - это грязный обходной путь для чрезмерной загрузки памяти в Linux.
Что помогло (мне) было установить некоторые параметры ядра, которые полностью избегают OOM. Чтобы исправить это, добавьте следующие строки в /etc/sysctl.conf
сделать изменения постоянными при загрузке:
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
Тем не менее, я бы порекомендовал прочитать о ООМ. Вы можете найти более полезную информацию об этом.
Попробуйте уменьшить pm.max_requests до более низких значений (1000). Кроме того, у вас есть высокие значения pm.start_servers, pm.start_servers, pm.max_spare_servers и чрезвычайно высокие значения pm.max_children
Возможно, вам потребуется выяснить, вызвано ли выделение всей памяти одним необычным запросом (в этом случае вам придется исправить код), или это является результатом прогрессирующей утечки памяти. В последнем случае вы можете уменьшить max_requests
параметр для перезапуска PHP-FPM детей чаще.
Если вы не можете исправить проблему в коде, возможно, вам придется использовать грязный хак. Например, напишите скрипт, который будет отслеживать потребление памяти PHP и перезапускать его.
Есть также способ ограничить потребление памяти для данного процесса (как описано здесь или здесь), но у меня не было возможности протестировать его.