Am Monday 31 January 2011 schrieb Christian Stubbs: > Martin Steigerwald <Martin@lichtvoll.de> writes: [...] > > Und dann schaue ich mal, ob einer der Apaches wirklich 20 MB > > verbraucht: > > > > mondschein:~> for P in $(pidof apache2); do pmap -d $P | tail -1 ; > > done mapped: 22476K writeable/private: 4820K shared: 568K > > mapped: 22764K writeable/private: 5108K shared: 568K > > mapped: 22796K writeable/private: 5140K shared: 568K > > mapped: 22828K writeable/private: 5172K shared: 568K > > mapped: 23088K writeable/private: 5432K shared: 568K > > mapped: 23056K writeable/private: 5400K shared: 568K > > mapped: 22992K writeable/private: 5336K shared: 568K > > mapped: 23080K writeable/private: 5424K shared: 568K > > mapped: 22828K writeable/private: 5172K shared: 568K > > mapped: 23088K writeable/private: 5432K shared: 568K > > mapped: 22344K writeable/private: 4688K shared: 568K > > Ist das ein frisch gestarteter oder schon länger laufender Apache? Die müssten schon länger laufen. Im Grunde seit dem ich den Server das letzte mal neu startete, also vor 89 Tagen. Und das Neustarten, um mögliche Speicherlecks zurückzusetzen, macht Apache ja glaub mittlerweile nicht mehr in der Standard-Konfiguration. Ich hab den Dienst, soweit ich mich erinnere, nicht neu gestartet. > Ein frisch gestartetet Apache mit mod-php sieht bei mir z.B. so aus: > :~# for P in $(pidof apache2); do pmap -d $P | tail -1 ; done > > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 151096K writeable/private: 3944K shared: 0K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 151092K writeable/private: 3944K shared: 0K Interessant, bei Dir fordern die Apache's im Durchschnitt mehr Adreßraum an, als bei mir. Vielleicht weitere zusätzliche Apache-Module, die ich nicht nutze? > Und nach ein paar Seitenaufrufen, wenn der PHP-Code nachgeladen wurde: > :~# for P in $(pidof apache2); do pmap -d $P | tail -1 ; done > > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 323552K writeable/private: 21336K shared: 576K > mapped: 322948K writeable/private: 20732K shared: 576K > mapped: 322960K writeable/private: 20744K shared: 576K > mapped: 323552K writeable/private: 21336K shared: 576K > mapped: 322952K writeable/private: 20736K shared: 576K > mapped: 324572K writeable/private: 22356K shared: 576K > mapped: 323656K writeable/private: 21440K shared: 576K > mapped: 151096K writeable/private: 3944K shared: 0K > mapped: 312532K writeable/private: 10316K shared: 576K > mapped: 151092K writeable/private: 3944K shared: 0K > > Sind ein paar Prozesse mehr und einige sind von 10MB auf 20MB > gewachsen. Insgesamt ca. 250MB für ca. 20 Prozesse/Connections. *Wenn* die Apache-Prozesse den angeforderten Adreßraum auch komplett belegen. Da wäre mal interessant, ein free -m vorher und nachher, um zumindest mal einen groben Anhaltspunkt zu bekommen, inwieweit die Prozesse den angeforderten Adreßraum auch tatsächlich nutzen. Die gemeinsam genutzten Bibliotheken spielen meines Erachtens für unsere Frage im Moment keine so große Rolle. Aber zumindest haben sie mal mehr Adreßraum angefordert, als bei mir. Nun es kommt natürlich auch immer darauf an, was die PHP-Skripte machen. Das Zeug, was ich laufen lasse, ist im großen und ganzen ein simpler Ersatz für Server Side Includes. Also auch nicht so ganz realistisch für typische CMS, wie ich offen zugebe ;). > Zum Vergleich mal eine Site mit mpm-worker mit 10 Threads pro Prozess > > und fcgid direkt nach dem Start: > :~# for P in $(pidof apache2); do pmap -d $P | tail -1 ; done > > mapped: 39432K writeable/private: 27556K shared: 832K > mapped: 14292K writeable/private: 3024K shared: 320K > mapped: 14104K writeable/private: 3156K shared: 0K > mapped: 14804K writeable/private: 3024K shared: 832K > > * keine php Prozesse > > Und nach ein paar Seitenaufrufen: > :~# for P in $(pidof apache2); do pmap -d $P | tail -1 ; done > > mapped: 39432K writeable/private: 27556K shared: 832K > mapped: 40976K writeable/private: 29100K shared: 832K > mapped: 14292K writeable/private: 3024K shared: 320K > mapped: 14104K writeable/private: 3156K shared: 0K > mapped: 14804K writeable/private: 3024K shared: 832K > > Hier noch das PHP: > :~# for P in $(pidof php5); do pmap -d $P | tail -1 ; done > > mapped: 34468K writeable/private: 13060K shared: 0K > mapped: 38076K writeable/private: 16668K shared: 0K > > Also insgesamt ca. 100MB für ca. 20 Prozesse/Connections. Wieder ist das abhängig, inwieweit die Prozesse den Adreßraum nutzen. Linux ist in der Standard-Einstellung ein ziemlicher Hochstapler, was Speicher-Anforderungen angeht. Prozesse fordern zudem nicht Speicher, sondern Adreßraum an, wenn man es genau nimmt. Der Linux Kernel gibt da durchaus mehr virtuellen Adreßraum raus, als er physikalisch mit Hauptspeicher und Swap abbilden kann. Und hofft, dass die Prozesse den Adreßraum schon nicht komplett nutzen, also beschreiben werden. Dann gibts natürlich noch Unterschiede. Anon Pages kann der Kernel nicht einfach so wegschmeissen, das ist Speicher, den Prozesse für sich nutzen und keine in den Speicher gemappte Datei usw. Änderungen an Pages von mit mmap() in den Speicher gemappten Dateien kann der Kernel natürlich wieder aufs Dateisystem rausschreiben. Aber oberflächlich betrachtet, sieht es in der Tat so aus, als brauche Apache mit FastCGI für PHP weniger Speicher als mit mod-php. Was ich ja auch nicht in Abrede stelle und was mich auch nicht wirklich wundert, wenn es denn tatsächlich so ist. > Wie du allerdings schreibst, kann das ganze auch hinfällig sein, wenn > bei den Prozessen signifikant mehr Code zwischen den Prozessen geteilt > wird, als die Angabe "shared" suggeriert. Am interessantesten ist hier noch die Angabe unter writable/private. Das sind Pages, die nur für den Prozess sind. Inwiefern der Prozess alle Pages nutzt, ist damit aber noch nicht raus. Und wenn ich das richtig summiert hast, hast Du oben Dich ja auch auf diese Angabe bezogen. Mittlerweile gibt es im Kernel bessere Möglichkeiten. Der Kernel stellt in /proc zusätzliche Informationen bereit. Weiß aber nicht mehr ob das nun in der Datei "smap", "map" und/oder "pagemap". Ich denke aber, dass der Memory Resource Controller, der sich optional im Kernel aktivieren läßt, genauere Auskünfte über den tatsächlich genutzten Speicher gibt. Da gibts dann ein CGroup-Dateisystem mit so Dateien wie "memory.usage_in_bytes". > Da bin ich dann mit meinen Profiling-Kenntnissen am Ende und muss dir > glauben. :) Das musst Du nicht. Es steht Dir frei, Dich selbst zu informieren und nachzuprüfen, was ich hier so von mir gebe. Ich bitte sogar darum. Ich versuche zwar lieber zu sagen, dass ich keine Ahnung habe, wenn es so ist, aber es passiert mir trotzdem sicherlich auch immer wieder mal, dass ich was vom Mond erzähle ;). Ciao, -- Martin 'Helios' Steigerwald - http://www.Lichtvoll.de GPG: 03B0 0D6C 0040 0710 4AFA B82F 991B EAAC A599 84C7
Attachment:
signature.asc
Description: This is a digitally signed message part.