Verstaändnisfrage MaxRequestsPerChild



Kato

Registered User
Mein Apache läuft im Moment wunderbar und die load ist recht gering.
Da dachte ich mir eine weitere Reduzierung mit MaxRequestsPerChild aus. Mehr Requests = weniger Serverprozesse = geringere Load. Und obwohl der Wert mit 1000 immer noch massivst unter der Voreinstellung von 10000 blieb, konnte ich zusehen, wie die Load anstieg. :confused:

Wieso ist das so und nicht so wie ich es gerne hätte?? :D:D
 
Die Direktive MaxRequestsPerChild bestimmt indirekt die Lebensdauer eines Worker-Prozesses, der für die Bearbeitung von Client-Anfragen zuständig ist: Nach der Verarbeitung der angegebenen Anzahl von Anfragen (beziehungsweise persistenten HTTP/1.1-Verbindungen) wird der Prozess beendet. Dies ermöglicht ein allmähliches Verringern der Prozessanzahl, wenn die Anfragelast nachlässt.
 
Diese Beschreibung, die ich natürlich kenne, ist zwar schön kopiert, aber sie erklärt die Auswirkung, die ich beschrieben habe nicht.

Vielleicht noch einmal mein Verständnis. Angenommen MaxRequestsPerChild ist bei 5000. Dann wird sozusagen alle 5000 Requests ein neuer Serverprozess gestartet und der alte stirbt. Wird der Wert auf 10000 gesetzt lebt ein Server Prozess doppelt solange, die Anzahl der Serverprozesse müsste sich reduzieren. Hier im theretischen Fall um die Hälfte. Weniger Serverproezesse müssten auch weniger Load bedeuten.

In meinem Fall findet genau das Gegenteil statt: Eine Erhöhung von MaxRequestsPerChild bringt auch eine Erhöhung der Load mit sich. Und das würde ich gerne verstehen weil die Wirkung rein theoretisch genau anders herum sein müsste.
 
In meinem Fall findet genau das Gegenteil statt: Eine Erhöhung von MaxRequestsPerChild bringt auch eine Erhöhung der Load mit sich. Und das würde ich gerne verstehen weil die Wirkung rein theoretisch genau anders herum sein müsste.

Von welcher Last reden wir denn?
Leider hat auch der Apache seine Probleme mit langen Laufzeiten weshalb man das ja auf eine bestimmte Anzahl von Requests reduziert.
Mit zunehmender Laufzeit sammelt sich auch ein wenig Datenmüll an.
Sprich der Prozess verbraucht etwas mehr RAM.
(Das Grabage Collection muss man halt auch in anderen Sprachen Konsequent umsetzen.*)
Mit dem zusätzlichen und ansteigenden Ballast wird auch die Rechenzeit / Verwaltung dessen aufwendiger.

Das ist offen gestanden eine vereinfachte Beschreibung des ganzen.

* sie begrenzt die Menge an Arbeitsspeicher, die ein Prozess durch (versehentliche) Speicherlecks verbrauchen kann.
* das Festlegen einer endlichen Lebensdauer von Prozessen hilft, die Anzahl von Prozessen zu reduzieren, wenn die Serverlast zurückgeht.


Memorylecks bekommt man damit nur bedingt in den Griff.
Aber ein schlechtes Garbage Collection ist häufig die Ursache für Memorylecks.
->Nein, das ist kein Widerspruch. Sondern unterschiedliche Ursachen, gleiches Problem und Auswirkung.
 
Last edited by a moderator:
Das ist offen gestanden eine vereinfachte Beschreibung des ganzen.

Aber es gibt mir eine Idee, was da noch so passiert.

Wir sprechen eher von einer "Last" als von einer Last und ich müsste den aufgetreten Effekt systematisch messen um es ganz genau zu haben. Allerdings hat mich die Beobachtung eben gewundert.
Als ich mir dir top-Werte angesehen hab idelte das System bei 0,07. Da dachte ich mir, ein bisschen was geht immer :D und passte die Werte etwas an und schlagartig ging es auf bis zu 0,63 hoch. Das beobachtete ich eine Weile, bis ich den Wert wieder zurücknahm und er prompt wieder auf 0,07-0,1 fiel.
Genauer habe ich das nicht untersucht. Mit ein bisschen Glück kamen da noch andere Faktoren hinzu, die genau in dieser halben Stunde, in der ich die Werte etwas genauer beobachtet haben, aufgetreten sind. Natürlich ist klar, dass immer irgendwie ein tradeoff stattfindet, sonst gäbe es ja nur einen immergültigen Wert. Ich fand es nur auffällig, eben auch weil ich Werte eingestellt habe, die deutlich unter dem Standardwert von 10000 liegen.

Vielleicht teste ich es mit diesem Standardwert noch einmal und schau was dabei rauskommt.
 
Unbedingt den IOWait im Auge behalten.

Aber bei einer Load von unter 1 deutlich unter eins, kann man kaum etwas heraus lesen. Da besteht auch vieles aus Messfehlern.
-> Enfluss des Messens selbst.

Bei dieser "gringen Last" gehe ich auch nicht davon aus, dass Du eine Laständerung erstmal merken würdest weder durch erhöhen oder verkleinern des Wertes. (sofern Du nicht gerade auf 1 oder wenigstens einen niedirgen 3 stelligen Bereich gehst.
Das beenden und starten eines neuen Threads erzeugt natürlich wiederum etwas mehr Last auf Aufwand als wenn 1000 und mehr Requests durch einen Thread verarbeitet werden. Aber wie schon gesagt, bei einer Load von 0.5 etc. wird sich eine Erhöhung des Wertes nicht nennenswert auswirken.

Die Werte werden erst mit zunehmender Last bedeutender.
 
Last edited by a moderator:
Angenommen MaxRequestsPerChild ist bei 5000. Dann wird sozusagen alle 5000 Requests ein neuer Serverprozess gestartet und der alte stirbt. Wird der Wert auf 10000 gesetzt lebt ein Server Prozess doppelt solange, die Anzahl der Serverprozesse müsste sich reduzieren. Hier im theretischen Fall um die Hälfte.
Wie kommst du darauf? MaxRequestsPerChild hat mit der maximalen oder durchschnittlichen Anzahl der Apache httpd Prozesse nichts zu tun.

Dafür sind eher ServerLimit, Min/MaxSpareThreads oder MaxClients verantwortlich.

Weniger Serverproezesse müssten auch weniger Load bedeuten.
Es mag dich schockieren, aber 1 aktiver Prozess kann die Last eines Systems (durch was auch immer sie verursacht wird) mehr erhöhen, als 1000 Prozesse, die idlen.
 
Back
Top