Назад | Перейти на главную страницу

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

У нас в Великобритании образовательная платформа для начальных школ, и она работает очень хорошо. Однако примерно в 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, однако проблема возникает примерно в 16:00. Мне удалось сбежать 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

Это повторяется бесконечно и никогда не останавливается, пока вы не SEGKILL или oomkiller не убьет его. В то время не запланировано выполнение заданий cron, и у меня нет возможности точно узнать, какой запрос Nginx связан с запущенным процессом PHP.

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

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

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

Спасибо!

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

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

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