Hallo Liste! Sagt mal, welchen "Hunger" hat eigentlich so ein Webserver? Ich weiß, ist natürlich sehr von den Zugriffen etc. abhängig. Aber kann man irgendwie in den Ansätzen ne Hausnummer definieren? Ein paar "Fakten": - SuSE 9.2 - Apache 2 - MySQL (Versionsnummer hab ich gerade nicht parat - aber die ganz neue 5er ist es nicht) - PHP 5.irgendwas - Domains sind 3,4 dabei, die mehrmals täglich aufgerufen werden (ca. 500 Aufrufe je Domain) (ist jetzt natürlich auch abhängig von der Anzahl der Seiten, und Elemente ...) Die anderen Domains dümpeln so vor sich hin. Speicher hat die Kiste 148 MB - ist nicht wirklich viel, aber besser als gar nichts ;-) Müsste doch aber eigentlich für n kleinen Webserver locker reichen!??! Das ominöse ist, daß der Server heute Nacht abgesoffen ist, kompletter Stillstand. Im MessageLog steht "out of Memory" und das Apache error.log sagt was von "MaxClients reached". Diese Variable steht im httpd.conf auf 150. Nach mutigem Hochsetzen auf 300, hat beim Neustart Apache gemosert, daß mehr als 256 nicht ginge - ich solle mich um die ServerLimited Direktive kümmern. Was ist das für eine Direktive? Wo finde ich die? Was hat es mit diesen MaxClients auf sich? Heißt das, wenn wirklich mal 150 User gleichzeitig auf einer Website sind, dann geht nichts mehr? Oder bezieht sich das auf irgendwelche Verbindungen, die von mehreren gemeinsam genutzt werden und dann doch wieder deutlich mehr User zulassen? Fragen über Fragen ;-) Würde mich freuen, wenn der eine oder andere von euch dazu eine Idee hat! Beste Grüße Anatol
On Thursday 03 November 2005 09:44, Anatol wrote:
Im MessageLog steht "out of Memory" und das Apache error.log sagt was von "MaxClients reached". Diese Variable steht im httpd.conf auf 150. Nach mutigem Hochsetzen auf 300, hat beim Neustart Apache gemosert, daß mehr als 256 nicht ginge - ich solle mich um die ServerLimited Direktive kümmern. Was ist das für eine Direktive? Wo finde ich die? Was hat es mit diesen MaxClients auf sich? Heißt das, wenn wirklich mal 150 User gleichzeitig auf einer Website sind, dann geht nichts mehr? Oder bezieht sich das auf irgendwelche Verbindungen, die von mehreren gemeinsam genutzt werden und dann doch wieder deutlich mehr User zulassen?
Wenn Deine Kiste mit oom abgesoffen ist, solltest Du MaxClients eher deutlich verringern. Wie groß sind denn Deine Apache-Prozesse so normal? Wie groß sind sie direkt nach dem Start und nachdem sie einige Anfragen bearbeitet haben? Lies einfach in /proc/PID/statm die erste und zweite Zahl (Prozessgröße, RSS). Du musst folgendes betrachten. Nach der Initialisierung forkt der Apache eine Reihe Kinder. Diese sharen einen Teil des Speichers mit ihrem Vater durch Copy-on-Write. Wenn ein Kind nun einen Request bearbeitet, allokiert es wahrscheinlich irgendwelche Buffer. Nach einer gewissen Anzahl Anfragen sollte die Menge an Speicher, die ein konkretes Kind verbraucht einen gewissen Grenzwert ansteuern. Für die Ermittlung des MaxClients Parameters musst Du von Deinem Gesamtspeicher einen gewissen Sockelbetrag für OS und ein paar andere Programme abziehen. Den Rest teilst Du durch den von einem Kind verbrauchten Speicher, rundest ab und erhältst MaxClients. Der Speicherverbrauch pro Kind setzt sich aus 2 Teilen zusammen, dem Zuwachs der Prozessgröße nach dem Fork und dem Teil des ursprünglich durch Copy-on-Write gesharten Speichers, auf den das Kind schreibend zugreift. Den ersten Teil kannst Du in /proc/PID/statm (erste Zahl * 4) ermitteln. Den 2. Teil kannst Du mit Deinem Kernel nur schätzen. 2.4.x und 2.6.14++ liefern auch für den 2. Teil Messwerte. Konservativ würde ich den 2. Teil auf 30% der Prozessgröße des Apache-Vaters schätzen. ServerLimit ist in Apache2 das, was HARD_SERVER_LIMIT im Header-File in Apache1 war. Es ist einfach der Versuch, den Administrator daran zu erinnern, dass zuviel MaxClients zu oom führt. Du könntest Dich auch mal mit MaxRequestsPerChild beschäftigen. Das ist evtl. eine Rettung, wenn die Prozessgrößen keinen Grenzwert erreichen. Auch solltest Du den Swap-Space auf ein Minimum begrenzen. Dann stürzt der Apache bei oom eher ab, aber der Rechner bleibt erreichbar. Du kannst Dich schneller wieder per SSH einloggen. Torsten
Hallo Torsten! Vielen Dank für Deine Ausführungen!! Klingt gut - zwar komplex, aber gut ;-) Ich hab mal die proc/PID/statm ausgelesen. Hiermal ein paar Werte für den Betrieb nach 12 Stunden: 6114 3792 2326 294 0 3494 0 6109 1513 2332 294 0 3483 0 6101 1654 2326 294 0 3481 0 8362 6100 2326 294 0 5742 0 3663 1452 2326 294 0 1043 0 6024 3055 2326 294 0 3404 0 6131 3907 2332 294 0 3505 0 6026 1847 2326 294 0 3406 0 4568 2461 2332 294 0 1942 0 6013 1515 2326 294 0 3393 0 Und direkt in den ersten 10 Sekunden nach dem Reboot des Indianers: 3114 1936 2326 294 0 494 0 6007 4912 2326 294 0 3387 0 4220 3127 2332 294 0 1594 0 3114 1941 2326 294 0 494 0 9399 8297 2326 294 0 6779 0 3114 1961 2326 294 0 494 0 Und nochmal ein paar weitere Werte nach ca. 40 Sekunden. Das sind jetzt aber nicht die gleichen PIDd wie in der Messung 5 Sekunden nach Start, sondern zusätzliche neue Prozesse. 3564 2468 2326 294 0 944 0 3577 2483 2326 294 0 957 0 3114 1964 2326 294 0 494 0 6007 4906 2326 294 0 3387 0 3114 1962 2326 294 0 494 0 6004 4903 2326 294 0 3384 0 3496 2397 2326 294 0 876 0 Was sagen mir die Werte jetzt? Die erste Spalte beschreibt die Prozessgröße, richtig? Sind das Angaben in kByte oder Byte? Wenn ich das recht sehe, dann pendelt sich der Wert bei ca. 6000 ein. Die zweite Zahl steht für RSS. Was bedeutet das?? Hab unten auch nochmal die TOP-Table eingebaut. Ist vielleicht auch ganz aufschlußreich... Mir kommt zB. die erste Zeile, der erste httpd Task etwas merkwürdig vor. Da schluckt er über 20% der CPU Leistung. Das ist teilweise noch deutlich mehr. Zwischendurch liegt das auch mal bei 80 / 90%. Tut das Not?? Und wenn er dann auch noch, wie hier 25% des MEM verbraucht, dann ist das ja schon etwas mehr ... OK: Wenn ich jetzt Deinem Beispiel folge, dann liegt die Prozessgröße bei 6000 x 4 = 24000. Dazu nocheinmal 30% => 32000 pro Kind. Das bedeutet je Kindprozess werden 32 MByte benötigt? Das ist doch schon sehr viel, oder? Wenn ich von 150 MB RAM ausgehe, und ca. 60MB für das System ohne Apache einkalkuliere, bleiben 90MB übrig. Das würde max. 3 Kindprozesse zulassen. Das erscheint mir irgendwie etwas zu wenig. Was ist jetzt hier richtig? Viele Grüße Anatol top - 19:41:55 up 7:27, 2 users, load average: 3.63, 1.25, 0.88 Tasks: 79 total, 2 running, 77 sleeping, 0 stopped, 0 zombie Cpu(s): 4.2% us, 23.4% sy, 0.0% ni, 0.0% id, 70.8% wa, 0.3% hi, 1.2% si Mem: 145048k total, 134192k used, 10856k free, 4152k buffers Swap: 401584k total, 81772k used, 319812k free, 6412k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17537 nobody 18 0 47084 36m 9304 R 21.6 25.9 0:04.40 httpd 17555 nobody 18 0 13652 4496 9304 S 0.7 3.1 0:00.04 httpd 17560 nobody 16 0 13972 4888 9304 S 0.7 3.4 0:00.04 httpd 17561 nobody 16 0 13804 4780 9304 S 0.7 3.3 0:00.04 httpd 17557 nobody 16 0 13972 4888 9304 S 0.5 3.4 0:00.05 httpd 17558 nobody 17 0 13716 4532 9304 S 0.5 3.1 0:00.03 httpd 17562 nobody 18 0 13668 4484 9304 S 0.5 3.1 0:00.03 httpd 17487 nobody 16 0 24076 14m 9304 S 0.4 10.5 0:04.58 httpd 17424 nobody 15 0 24060 6060 9304 S 0.2 4.2 0:08.88 httpd 17553 nobody 15 0 14576 4784 9304 S 0.2 3.3 0:00.16 httpd 17165 nobody 15 0 18112 4536 9328 S 0.0 3.1 0:02.80 httpd 17266 nobody 16 0 17828 4796 9304 S 0.0 3.3 0:05.65 httpd 17308 nobody 15 0 24052 4440 9304 S 0.0 3.1 0:13.64 httpd 17482 nobody 15 0 14420 5492 9304 S 0.0 3.8 0:00.53 httpd 17483 nobody 16 0 24052 7472 9304 S 0.0 5.2 0:04.50 httpd 17488 nobody 16 0 14180 3884 9304 S 0.0 2.7 0:00.54 httpd 17491 nobody 15 0 24028 9.9m 9304 S 0.0 7.0 0:04.52 httpd 17495 nobody 16 0 24184 14m 9304 S 0.0 10.2 0:04.81 httpd 17498 nobody 15 0 14968 5976 9304 S 0.0 4.1 0:00.54 httpd 17534 nobody 15 0 13904 3988 9304 S 0.0 2.7 0:00.08 httpd 17535 nobody 16 0 14092 3508 9304 S 0.0 2.4 0:00.16 httpd 17536 nobody 16 0 12456 2932 9304 S 0.0 2.0 0:00.00 httpd 17538 nobody 16 0 12456 2936 9304 S 0.0 2.0 0:00.00 httpd 17539 nobody 16 0 12456 2932 9304 S 0.0 2.0 0:00.00 httpd 17540 nobody 16 0 12456 2932 9304 S 0.0 2.0 0:00.00 httpd 17544 nobody 15 0 12456 2936 9304 S 0.0 2.0 0:00.00 httpd 17546 nobody 16 0 12456 2908 9304 S 0.0 2.0 0:00.00 httpd 17547 nobody 16 0 12456 2916 9304 S 0.0 2.0 0:00.00 httpd 17550 nobody 15 0 14252 4980 9304 S 0.0 3.4 0:00.16 httpd 17551 nobody 17 0 12456 2788 9304 S 0.0 1.9 0:00.00 httpd 17552 nobody 17 0 12456 2784 9304 S 0.0 1.9 0:00.00 httpd 17556 nobody 16 0 13832 4836 9304 S 0.0 3.3 0:00.03 httpd 17559 nobody 18 0 12456 2772 9304 S 0.0 1.9 0:00.00 httpd 17573 nobody 18 0 12456 2776 9304 S 0.0 1.9 0:00.00 httpd Torsten Foertsch schrieb:
On Thursday 03 November 2005 09:44, Anatol wrote:
Im MessageLog steht "out of Memory" und das Apache error.log sagt was von "MaxClients reached". Diese Variable steht im httpd.conf auf 150. Nach mutigem Hochsetzen auf 300, hat beim Neustart Apache gemosert, daß mehr als 256 nicht ginge - ich solle mich um die ServerLimited Direktive kümmern. Was ist das für eine Direktive? Wo finde ich die? Was hat es mit diesen MaxClients auf sich? Heißt das, wenn wirklich mal 150 User gleichzeitig auf einer Website sind, dann geht nichts mehr? Oder bezieht sich das auf irgendwelche Verbindungen, die von mehreren gemeinsam genutzt werden und dann doch wieder deutlich mehr User zulassen?
Wenn Deine Kiste mit oom abgesoffen ist, solltest Du MaxClients eher deutlich verringern. Wie groß sind denn Deine Apache-Prozesse so normal? Wie groß sind sie direkt nach dem Start und nachdem sie einige Anfragen bearbeitet haben? Lies einfach in /proc/PID/statm die erste und zweite Zahl (Prozessgröße, RSS).
Du musst folgendes betrachten. Nach der Initialisierung forkt der Apache eine Reihe Kinder. Diese sharen einen Teil des Speichers mit ihrem Vater durch Copy-on-Write. Wenn ein Kind nun einen Request bearbeitet, allokiert es wahrscheinlich irgendwelche Buffer. Nach einer gewissen Anzahl Anfragen sollte die Menge an Speicher, die ein konkretes Kind verbraucht einen gewissen Grenzwert ansteuern. Für die Ermittlung des MaxClients Parameters musst Du von Deinem Gesamtspeicher einen gewissen Sockelbetrag für OS und ein paar andere Programme abziehen. Den Rest teilst Du durch den von einem Kind verbrauchten Speicher, rundest ab und erhältst MaxClients.
Der Speicherverbrauch pro Kind setzt sich aus 2 Teilen zusammen, dem Zuwachs der Prozessgröße nach dem Fork und dem Teil des ursprünglich durch Copy-on-Write gesharten Speichers, auf den das Kind schreibend zugreift.
Den ersten Teil kannst Du in /proc/PID/statm (erste Zahl * 4) ermitteln. Den 2. Teil kannst Du mit Deinem Kernel nur schätzen. 2.4.x und 2.6.14++ liefern auch für den 2. Teil Messwerte. Konservativ würde ich den 2. Teil auf 30% der Prozessgröße des Apache-Vaters schätzen.
ServerLimit ist in Apache2 das, was HARD_SERVER_LIMIT im Header-File in Apache1 war. Es ist einfach der Versuch, den Administrator daran zu erinnern, dass zuviel MaxClients zu oom führt.
Du könntest Dich auch mal mit MaxRequestsPerChild beschäftigen. Das ist evtl. eine Rettung, wenn die Prozessgrößen keinen Grenzwert erreichen.
Auch solltest Du den Swap-Space auf ein Minimum begrenzen. Dann stürzt der Apache bei oom eher ab, aber der Rechner bleibt erreichbar. Du kannst Dich schneller wieder per SSH einloggen.
Torsten
Hallo Anatol, hallo Leute, Am Donnerstag, 3. November 2005 19:56 schrieb Anatol: [...]
Hab unten auch nochmal die TOP-Table eingebaut. Ist vielleicht auch ganz aufschlußreich... Mir kommt zB. die erste Zeile, der erste httpd Task etwas merkwürdig vor. Da schluckt er über 20% der CPU Leistung. Das ist teilweise noch deutlich mehr. Zwischendurch liegt das auch mal bei 80 / 90%. Tut das Not?? Und wenn er dann auch noch, wie hier 25% des MEM verbraucht, dann ist das ja schon etwas mehr ...
Guck mal per pstree -pa nach, ob das der Eltern- oder ein Kindprozess ist. Falls es ein Kindprozess ist: Hast Du auf dem Server einzelne PHP-Scripte, die außergewöhnlich viel Rechenleistung und/oder Speicher brauchen? Und besteht der Rest aus "harmlosen" PHP-Scripten oder HTML pur? Kannst Du irgendwie rausfinden, was genau dieser "fette" Prozess macht? Gruß Christian Boltz -- I am the "ILOVEGNU" signature virus. Just copy me to your signature. This message was infected under the terms of the GNU General Public License.
Hallo Christian, hallo Liste Christian Boltz schrieb:
[...]
Guck mal per pstree -pa nach, ob das der Eltern- oder ein Kindprozess ist.
Es ist ein Kindprozess.
Falls es ein Kindprozess ist: Hast Du auf dem Server einzelne PHP-Scripte, die außergewöhnlich viel Rechenleistung und/oder Speicher brauchen?
Ja, das könnte schon sein. Muß ich mal buddeln .... Auf jeden Fall sind diverse Foren installiert. Aber ob es die sind?
Kannst Du irgendwie rausfinden, was genau dieser "fette" Prozess macht?
Es gibt bestimmt Möglichkeiten - sind ja schließlich hier bei Linux ;-) - aber ich weiß nicht wie! Kennt sich jemand von Euch da aus?? Viele Grüße Anatol
On Thursday 03 November 2005 19:56, Anatol wrote:
Hallo Torsten!
Vielen Dank für Deine Ausführungen!! Klingt gut - zwar komplex, aber gut ;-)
Ich hab mal die proc/PID/statm ausgelesen. Hiermal ein paar Werte für den Betrieb nach 12 Stunden:
6114 3792 2326 294 0 3494 0 6109 1513 2332 294 0 3483 0 6101 1654 2326 294 0 3481 0 8362 6100 2326 294 0 5742 0 3663 1452 2326 294 0 1043 0 6024 3055 2326 294 0 3404 0 6131 3907 2332 294 0 3505 0 6026 1847 2326 294 0 3406 0 4568 2461 2332 294 0 1942 0 6013 1515 2326 294 0 3393 0
Und direkt in den ersten 10 Sekunden nach dem Reboot des Indianers:
3114 1936 2326 294 0 494 0 6007 4912 2326 294 0 3387 0 4220 3127 2332 294 0 1594 0 3114 1941 2326 294 0 494 0 9399 8297 2326 294 0 6779 0 3114 1961 2326 294 0 494 0
Deine Prozesse werden also bis ca. 37 MB groß, in der Regel aber nur so um die 24-25 MB. Direkt nach dem Fork sind Deine Prozesse 3114 Pages, also 3114*4 KB groß. 30% davon sind also ca. 1000 Pages oder 4MB. Der 9399 Seiten große Prozess belegt aktuell gerade 8297 Seiten im Hauptspeicher. Der Rest ist ausgelagert. Das sind aber trotzdem gut 32MB nur für diesen einen Prozess.
Und nochmal ein paar weitere Werte nach ca. 40 Sekunden. Das sind jetzt aber nicht die gleichen PIDd wie in der Messung 5 Sekunden nach Start, sondern zusätzliche neue Prozesse.
3564 2468 2326 294 0 944 0 3577 2483 2326 294 0 957 0 3114 1964 2326 294 0 494 0 6007 4906 2326 294 0 3387 0 3114 1962 2326 294 0 494 0 6004 4903 2326 294 0 3384 0 3496 2397 2326 294 0 876 0
Was sagen mir die Werte jetzt? Die erste Spalte beschreibt die Prozessgröße, richtig? Sind das Angaben in kByte oder Byte? Wenn ich das recht sehe, dann pendelt sich der Wert bei ca. 6000 ein. Die zweite Zahl steht für RSS. Was bedeutet das??
Das sind Pages, also 4k Blöcke. Die erste Zahl ist die Prozessgröße, die 2. RSS - resident segment size. Das ist die Anzahl an Seiten, die der Prozess gerade im Speicher belegt. Der Rest ist gerade auf der Platte ausgelagert.
Hab unten auch nochmal die TOP-Table eingebaut. Ist vielleicht auch ganz aufschlußreich... Mir kommt zB. die erste Zeile, der erste httpd Task etwas merkwürdig vor. Da schluckt er über 20% der CPU Leistung. Das ist teilweise noch deutlich mehr. Zwischendurch liegt das auch mal bei 80 / 90%. Tut das Not?? Und wenn er dann auch noch, wie hier 25% des MEM verbraucht, dann ist das ja schon etwas mehr ...
OK: Wenn ich jetzt Deinem Beispiel folge, dann liegt die Prozessgröße bei 6000 x 4 = 24000. Dazu nocheinmal 30% => 32000 pro Kind.
Nicht ganz, Du ziehst von den 24MB 4MB ab (das sind die 30% der Anfangsgröße) und kommst auf 20MB. Daraus folgt, Du kannst mit Deinen 140MB RAM 7 Apache-Prozesse gleichzeitig betreiben. Alles andere wird unsicher. Natürlich rettet Dich Swapping ein wenig, aber wenn Du wirklich, sagen wir, 20 parallele Anfragen hast, die alle ihre 20 MB Speicher brauchen, dann brauchst Du 400MB. D.h. Du benutzt 260MB virtuellen Speicher auf der Platte. In so einer Situation hast Du dann auch Probleme Dich per SSH einzuloggen, oder einen top zu starten. Hier findest Du eine gute Anleitung zum Thema MaxClients: http://perl.apache.org/docs/1.0/guide/performance.html#Choosing_MaxClients Es geht zwar hauptsächlich um mod_perl, die Ausführungen passen aber auf den Apache im allgemeinen. Ich hab keine Ahnung, wie Du mod_php dazu bringst, irgendwelche Module/Templates, etc. vorzuladen, so wie das mit mod_perl geht. Das könnte aber helfen. Ich würde Dir empfehlen, eine Frontend-Backend-Architektur zu benutzen. Du hast sicher eine Menge statischen Content, Bilder, Stylesheets, ... Diese werden vom Frontend ohne php o.ä. ausgeliefert. Ein sparsam konfigurierter Apache braucht wesentlich weniger als 1MB und behält diese Größe auch während der Laufzeit. PHP Anfragen werden mit mod_rewrite und mod_proxy an das Backend weitergeleitet, das auf dem selben Server mit dem selben DocRoot nur einer anderen Konfiguration läuft. Im Backend setzt Du MaxClients auf 6 oder 7 und schaltest KeepAlive aus. So holst Du wahrscheinlich das beste aus Deinem Rechner heraus. Kennst Du mod_status? Das kann Dir helfen die reale Belastung besser zu verstehen. So wie ich den top-Output unten verstehe, läuft gerade genau 1 Apache-Prozess. Die anderen warten. Das deutet darauf hin, dass Du mit MaxClients 5 oder so im Backend auskommen solltest. Torsten
Das bedeutet je Kindprozess werden 32 MByte benötigt? Das ist doch schon sehr viel, oder? Wenn ich von 150 MB RAM ausgehe, und ca. 60MB für das System ohne Apache einkalkuliere, bleiben 90MB übrig. Das würde max. 3 Kindprozesse zulassen. Das erscheint mir irgendwie etwas zu wenig. Was ist jetzt hier richtig?
Viele Grüße Anatol
top - 19:41:55 up 7:27, 2 users, load average: 3.63, 1.25, 0.88 Tasks: 79 total, 2 running, 77 sleeping, 0 stopped, 0 zombie Cpu(s): 4.2% us, 23.4% sy, 0.0% ni, 0.0% id, 70.8% wa, 0.3% hi, 1.2% si Mem: 145048k total, 134192k used, 10856k free, 4152k buffers Swap: 401584k total, 81772k used, 319812k free, 6412k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17537 nobody 18 0 47084 36m 9304 R 21.6 25.9 0:04.40 httpd 17555 nobody 18 0 13652 4496 9304 S 0.7 3.1 0:00.04 httpd 17560 nobody 16 0 13972 4888 9304 S 0.7 3.4 0:00.04 httpd 17561 nobody 16 0 13804 4780 9304 S 0.7 3.3 0:00.04 httpd 17557 nobody 16 0 13972 4888 9304 S 0.5 3.4 0:00.05 httpd 17558 nobody 17 0 13716 4532 9304 S 0.5 3.1 0:00.03 httpd 17562 nobody 18 0 13668 4484 9304 S 0.5 3.1 0:00.03 httpd 17487 nobody 16 0 24076 14m 9304 S 0.4 10.5 0:04.58 httpd 17424 nobody 15 0 24060 6060 9304 S 0.2 4.2 0:08.88 httpd 17553 nobody 15 0 14576 4784 9304 S 0.2 3.3 0:00.16 httpd 17165 nobody 15 0 18112 4536 9328 S 0.0 3.1 0:02.80 httpd 17266 nobody 16 0 17828 4796 9304 S 0.0 3.3 0:05.65 httpd 17308 nobody 15 0 24052 4440 9304 S 0.0 3.1 0:13.64 httpd 17482 nobody 15 0 14420 5492 9304 S 0.0 3.8 0:00.53 httpd 17483 nobody 16 0 24052 7472 9304 S 0.0 5.2 0:04.50 httpd 17488 nobody 16 0 14180 3884 9304 S 0.0 2.7 0:00.54 httpd 17491 nobody 15 0 24028 9.9m 9304 S 0.0 7.0 0:04.52 httpd 17495 nobody 16 0 24184 14m 9304 S 0.0 10.2 0:04.81 httpd 17498 nobody 15 0 14968 5976 9304 S 0.0 4.1 0:00.54 httpd 17534 nobody 15 0 13904 3988 9304 S 0.0 2.7 0:00.08 httpd 17535 nobody 16 0 14092 3508 9304 S 0.0 2.4 0:00.16 httpd 17536 nobody 16 0 12456 2932 9304 S 0.0 2.0 0:00.00 httpd 17538 nobody 16 0 12456 2936 9304 S 0.0 2.0 0:00.00 httpd 17539 nobody 16 0 12456 2932 9304 S 0.0 2.0 0:00.00 httpd 17540 nobody 16 0 12456 2932 9304 S 0.0 2.0 0:00.00 httpd 17544 nobody 15 0 12456 2936 9304 S 0.0 2.0 0:00.00 httpd 17546 nobody 16 0 12456 2908 9304 S 0.0 2.0 0:00.00 httpd 17547 nobody 16 0 12456 2916 9304 S 0.0 2.0 0:00.00 httpd 17550 nobody 15 0 14252 4980 9304 S 0.0 3.4 0:00.16 httpd 17551 nobody 17 0 12456 2788 9304 S 0.0 1.9 0:00.00 httpd 17552 nobody 17 0 12456 2784 9304 S 0.0 1.9 0:00.00 httpd 17556 nobody 16 0 13832 4836 9304 S 0.0 3.3 0:00.03 httpd 17559 nobody 18 0 12456 2772 9304 S 0.0 1.9 0:00.00 httpd 17573 nobody 18 0 12456 2776 9304 S 0.0 1.9 0:00.00 httpd
Torsten Foertsch schrieb:
On Thursday 03 November 2005 09:44, Anatol wrote:
Im MessageLog steht "out of Memory" und das Apache error.log sagt was von "MaxClients reached". Diese Variable steht im httpd.conf auf 150. Nach mutigem Hochsetzen auf 300, hat beim Neustart Apache gemosert, daß mehr als 256 nicht ginge - ich solle mich um die ServerLimited Direktive kümmern. Was ist das für eine Direktive? Wo finde ich die? Was hat es mit diesen MaxClients auf sich? Heißt das, wenn wirklich mal 150 User gleichzeitig auf einer Website sind, dann geht nichts mehr? Oder bezieht sich das auf irgendwelche Verbindungen, die von mehreren gemeinsam genutzt werden und dann doch wieder deutlich mehr User zulassen?
Wenn Deine Kiste mit oom abgesoffen ist, solltest Du MaxClients eher deutlich verringern. Wie groß sind denn Deine Apache-Prozesse so normal? Wie groß sind sie direkt nach dem Start und nachdem sie einige Anfragen bearbeitet haben? Lies einfach in /proc/PID/statm die erste und zweite Zahl (Prozessgröße, RSS).
Du musst folgendes betrachten. Nach der Initialisierung forkt der Apache eine Reihe Kinder. Diese sharen einen Teil des Speichers mit ihrem Vater durch Copy-on-Write. Wenn ein Kind nun einen Request bearbeitet, allokiert es wahrscheinlich irgendwelche Buffer. Nach einer gewissen Anzahl Anfragen sollte die Menge an Speicher, die ein konkretes Kind verbraucht einen gewissen Grenzwert ansteuern. Für die Ermittlung des MaxClients Parameters musst Du von Deinem Gesamtspeicher einen gewissen Sockelbetrag für OS und ein paar andere Programme abziehen. Den Rest teilst Du durch den von einem Kind verbrauchten Speicher, rundest ab und erhältst MaxClients.
Der Speicherverbrauch pro Kind setzt sich aus 2 Teilen zusammen, dem Zuwachs der Prozessgröße nach dem Fork und dem Teil des ursprünglich durch Copy-on-Write gesharten Speichers, auf den das Kind schreibend zugreift.
Den ersten Teil kannst Du in /proc/PID/statm (erste Zahl * 4) ermitteln. Den 2. Teil kannst Du mit Deinem Kernel nur schätzen. 2.4.x und 2.6.14++ liefern auch für den 2. Teil Messwerte. Konservativ würde ich den 2. Teil auf 30% der Prozessgröße des Apache-Vaters schätzen.
ServerLimit ist in Apache2 das, was HARD_SERVER_LIMIT im Header-File in Apache1 war. Es ist einfach der Versuch, den Administrator daran zu erinnern, dass zuviel MaxClients zu oom führt.
Du könntest Dich auch mal mit MaxRequestsPerChild beschäftigen. Das ist evtl. eine Rettung, wenn die Prozessgrößen keinen Grenzwert erreichen.
Auch solltest Du den Swap-Space auf ein Minimum begrenzen. Dann stürzt der Apache bei oom eher ab, aber der Rechner bleibt erreichbar. Du kannst Dich schneller wieder per SSH einloggen.
Torsten
participants (3)
-
Anatol
-
Christian Boltz
-
Torsten Foertsch