Ich habe derzeit einen Apache2-Server mit mpm-prefork
und mod_php
auf einem OpenVZ-VPS mit 512 MB realem / 1024 MB Burstable RAM (kein Swap). Nachdem ich einige Tests ausgeführt hatte, stellte ich fest, dass die maximale Prozessgröße, die Apache erhält, 23 MaxClients
MB beträgt. Daher habe ich 25 festgelegt (23 MB x 25 = 575 MB, für mich in Ordnung). Ich beschloss, einige Auslastungstests auf meinem Server durchzuführen, und die Ergebnisse ließen mich verwirrt.
Ich verwende ab
auf meinem Desktop-Computer die Anforderung der Hauptseite von einem WordPress-Blog.
Wenn ich ab
mit 24 gleichzeitigen Verbindungen arbeite, scheint alles in Ordnung zu sein. Sicher, die CPU steigt, der freie Arbeitsspeicher sinkt und das Ergebnis ist eine Antwortzeit von ca. 2-3 Sekunden pro Anforderung.
Wenn ich jedoch ab
mit 25 gleichzeitigen Verbindungen (meinem Serverlimit) arbeite, bleibt Apache nach ein paar Sekunden hängen. Es beginnt mit der Verarbeitung der Anforderungen, reagiert dann nicht mehr, die CPU kehrt zu 100% in den Leerlauf zurück und ab
läuft ab. Das Apache-Protokoll gibt an, dass es erreicht wurde MaxClients
.
In diesem Fall hält sich Apache mit 25 laufenden Prozessen auf dem Laufenden (sie sind alle in "W", wenn ich den Serverstatus überprüfe) und erst nach der TimeOut
Einstellung beginnen die Prozesse zu sterben und der Server reagiert erneut (in meinem Fall ist er festgelegt bis 45).
Meine Frage: Ist das erwartetes Verhalten? Warum stirbt Apache nur, wenn es erreicht MaxClients
? Wenn es mit 24 Verbindungen funktioniert, sollte es nicht mit 25 funktionieren. Nehmen Sie sich vielleicht mehr Zeit, um auf jede Anfrage zu antworten und den Rest in die Warteschlange zu stellen.
Es klingt für mich etwas seltsam, dass jedes laufende Kind ab
einen Webserver alleine töten kann, indem es die gleichzeitigen Verbindungen zu den Servern herstellt MaxClients
.
quelle
Was hier passiert, ist, dass Sie 25 Threads haben, die Verbindungen akzeptieren können, und Sie senden 26 gleichzeitige Anfragen. Diese letzte Anforderung befindet sich in der Socket-Warteschlange, abhängig von der Größe Ihres Backlogs.
Das zweite Problem ist, dass alles, was Sie ausführen, was 2-3 Sekunden dauert, lange genug dauert, um zu reagieren, dass die 25 gleichzeitigen Verbindungen es verlangsamen. sleep (1) funktioniert möglicherweise, aber wenn Sie eine Dateisperre oder eine Tabellensperre über MySQL ausführen, wartet jede parallele Anforderung möglicherweise auf den vorherigen Zeitpunkt, bis sie das 45-Sekunden-Timeout erreicht hat.
23 MB klingen für einen Apache-Prozess mit mod_php und allen geladenen Modulen klein. Ich vermute also, dass diese Apache-Prozesse möglicherweise etwas mehr RAM benötigen, während Ihre Anwendung ausgeführt wird. Mit MaxClients und so einem Speicher kann man nicht wirklich rechnen ... es wird etwas eng, aber man weiß es nie.
Es gibt eine Maschine, 56M- und 49M-Prozesse.
eine andere Maschine:
eine andere Maschine:
Die Speichernutzung hängt also stark von der Aufgabe ab, welche Module geladen werden usw. Bei den letzten beiden glaube ich, dass wir pdo & pdo_mysql deaktiviert haben, da diese Anwendung sie nicht verwendet.
Die eigentliche Frage ist, was machst du, das dauert 3 Sekunden? In der heutigen Welt ist dies eine Ewigkeit und wird als "blockierende" Anwendung angesehen. Apache stirbt normalerweise nicht, belässt diese Threads jedoch in der Backlog-Warteschlange, bis sie bedient werden können oder die Wartezeit abgelaufen ist. Ich glaube, Ihre Anwendung führt wahrscheinlich zu einer Zeitüberschreitung bei Apache. Probieren Sie es auf einer Seite aus, die nur phpinfo () enthält. und sehen Sie, ob die Ergebnisse gleich sind.
quelle