Есть достаточно нагруженный веб-сервер (порядка 200к уников в сутки, несколько интернет магазинов на одной платформе) со связкой указанной в сабже.
Никаких других функций кроме веб-сервера он не несет, статика и БД стоят на отдельных серверах. Со своей нагрузкой он вполне себе справляется, используется 10-12Гб оперативки из 16 в часы пик, оба процессора справляются. Но порядка месяца назад нас настигла беда: в определенные, не связанные между собой промежутки времени, количество php процессов за пару минут достигает тысячи, память кончается и сервер клеит ласты. Помогает только убийство всех висящих процессов, после этого сервер продолжает работать в нормальном режиме.
Так как все это длится уже месяц (а сервер падает несколько раз на дню) мы планомерно пробовали:
— оптимизировали mysql запросы
— стоящий на сервере apache заменили nginx+php-fpm
— унесли БД сервер на другую машину чтобы освободить память — увеличили разрешенное количество процессов в 10 раз, сейчас на момент падения mysql процесслист практически пустой, запросов дольше 1-2 секунд не висит
— залогировали из php все исходящие запросы на внешние сервисы, которые делаются из php и могут ждать их (в CMS для этого используется одна функция) — в момент падений никакой особой активности нет
— включили дебаг nginx'a, ошибок нет
— обновили ПО до последних стейбл версий
— замониторили в cacti все что можно — кроме того что взлетает количество процессов и кончается память ничего особенного
Я иссяк. Проблема может быть как с сервером так и со скриптами. Может PHP скрипты где то зацикливаются? Что посоветуете, как дебажить проблему?
Чтобы PHP процессы под нагрузкой не плодились как грибы, нужно органичить их количество. Кому процесса сейчас не хватило — тупо стоят в nginx очереди.
В противном случае ваш сервер можно будет положить тупым «зажать F5» + более менее приличный канал.
Если у вас не используется кэширующий механизм, и не прописаны ограничивающие iptables — попробуйте на главной странице в браузере зажать F5, и посмотреть htop на сервере. Узнаете много интересного :)
Уход с Apache на Nginx это ещё не решение проблемы — вы просто уменьшили количество сожранной памяти на процесс, а не объём суммарной памяти.
P.S. Сервер умирает тогда, когда оперативная память на процессы заканчивается, и начинает пилиться своп — тогда «вода поступает в трюм быстрее, чем вы ее успеваете вычерпывать».
Если я правильно понял, то xdebug выводит данные отладки сразу, а проблемы обычсно во время отладки скриптов нет, они вешаются в определенный момент. Вот скидал бы он данные куда-нибудь в базу, чтобы после падения поанализировать. Ну и проблема производительности при включенном xdebug на продакшене тоже актуальна конечно
Ну, думаю денек можно и посидеть под повышенной нагрузкой, чтоб потом ничего уже не падало. Ну а данные — они ж в файл пишутся. См xdebug.profiler_output_dir. Их проанализировать можно потом.