nn4l wrote:@øxygen:
verwendest Du Apache 1.3 oder 2.0?
Falls 1.3, dann ist m.E. dein MaxClients Setting ziemlich hoch.
Wenn tatsächlich mal 100 Clients gleichzeitig zugreifen, hast Du 100 Apache Prozesse gleichzeitig laufen. Jeder httpd braucht wenigstens 3 MByte RAM, meistens mehr (bei mir ca. 15 MByte, wegen eines großen PHP CMS und mod_php). Also allokierst du zu diesem Zeitpunkt dann etwa 300 MByte RAM.
Auf Server von dem der Auszug stammt setzte ich 1.3 ein, jedoch vergass ich zu erwähnen das der Server 512 MB Ram hat. Jedoch finde ich 15 MB pro Prozess ist sehr hoch. Meine httpds brauchen knapp 5 MB, und ich setzte auch mod_php und mehrere große Anwendungen ein (2x Woltlab Burning Board, 1x Invision Power Board, geeklog etc)
Auf deinem Server scheint das so gerade eben hinzuhauen, d.h. alle httpd-Prozesse brauchen nur wenig RAM, aber für viele andere User trifft das nicht zu.
Dann machen die wohl was falsch, keine Ahnung ;)
Auf meinem Server mit 256 MByte RAM kann ich maximal MaxClients 15 einstellen.
Ich bin auch der Meinung, KeepAliveTimeout 120 ist viel zu hoch, weil jeder httpd dann 120 Sekunden auf die nächste Aktion desselben Clients wartet und somit blockiert ist. D.h. kommt ein anderer User, muss ein neuer httpd gestartet werden. Setzt man KeepAliveTimeout deutlich niedriger (z.B. 5), können weniger httpds mehr Clients (nacheinander) bedienen. Probier doch mal, ob mit einem niedrigen Wert sich auch die ESTABLISHED connections verringern.
Da hast du recht, es werden weniger Childs gespawnt. Aber ist die Frage ob man das will. Die 2 Minuten haben sich als gute Zeitspanne herausgestellt, für User die die sich zügig durchklicken, liegt der Abstand zwischen 2 Anfragen deutlich darunter. Es wird also nicht dauern die Verbindung auf und abgebaut, was sich angenehm in der Geschwindigkeit niederschlägt. Ich habe mal die durchschnittliche Zeit zwischen zwei Zugriffen von Google beobachtet, die liegt zwischen 20-60 Sekunden, wäre also noch im Keepalive Bereich.
Leider hat das Keepalive keinen Einfluss da Google nur HTTP/1.0 benutzt. :(
@s20: das Problem ist der unmäßige RAM Verbrauch. Ich tippe mal auf Speicherleck oder einen Programmierfehler. Evtl. PHP als CGI laufen lassen, nicht als mod_php.
Am besten direkt Apache und PHP schlank neubauen.
Ich würd folgendes machen:
1. ulimit ins apachectl startscript aufnehmen, so dass jeder Apache Prozess sich sagen wir max. 20 MByte RAM genehmigen kann. Wenn ein User das überschreitet, kriegt er halt einen 500er Fehler. Sein Problem.
Naja. Ich würde die Maschine eher Swappen lassen, als User auszusperren...
2. MaxClients=10 (10 * 20 MByte + 56 MByte für MySQL und sonstiges sollte so gerade eben auf einem 256 MByte rootserver passen)
3. KeepAliveTimeout=5
Wenns hilft...
4. MaxRequestsPerChild=500 scheint sinnvoll. Es ist von der Performance her völlig egal, ob alle paar Minuten ein httpd beendet und neu gestartet wird, hilft aber gegen Speicherlecks.
So niedrig würde ich es dennoch nicht stellen. Besonders bei einer derart niedrigen Zahl an Childs. 2000 fände ich schon sinnvoller.