PHP загружает 100% CPU и ест оперативную память одновременно с понедельника по пятницу

Здесь, в Великобритании, у нас есть учебная платформа для начальных школ, и все это работает очень хорошо. Однако примерно в 16:00 с понедельника по пятницу возникает та же проблема: 1-2 потока PHP будут загружаться до 100% ЦП и постепенно начнут потреблять ОЗУ, пока сервер не перестанет работать.

98% + наших запросов - HTTPS, они поступают в наш балансировщик нагрузки уровня 7, который затем расшифровывает данные SSL, добавляет X-HTTP-Forwarded-For заголовок и перенаправляет данные на сервер приложений (у нас их 2 на данный момент) на порт 80. Наши серверы приложений имеют Varnish на порт 80, который принимает запрос от балансировщика нагрузки и передает запрос в Nginx через порт 81 Затем Nginx определяет, какой vhost ему нужно использовать, и передает любую обработку PHP в PHP-CGI, который прослушивает сокет (управляется через spawn-fcgi). Также работает экземпляр Memcached, MySQL работает на отдельном сервере / ведомом устройстве.

В течение дня нагрузка на любом из серверов приложений будет обычно не выше 0,8, однако около 4 часов вечера наша проблема возникает. Мне удалось бежать strace на нескольких реальных потоках, когда они вызывают проблему, и я всегда вижу одно и то же:

stat("/usr/share/zoneinfo/Europe/London", {st_mode=S_IFREG|0644,st_size=3661, ...}) = 0
stat("/usr/share/zoneinfo/Europe/London", {st_mode=S_IFREG|0644,st_size=3661, ...}) = 0

Это повторяется бесконечно и никогда не останавливается до тех пор, пока вы НЕ ОТКАЖЕТЕ процесс или не убьете его. На данный момент не запланировано выполнение заданий cron, и у меня нет никакого способа точно определить, какой запрос Nginx связан с выполняющимся процессом PHP.

Мы используем PHP 5.3.14, который мы обновили до версии 5.3.8 на прошлой неделе, чтобы исключить проблему с более старой версией. Эта проблема продолжается уже несколько месяцев, и мы понятия не имеем, что ее вызывает. Мы внедряем наше программное обеспечение очень часто, поэтому сложно отследить конкретный выпуск, который мог вызвать проблему - тем более, что мы не знаем дату первого появления этой проблемы. Varnish - это версия 3.0.1, Nginx - 1.0.6 (насколько я понимаю, ей около года), наши серверы работают под управлением CentOS версии 5.7 (Final), у них Intel i3 540 с тактовой частотой 3,07 ГГц и 8 ГБ оперативной памяти.

В списке рассылки Debian есть обсуждение чего-то очень похожего, вы можете найти это здесь.

Кто-нибудь видел что-то подобное в прошлом, есть ли у кого-нибудь идеи или предложения? Есть ли способ связать запрос Nginx напрямую с потоком PHP? Есть ли лучший способ увидеть, что делает процесс PHP? (Я видел упомянутый GDB, хотя мне придется перекомпилировать PHP)

Спасибо!

2 ответа

Я выяснил, в чем проблема, это был Internet Explorer. В нашем CSS-файле была неправильная ссылка на файл.htc, который по какой-то причине отправлялся в PHP для обработки. PHP не знал, что делать с файлом.htc, и просто сошел с ума и использовал все доступные ресурсы на сервере.

С дополнительной информацией из комментария, я думаю, мы можем с уверенностью предположить, что проблема возникает во время скачка нагрузки - количество ежедневных пиковых значений онлайн-пользователей. Не существует точного точного времени, иногда это происходит в другое время, а в другие дни эффективно исключаются такие вещи, как использование ресурсов cron.

Это может показаться странным, но начните с увеличения максимального количества подключений MySQL - я видел странные вещи, происходящие с PHP, работающим как FCGI, когда превышено ограничение подключения, мало чем отличающееся от проблемы, с которой вы столкнулись.

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