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