Ich möchte einige Serverleistungsprobleme verstehen, die bei einem (für uns) stark ausgelasteten Webserver auftreten. Die Umgebung ist wie folgt:
- Debian Lenny (alle stabilen Pakete + auf Sicherheitsupdates gepatcht)
- Apache 2.2.9
- PHP 5.2.6
- Große Amazon EC2-Instanz
Das Verhalten, das wir beobachten, ist, dass sich das Web in der Regel reaktionsschnell anfühlt, jedoch mit einer leichten Verzögerung, um eine Anfrage zu bearbeiten - manchmal in Bruchteilen von Sekunden, manchmal 2-3 Sekunden in unseren Hauptnutzungszeiten. Die tatsächliche Auslastung des Servers wird als sehr hoch gemeldet - häufig als 10.xx oder 20.xx, wie von gemeldet top
. Außerdem ist das Ausführen anderer Dinge auf dem Server während dieser (geraden vi
) Zeiten sehr langsam, sodass die Last auf jeden Fall dort oben ist. Seltsamerweise bleibt Apache sehr reaktionsschnell, abgesehen von dieser anfänglichen Verzögerung.
Wir haben Apache unter Verwendung von Prefork wie folgt konfiguriert:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
Und KeepAlive als:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
Wenn wir uns die Serverstatus-Seite ansehen, treffen wir selbst in Zeiten hoher Auslastung selten die Client-Obergrenze. In der Regel werden zwischen 80 und 100 Anfragen und viele Anfragen im Keepalive-Status bearbeitet. Das sagt mir, dass ich die anfängliche Langsamkeit der Anfrage als "Warten auf einen Handler" ausschließen soll, aber ich kann mich irren.
Die CloudWatch-Überwachung von Amazon zeigt mir, dass die CPU-Auslastung unserer Instanz auch bei einem Betriebssystem mit einer Auslastung von> 15 zwischen 75 und 80% liegt.
Beispielausgabe von top
:
top - 15:47:06 up 31 days, 1:38, 8 users, load average: 11.46, 7.10, 6.56
Tasks: 221 total, 28 running, 193 sleeping, 0 stopped, 0 zombie
Cpu(s): 66.9%us, 22.1%sy, 0.0%ni, 2.6%id, 3.1%wa, 0.0%hi, 0.7%si, 4.5%st
Mem: 7871900k total, 7850624k used, 21276k free, 68728k buffers
Swap: 0k total, 0k used, 0k free, 3750664k cached
Die Mehrzahl der Prozesse sieht folgendermaßen aus:
24720 www-data 15 0 202m 26m 4412 S 9 0.3 0:02.97 apache2
24530 www-data 15 0 212m 35m 4544 S 7 0.5 0:03.05 apache2
24846 www-data 15 0 209m 33m 4420 S 7 0.4 0:01.03 apache2
24083 www-data 15 0 211m 35m 4484 S 7 0.5 0:07.14 apache2
24615 www-data 15 0 212m 35m 4404 S 7 0.5 0:02.89 apache2
Beispielausgabe vmstat
zur gleichen Zeit wie oben:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
8 0 0 215084 68908 3774864 0 0 154 228 5 7 32 12 42 9
6 21 0 198948 68936 3775740 0 0 676 2363 4022 1047 56 16 9 15
23 0 0 169460 68936 3776356 0 0 432 1372 3762 835 76 21 0 0
23 1 0 140412 68936 3776648 0 0 280 0 3157 827 70 25 0 0
20 1 0 115892 68936 3776792 0 0 188 8 2802 532 68 24 0 0
6 1 0 133368 68936 3777780 0 0 752 71 3501 878 67 29 0 1
0 1 0 146656 68944 3778064 0 0 308 2052 3312 850 38 17 19 24
2 0 0 202104 68952 3778140 0 0 28 90 2617 700 44 13 33 5
9 0 0 188960 68956 3778200 0 0 8 0 2226 475 59 17 6 2
3 0 0 166364 68956 3778252 0 0 0 21 2288 386 65 19 1 0
Und schließlich die Ausgabe von Apache server-status
:
Server uptime: 31 days 2 hours 18 minutes 31 seconds
Total accesses: 60102946 - Total Traffic: 974.5 GB
CPU Usage: u209.62 s75.19 cu0 cs0 - .0106% CPU load
22.4 requests/sec - 380.3 kB/second - 17.0 kB/request
107 requests currently being processed, 6 idle workers
C.KKKW..KWWKKWKW.KKKCKK..KKK.KKKK.KK._WK.K.K.KKKKK.K.R.KK..C.C.K
K.C.K..WK_K..KKW_CK.WK..W.KKKWKCKCKW.W_KKKKK.KKWKKKW._KKK.CKK...
KK_KWKKKWKCKCWKK.KKKCK..........................................
................................................................
Aus meiner begrenzten Erfahrung ziehe ich folgende Schlussfolgerungen / Fragen:
Möglicherweise lassen wir viel zu viele
KeepAlive
Anfragen zuIch sehe einige Zeit damit zugebracht, auf E / A in der vmstat zu warten, obwohl dies nicht konsequent und nicht sehr häufig ist (glaube ich?), Daher bin ich mir nicht sicher, ob dies ein großes Problem ist oder nicht. Ich habe weniger Erfahrung mit vmstat
Außerdem sehe ich in vmstat in einigen Iterationen eine Reihe von Prozessen, die darauf warten, bedient zu werden, was ich der anfänglichen Verzögerung beim Laden der Seite auf unserem Webserver zuschreibe, möglicherweise fälschlicherweise
Wir stellen eine Mischung aus statischem Inhalt (75% oder höher) und Skriptinhalt bereit. Der Skriptinhalt ist häufig recht rechenintensiv. Daher ist es wichtig, die richtige Balance zwischen beiden zu finden. Langfristig wollen wir die Statik an einen anderen Ort verschieben, um beide Server zu optimieren, aber unsere Software ist heute noch nicht dazu bereit
Wenn jemand eine Idee hat, gebe ich gerne zusätzliche Informationen. Der andere Hinweis ist, dass es sich um eine Produktionsinstallation mit hoher Verfügbarkeit handelt. Daher bin ich vorsichtig, wenn ich nach und nach Änderungen vornehme, und deswegen habe ich selbst nicht mit Dingen wie dem KeepAlive
Wert gespielt noch.