Apache schluckt zu viel RAM.... glaub ich

Apache, Lighttpd, nginx, Cherokee
User avatar
coltseavers
Posts: 187
Joined: 2009-11-04 00:43
Location: NRW

Apache schluckt zu viel RAM.... glaub ich

Post by coltseavers » 2009-11-04 01:44

Hallo,
bin noch ein Anfänger, und deshalb noch nicht so sonderlich bewandert. Deshalb bitte ich um etwas Nachsicht.

Jedenfalls hab ich mir nen Debian-Lenny-Webserver gestrickt, auf dem nun Apache 2.2.9 läuft. Das Dingen hat 1GB RAM.

Der Apache-Root-Prozess braucht ca 11800kB, die Unterprozesse zwischen 7750kB und 8600kB.
Ausserdem zieht sich der Apache-Prozess mal eben 250MB Shared Memory.
Wenn ich das richtig kapiert habe, braucht der Webserver ja für jede gleichzeitige http-Anfrage von Clients einen Kindprozess - richtig?

Folgende Module sind eincompiliert:
core
mod_log_config
mod_logio
prefork
http_core
mod_so

Über das Verzeichnis "mods-enabled" werden noch eingebunden:
alias, auth_basic, authn_file, authz_default, authz_groupfile, authz_host, authz_user, autoindex, deflate, dir, env, mime, negotiation, php5, setenvif.

Dass PHP5 ein Modul ist, das relativ viel RAM braucht, ist mir klar, aber das brauch ich nunmal.

In der apache2.conf steht noch folgendes:
ifModule mpm_prefork_module
StartServers 10
MinSpareServers 10
MaxSpareServers 30
MaxClients 100
MaxRequestsPerChild 5000

sowie:
ifModule mpm_worker_module
StartServers 10
MaxClients 100
MinSpareThreads 10
MaxSpareThreads 40
ThreadsPerChild 25
MaxRequestsPerChild 0

So, ich hoffe ich hab nun alle für die Speicherbelegung relevanten Daten gepostet.

Meine Fragen:
Ist diese Prozessgrösse normal? Mir kommt das recht viel vor. Sind irgendwelche Module überflüssig?
Mir ist klar, dass ich durch StartServers und die SpareServer beeinflussen kann, wieviel RAM der Apache im Leerlauf zieht. Aber mir gehts nich darum, daß der Apache möglichst wenig RAM beansprucht (weils n Webserver ist, soll er den RAM gerne haben), aber ich will, dass er den RAM dann auch effizient nutzt (also möglichst schlank ist) und schnell läuft, damit der Karren auch n bisschen was aushält.

Wieviel RAM schluckt ein Kindprozess bei nem schlanken Apache inkl PHP5-Modul?

Also für Verschlankungs- bzw.- Effizienztips wär ich dankbar! (sofern diese Speicherbelastung pro Kindprozess zu hoch sein sollte. vielleicht ists ja auch gut so, das weiss ich ja nicht - aber mir kommts halt viel vor).

Vielen Dank vorab!

Gruß
Markus

papabaer
Userprojekt
Userprojekt
Posts: 170
Joined: 2009-05-14 17:40
Location: Halle (Saale)

Re: Apache schluckt zu viel RAM.... glaub ich

Post by papabaer » 2009-11-04 05:48

Hey,

hab gerade mal schnell meinen Indianer angeworfen.

coltseavers wrote:Der Apache-Root-Prozess braucht ca 11800kB, die Unterprozesse zwischen 7750kB und 8600kB.


Bei mir auch, ist also normal.

coltseavers wrote:Ausserdem zieht sich der Apache-Prozess mal eben 250MB Shared Memory.


Dazu kann ich nix sagen, hängt aber von ner Menge Faktoren ab.

coltseavers wrote:Wenn ich das richtig kapiert habe, braucht der Webserver ja für jede gleichzeitige http-Anfrage von Clients einen Kindprozess - richtig?


Jein, kommt auf das mpm-modul an. Standardmäßig kann ein Kindprozess aber mehrere Anfragen abarbeiten. Die bei Apache als default eingetragenen Werte sind soweit im grünen Bereich, dass man sehr hohe Last fahren müsste, um an die Grenzen zu kommen. Und dann weiß man meistens, was man tut.
Last edited by papabaer on 2009-11-04 05:49, edited 1 time in total.

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: Apache schluckt zu viel RAM.... glaub ich

Post by daemotron » 2009-11-04 10:37

coltseavers wrote:Der Apache-Root-Prozess braucht ca 11800kB, die Unterprozesse zwischen 7750kB und 8600kB.
Ausserdem zieht sich der Apache-Prozess mal eben 250MB Shared Memory.

Beziehen sich diese Werte auf real (RSS) oder virtuellen Speicher? Im übrigen sehe ich das wie PapaBaer, das ist für den Apache schon ein recht schlanker Memory Footprint.

coltseavers wrote:Wenn ich das richtig kapiert habe, braucht der Webserver ja für jede gleichzeitige http-Anfrage von Clients einen Kindprozess - richtig?

So grob. Etwas genauer: Dein Server verwendet das Prefork MPM-Modul. Das bedeutet, der Apache erzeugt bereits beim Starten eine von Dir festgelegte Anzahl von Kindprozessen (StartServers). Eingehende Requests werden im laufenden Betrieb zur Bearbeitung an die Kindprozesse durchgereicht. Wenn mehr Requests in der Queue stehen, als Kindprozesse verfügbar sind, kann der Apache innerhalb eines vorgegebenen Rahmens zusätzliche Kindprozesse erzeugen. Alle über den Rahmen hinausgehenden Requests werden aus der Queue heraus (Backlog) abgearbeitet. Außerdem ist es natürlich nicht korrekt, dass bei 10 Worker-Prozessen auch 10 Requests parallel bearbeitet werden - der Scheduler kann maximal so viele Prozesse parallel zur Ausführung bringen, wie Dein System CPU-Kerne bereitstellt.

coltseavers wrote:Ist diese Prozessgrösse normal? Mir kommt das recht viel vor. Sind irgendwelche Module überflüssig?

Das hängt davon ab, was der Server tun soll. Du könntest mod_setenvif noch deaktivieren, wenn Du es nicht irgendwo nutzt. Die anderen Module stellen aber schon eine Minimalkonfiguration dar; da wird's schwer, noch was rauszuholen.

coltseavers wrote:Mir ist klar, dass ich durch StartServers und die SpareServer beeinflussen kann, wieviel RAM der Apache im Leerlauf zieht. Aber mir gehts nich darum, daß der Apache möglichst wenig RAM beansprucht (weils n Webserver ist, soll er den RAM gerne haben), aber ich will, dass er den RAM dann auch effizient nutzt (also möglichst schlank ist) und schnell läuft, damit der Karren auch n bisschen was aushält.

Unter dem Aspekt solltest Du eventuell erwägen, anstelle des Prefork MPM-Moduls das Worker MPM-Modul einzusetzen. Im Worker-Modul werden die einzelnen Prozesse besser ausgenutzt, da jeder Prozess sich wiederum in Threads aufteilt. Pro Thread kann auch ein Request (pseudo-)parallel bearbeitet werden, aber mit wesentlich weniger Overhead als bei dedizierten Prozessen. Im Klartext: Bei mpm_worker kommt man mit weniger Prozessen aus als bei Prefork, um dieselbe Responsiveness zu erzielen und nutzt so die gegebenen Ressourcen besser aus.

coltseavers wrote:Also für Verschlankungs- bzw.- Effizienztips wär ich dankbar! (sofern diese Speicherbelastung pro Kindprozess zu hoch sein sollte. vielleicht ists ja auch gut so, das weiss ich ja nicht - aber mir kommts halt viel vor).

Es gibt Webserver, die wesentlich schlanker implementiert sind als Apache (z. B. Lighttpd, NGinx, Gatling, ...) und die ebenfalls gut dafür geeignet sind, PHP-Seiten auszuliefern. Mit NGinx und PHP via FastCGI sowie einem anständigen Opcode-Cache sollte da noch einiges rauszuholen sein.
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time

User avatar
coltseavers
Posts: 187
Joined: 2009-11-04 00:43
Location: NRW

Re: Apache schluckt zu viel RAM.... glaub ich

Post by coltseavers » 2009-11-16 23:46

vielen Dank für die Antworten!

Dann muß ich wohl bei Gelgenheit mal schauen, wie ich das prefork-mpm-modul durch das worker-mpm-modul ersetze und einkompiliere. Für nen Anfänger wie mich ne schöne Herausforderung :-)

Danke nochmal & Gruß,
Markus

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: Apache schluckt zu viel RAM.... glaub ich

Post by Roger Wilco » 2009-11-17 11:29

Wieso immer so umständlich? Die Paketverwaltung deiner Distribution bietet alles, was du brauchst...