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