php-fpm вызывает oom-killer

Я вижу проблему, когда PHP-FPM работает отлично в течение нескольких дней, а затем решает заполнить всю память + подкачку и вызвать OOM-Killer. После того, как это произойдет, сервер будет полностью мертв, и вы уже не сможете подключиться к нему по SSH. Должен произойти жесткий перезапуск, чтобы привести вещи в норму.

Мне интересно, почему это происходит и есть ли исправление или обходной путь, такой как ограничение объема памяти, которое он может использовать, или перезапуск процесса, если он начинает использовать слишком много.

Последние несколько раз я записывал дампы ядра.

  1. http://pastebin.com/raw.php?i=rX6jYDe0
  2. http://pastebin.com/raw.php?i=f2qx5GcS

Мой php-fpm.conf

  1. http://pastebin.com/raw.php?i=27hvN27q

Мой www.conf:

  1. http://pastebin.com/raw.php?i=VgYtut9j

Дайте мне знать, если есть что-то еще, что я могу дать вам для получения дополнительной информации о том, почему это может происходить.

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 и перезапускать его.

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

Другие вопросы по тегам