Apache zawiesza się na „żądanie odczytu”, a PID zajmuje 100% procesora


Niedawno, częściowo pokrywając się z niektórymi aktualizacjami serwera (chociaż wprowadzono kilka zmian), Apache zaczął kończyć się tym, że niektóre jego procesy utknęły w stanie „żądania odczytu”. Każdy PID, który wejdzie w ten stan, zajmuje 100% procesora i ma bardzo mało, co jest z nim zgodne i kolejny zawieszony proces (zgodnie z lsof) - niektóre mają otwarte połączenia TCP/IP, inne oczekujące, niektóre tylko nasłuchują na www.
Schemat wygląda następująco:
  • zrestartuj apache
  • poczekaj chwilę (minuty)
  • otrzyma proces "żądania odczytu" zombie, procesor zacznie działać
  • przybywa więcej zombie, wszystko nie pokrywa się z niczym oczywistym
  • Obciążenie procesora osiąga 15-40 w zależności od tego, kiedy ostatnio to zauważyłem.
  • GOTO 1

Cały ten cykl trwa od 30 minut do 4 godzin, w zależności od mojej zdolności do wykonania kroku 1 w odpowiednim czasie.
status serwera daje mi:
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 processSrv 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]

Oczywiście na pasku stanu serwera brakuje kluczowych informacji, które pomogłyby mi w usuwaniu błędów.
Nie udało mi się wyśledzić tego do niczego konkretnego. Próbowałem lsof, netstat przeglądając dzienniki (chociaż jest mnóstwo dzienników do przejrzenia. Nic oczywistego nie wyszło). W ruchu sieciowym nie ma przeskoku, a serwer aktywnie obsługuje wiele losowych witryn internetowych, co utrudnia śledzenie połączeń przychodzących.
Początkowo rozpoczęło się to od starszej instalacji Lenny'ego, więc zacząłem częściową aktualizację pakietu do Squeeze. Jak dotąd żadne aktualizacje nie spowodowały, że to zniknęło (chociaż na szczęście dostaję dobre, świeże oprogramowanie!).
Poza początkiem

debuguj sam Apache
http://httpd.apache.org/dev/debugging.html, czy jest coś jeszcze, co można zrobić, aby spróbować znaleźć źródło problemu?
Detale:
Debian Lenny/Squeeze (głównie Lenny. Niektóre komponenty zostały zaktualizowane do Squeeze) z Linuksem 2.6.32-5-xen-amd64 na hoście Debian Squeeze Xen.
Pre-fork Apache2 MPM (2.2.16-6 + squeeze7)
Moduły: libapache2-mod-fastcgi, libapache2-mod-perl2, libapache2-mod-php5, libapache2-mod-python, libapache2-mod-scgi, libapache2-mod-wsgi, libapache2-modxslt, libapache2-svn
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Mam ten sam problem na moim serwerze z systemem CentOS 6.2. Podejrzewam, że ma to coś wspólnego z płynnym restartem w ramach tygodniowej rotacji dziennika. Kiedy konfiguruję proces httpd, który zajmuje 100% cyklu procesora, zapętla się on odczytując puste wiersze z deskryptora potoku (STDIN?). Domyślam się, że głównym problemem jest to, że read () musi blokować i nie zwracać przez cały czas zera, co powoduje 100% użycie procesora.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się