Как дебажить залипания в связке nginx+php-fpm?

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

Никаких других функций кроме веб-сервера он не несет, статика и БД стоят на отдельных серверах. Со своей нагрузкой он вполне себе справляется, используется 10-12Гб оперативки из 16 в часы пик, оба процессора справляются. Но порядка месяца назад нас настигла беда: в определенные, не связанные между собой промежутки времени, количество php процессов за пару минут достигает тысячи, память кончается и сервер клеит ласты. Помогает только убийство всех висящих процессов, после этого сервер продолжает работать в нормальном режиме.



Так как все это длится уже месяц (а сервер падает несколько раз на дню) мы планомерно пробовали:

— оптимизировали mysql запросы

— стоящий на сервере apache заменили nginx+php-fpm

— унесли БД сервер на другую машину чтобы освободить память — увеличили разрешенное количество процессов в 10 раз, сейчас на момент падения mysql процесслист практически пустой, запросов дольше 1-2 секунд не висит

— залогировали из php все исходящие запросы на внешние сервисы, которые делаются из php и могут ждать их (в CMS для этого используется одна функция) — в момент падений никакой особой активности нет

— включили дебаг nginx'a, ошибок нет

— обновили ПО до последних стейбл версий

— замониторили в cacti все что можно — кроме того что взлетает количество процессов и кончается память ничего особенного



Я иссяк. Проблема может быть как с сервером так и со скриптами. Может PHP скрипты где то зацикливаются? Что посоветуете, как дебажить проблему?
  • Вопрос задан
  • 6100 просмотров
Пригласить эксперта
Ответы на вопрос 3
homm
@homm
Вы логи смотрели, что в этот момент происходит? Кто-то элементарно запускает
ab -n 10000 -c 2000 host.com/

Что бы не кончалась память меняем в /etc/php5/fpm/pool.d/www.conf pm = dynamic на pm = static и pm.max_children = 30.

В момент зависания у наплодившихся fpm-воркеров есть активность по процессору?
Ответ написан
Комментировать
Чтобы PHP процессы под нагрузкой не плодились как грибы, нужно органичить их количество. Кому процесса сейчас не хватило — тупо стоят в nginx очереди.

В противном случае ваш сервер можно будет положить тупым «зажать F5» + более менее приличный канал.

Если у вас не используется кэширующий механизм, и не прописаны ограничивающие iptables — попробуйте на главной странице в браузере зажать F5, и посмотреть htop на сервере. Узнаете много интересного :)

Уход с Apache на Nginx это ещё не решение проблемы — вы просто уменьшили количество сожранной памяти на процесс, а не объём суммарной памяти.

P.S. Сервер умирает тогда, когда оперативная память на процессы заканчивается, и начинает пилиться своп — тогда «вода поступает в трюм быстрее, чем вы ее успеваете вычерпывать».
Ответ написан
Комментировать
Evengard
@Evengard
Вам бы покрутить бы ваши скрипты под профайлером каким нибудь. xdebug.org/docs/profiler — типа такого, или ещё какого.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы