Moja konfiguracja: mam 3 prawie identyczne maszyny do serwerów WWW obsługujące tę samą, wysoko obciążoną dynamiczną stronę internetową z prostym równoważeniem obciążenia przez dns. Usługa działa od ponad dwóch lat z tą samą konfiguracją apache: apache2, php5, ubuntu 8.04 linux 2.6.24-29-server.
Mój problem: od około dwóch tygodni temu mam problemy z tą konfiguracją. Niemal każdego dnia mam jedną krótką chwilę przez około 5 minut, w której strona jest niedostępna. Nadal jestem w stanie zalogować się do serwerów przez ssh. Po uruchomieniu htop
widzę, że maszyna nic nie robi. Mam uruchomionych około 1000 procesów Apache, ale nie mam żadnej aktywności procesora.
Użyłem apache mod_status do debugowania tej sytuacji. Tabela wyników procesu wygląda następująco:
_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K
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
Większość procesów tylko czeka na połączenie. po około 5 minutach sytuacja wróci do normy: na każdym komputerze mam dużo mniej procesów, najwięcej pracowników ma status „.” (co oznacza, że są otwarci na przetworzenie żądania) i oczywiście strona jest dostępna!
więc próbuję znaleźć coś w dziennikach, ale po prostu nie ma nic ... dziennik dostępu apache milczy przez około 4 minuty, to samo dotyczy dziennika błędów. Nie mogę też znaleźć niczego złego w innych logach systemowych.
sytuacja jest taka sama na wszystkich 3 serwerach WWW (wszystkie mają ten szczyt obciążenia i stan braku odpowiedzi w tym samym czasie), więc nie sądzę, że jest to związane ze sprzętem. ale myślę, że może to być związane z jakimś problemem z siecią (TCP).
jakieś pomysły?
EDYCJA: kilka dodatkowych informacji, które właśnie odkryłem:
To się powtórzyło i byłem w stanie zweryfikować, że nie jestem w stanie połączyć się lokalnie, gdy wystąpi ten problem.
Po tym, jak to się stało, utworzyłem statystyki połączeń za pomocą następującego polecenia: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
- 109 CLOSE_WAIT
- 2652 USTANOWIONO
- 2 FIN_WAIT1
- 11 LAST_ACK
- 12 POSŁUCHAJ
- 91 SYN_RECV
- 1 SYN_SENT
- 16 TIME_WAIT
Jeśli jakiś czas później wykonam to samo polecenie, mam coś takiego:
- 4 ZAMYKANIE
- 108 USTANOWIONO
- 18 FIN_WAIT1
- 182 FIN_WAIT2
- 37 LAST_ACK
- 12 POSŁUCHAJ
- 50 SYN_RECV
- 11276 TIME_WAIT
Więc w normalnej sytuacji mam tylko 100-200 otwartych połączeń przez klientów obsługiwanych przez apache w tym momencie. Kiedy mam tę „awarię”, mam o wiele więcej połączeń. Jak najlepiej to przeanalizować?
EDYCJA 2: ważne wiersze w apache2.conf to:
KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit 920
StartServers 30
MinSpareServers 80
MaxSpareServers 120
MaxClients 920
MaxRequestsPerChild 700
</IfModule>
Jest to prefork apache2 z php_mod.
Serwer ma 8 GB pamięci RAM i partycję wymiany 4 GB.
tcpdump
) pomoże ci dotrzeć do źródła problemu ... btw jakie jest użycie pamięci i zasady zapory?