В последнее время, в некоторой степени совпадая с некоторыми обновлениями серверов (хотя было несколько изменений, которые были внесены), Apache начал заканчиваться тем, что некоторые из его процессов застревали в состоянии «запрос чтения». Каждый PID, который попадает в это состояние, занимает 100% ЦП и имеет очень мало, что согласуется с ним и другим зависшим процессом (согласно lsof) - у некоторых есть открытые соединения TCP / IP, у некоторых есть ожидающие, некоторые только слушают www.
Схема выглядит следующим образом:
Весь этот цикл длится от 30 минут до 4 часов, в зависимости от моей способности своевременно выполнить шаг 1.
server-status дает мне:
R_.__.K._K.._._...._........W...................................
................................................................
................................................................
................................................................
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request
0-0 24363 0/1/7 R 0.46 447 844 0.0 0.00 0.26 ? ? ..reading..
[followed by a bunch of entirely normal requests]
Конечно, ключевая информация, которая помогла бы мне отладить это, отсутствует в строке состояния сервера.
Мне не удалось отследить это ни к чему конкретному. Я пробовал lsof, netstat, просматривая журналы (хотя есть тонны журналов, которые нужно просмотреть. Ничего очевидного не обнаружилось). В сетевом трафике нет скачков, и сервер активно обслуживает множество случайных веб-сайтов, поэтому отслеживать входящие соединения сложно.
Первоначально это началось при устаревшей установке Lenny, поэтому я начал частичное обновление пакетов до Squeeze. Пока что никакие обновления не привели к тому, что это исчезло (хотя, к счастью, я получаю хорошее, свежее программное обеспечение!).
Помимо начала отлаживать сам Apache, есть ли еще что-то, что можно сделать, чтобы попытаться найти источник проблемы?
Подробности:
Debian Lenny / Squeeze (в основном Lenny. Некоторые компоненты обновлены до Squeeze), работающий в Linux 2.6.32-5-xen-amd64 на хосте Debian Squeeze Xen.
Предварительный форк Apache2 MPM (2.2.16-6 + squeeze7)
Модули: libapache2-mod-fastcgi, libapache2-mod-perl2, libapache2-mod-php5, libapache2-mod-python, libapache2-mod-scgi, libapache2-mod-wsgi, libapache2-modxslt, libapache2-svn
У меня такая же проблема на моем сервере под управлением CentOS 6.2. Я подозреваю, что это как-то связано с плавным перезапуском в рамках еженедельной ротации логов. Когда я настраиваю процесс httpd, который занимает 100% цикла ЦП, он зацикливается на чтении пустых строк из дескриптора канала (STDIN?). Итак, я предполагаю, что основная проблема заключается в том, что read () должен блокировать и не возвращать ноль все время, вызывая 100% загрузку ЦП.