MaxClients in Apache. Woher weiß ich, wie groß mein Prozess ist?

9

Von http://httpd.apache.org/docs/2.2/misc/perf-tuning.html

Das größte Hardwareproblem, das sich auf die Leistung des Webservers auswirkt, ist der Arbeitsspeicher. Ein Webserver sollte niemals austauschen müssen, da das Austauschen die Latenz jeder Anforderung über einen Punkt hinaus erhöht, den Benutzer als "schnell genug" betrachten. Dies führt dazu, dass Benutzer auf Stop und Reload klicken, wodurch die Last weiter erhöht wird. Sie können und sollten die MaxClients-Einstellung so steuern, dass Ihr Server nicht so viele untergeordnete Elemente erzeugt, dass er mit dem Austausch beginnt. Das Verfahren hierfür ist einfach: Ermitteln Sie die Größe Ihres durchschnittlichen Apache-Prozesses, indem Sie Ihre Prozessliste mit einem Tool wie top anzeigen, und teilen Sie diese in Ihren gesamten verfügbaren Speicher auf, sodass Platz für andere Prozesse bleibt.

Das Hauptproblem ist, dass ich nicht verstehen kann, wie man die Größe kennt, weil ich die Größe von httpd auf nicht mehr von 3888 habe

Aber wenn wir die Anzahl für MaxClients bestimmen müssen und ich 4 GB RAM habe, bekomme ich: 972, also sollte ich wie 900 in den MaxClients verwenden?

Larry
quelle
4
"Ich habe die Größe von httpd auf nicht mehr von 3888" - Ich glaube, ich spreche für alle, wenn ich sage: "HUH?"
womble

Antworten:

9

Bestimmen Sie zunächst die PID eines Ihrer Apache-Prozesse.

Dann können Sie so etwas tun:

cat /proc/PIDHERE/status | grep VmRSS

Dies ergibt die (aktuelle) Resident-Set-Größe dieses bestimmten Prozesses, ähnlich wie:

VmRSS: 304456 kB

Dieser Wert entspricht der Größe des im RAM befindlichen Prozesses.

Normalisieren Sie dann Ihre Maßeinheit ( 4GB * 1024 * 1024 = 4,194,304 KB). Teilen:

4194304 KB / 304456 KB = 13.77 processes

Bedenken Sie, dass auf Ihrem System wahrscheinlich andere Prozesse ausgeführt werden, die ebenfalls Speicher verbrauchen, und Sie möchten im Idealfall das Auslagern minimieren. Daher möchten Sie wahrscheinlich nicht, dass 13 Apache MaxClients konfiguriert werden (unter Verwendung meiner Nummern), sondern dass Sie (nach Ihrem Ermessen) etwas weniger möchten ).

Dies ist eine grobe Schätzung; Die Größe Ihrer Apache-Prozesse kann je nach Auslastung mit der Zeit zunehmen.

Loopforever
quelle
1
Während RSS keine freigegebenen Seiten enthält, enthält es Seiten, die als Copy-on-Write gekennzeichnet sind - dh auf einem Computer ist Platz für mehr Prozesse als (Summe von RSS) / (physischer Speicher). Siehe auch meine Antwort an anderer Stelle - freier Speicherplatz ist für eine gute Leistung unerlässlich.
Symcbean
4

Die Vorhersage der maxClients anhand von Testszenarien ist ein Ausgangspunkt. Um das Problem jedoch richtig zu lösen, müssen Sie zunächst messen, wie sich Ihre Anwendung mit dem tatsächlichen Datenverkehr verhält.

Angenommen, Ihr Apache läuft vor der Gabelung ....

Richten Sie einen Cron-Job ein, um die Anzahl der httpd-Prozesse und die Ausgabe von 'free' zu zählen. Beachten Sie, dass die für Cache / Puffer verfügbare Speichermenge einen großen Einfluss auf die Leistung hat, wenn Ihr Webserver Inhalte aus lokalen Dateien bereitstellt (und in vielen Fällen auch dann, wenn dies nicht der Fall ist). Wenn Sie also zum Tauschen kommen, ist Ihre Webleistung wahrscheinlich schrecklich!

Wenn Sie einige Daten haben, zeichnen Sie sie in ein Diagramm und führen Sie eine Regression der kleinsten Quadrate durch. Extrapolieren Sie sie, um die Anzahl der Clients zu ermitteln, bei denen Sie Ihr Ziellimit für die httpd-Speichernutzung erreichen. Ein Ausgangspunkt für das Speicherziel wäre weniger als 80% des physischen Speichers / 80% der Größe des Inhalts.

(Beachten Sie, dass die Ergebnisse möglicherweise nicht korrekt sind, wenn MinSpareServer auf einen sehr hohen Wert eingestellt sind.)

#!/bin/bash

LOGFILE='/var/log/httpd/memusage'
PIDS = `ps -ef | grep httpd | grep -v grep | wc -l`
MEM = `free | grep 'buffers/cache'`
DAY = `date '%Y-%m-%d %H:%M:%S'`
echo ${DAY} ${PIDS} ${MEM} >>LOGFILE

In einer idealen Welt würden Sie auch die URL-Antwortzeit in derselben Protokolldatei messen - dies wird jedoch viel komplexer.

symcbean
quelle
Für mich ändert sich der Puffer / Cache kaum, egal ob 11 Clients ausgeführt werden oder wenn der Server 86 oder 151 Clients erreicht hat (und der Server abgestürzt ist). Was erwarten Sie in Ihrer MEM-Variablen? Ich bekomme zwei Zahlen und frage mich, ob Ubuntu 12.04 etwas anderes gibt, als Sie erwartet haben.
PeterB
Wenn Sie versuchen, "frei" zu laufen, werden Sie sehen, was ich erwarte (2 Zahlen). Wenn es stimmt, dass diese Zahlen bei unterschiedlicher Anzahl von Prozessen nur geringfügig variieren, führen Sie entweder den ereignisbasierten Server aus oder Ihre Einstellung für maxspareservers ist albern. Wenn Sie ein Beispiel der Ausgabe und der relevanten Teile Ihrer httpd.conf gepostet hätten, hätten wir vielleicht ein besseres Bild?
Symcbean
.... und "Absturz"? Was für ein Absturz?
Symcbean
Leider sehen pastebin.com/aHZCagVn für httpd.conf Einstellungen und Beispielausgabe. Mit "Absturz" meine ich zu viele Clients, der Server hat nicht mehr genügend Speicher und ist gesperrt. Weitere Informationen finden Sie unter pastebin.com/fnXzBfQL .
PeterB
1
@PeterB Es scheint wahrscheinlicher, dass MySQLd dieses Problem verursacht. Wenn der OOM-Killer des Kernels einschaltet, werden die schlimmsten Straftäter zuerst getötet, basierend auf dem Wert von / proc / PID / oom_score_adj. Wie aus Ihrer Ausgabe hervorgeht, ging mysqld an erster Stelle. Möglicherweise müssen Sie die Einstellungen in my.cnf besser anpassen, um sie an die Einschränkungen Ihrer VM anzupassen. Versuchen Sie als / temporäre / Problemumgehung, eine Swap-Datei für zusätzlichen virtuellen Speicher hinzuzufügen, um festzustellen, ob Sie das Treten von OOM-Killern vermeiden können. Dann entfernen Sie es, sobald Sie Ihr eigentliches Problem identifiziert haben.
Loopforever