Apache erzeugt trotz Maxclient und anderen Einschränkungen zu viele Prozesse

Apache erzeugt trotz Maxclient und anderen Einschränkungen zu viele Prozesse

Hier sind meine MPM-Einschränkungen:

<IfModule mpm_prefork_module>
    StartServers         10
    MinSpareServers      10
    MaxSpareServers      10
    MaxClients           10
    MaxRequestsPerChild  2000
</IfModule>

Trotzdem laufen bei mir derzeit über 20 Apache-Prozesse, und in den letzten ein oder zwei Stunden waren es sogar 40-50. Sollten MaxClient und MaxSpareServers die Anzahl der Prozesse nicht unter Kontrolle halten (also auf etwa 10)?

Übersehe ich etwas?

Antwort1

Apache gibt es in verschiedenen Varianten, die zwei häufigsten sindVorgabelUndArbeiter. Das Prefork-Modell erzeugt mehrere Prozesse, aber jeder Prozess verarbeitet jeweils nur eine Anfrage. Das Worker-Modell hingegen erzeugt mehrere Prozesse und jeder Prozess hat mehrere Threads, wobei jeder Thread jeweils eine Anfrage verarbeitet.

Abhängig von Ihrer Distribution verwenden Sie möglicherweise ein anderes Modell als das, das Sie erwarten. Sie erwarten Prefork, aber sind Sie sicher, dass dies der Typ ist, der ausgeführt wird? So finden Sie es heraus:

$httpd -V
Serverversion: Apache/2.2.15 (Unix)
Server erstellt: 28. Mai 2010 07:58:25
Magische Zahl des Servermoduls: 20051115:24
Server geladen: APR 1.4.2, APR-Util 1.3.9
Kompiliert mit: APR 1.4.2, APR-Util 1.3.9
Architektur: 32-Bit
Server-MPM: Prefork
  Gewinde: nein
    gegabelt: ja (variable Prozessanzahl)

In diesem Fall Server MPMist es meines Prefork, aber Ihres kann anders sein. Auf meinem Debian-Server mit Apache2 ist es Worker:

#/usr/sbin/apache2 -V
Serverversion: Apache/2.2.9 (Debian)
Server-MPM: Arbeiter

Auf manchen Rechnern (wie RedHat) ist es nicht ungewöhnlich, dass sowohl Prefork- als auch Worker-Binärdateien vorhanden sind (eine wird aufgerufen httpdund eine andere httpd.workeroder etwas Ähnliches). Sie sollten noch einmal überprüfen (mit psoder topoder cat /etc/init.d/httpd), welche tatsächlich gestartet wird.

Antwort2

Für alle anderen, die über diese Frage stolpern: Es gibt noch eine andere mögliche Ursache.

Ich weiß, Sie glauben, Sie hätten Ihre Antwort bereits gefunden, aber bei Prefork sollten Sie unabhängig von der Betrachtungsweise der Prozesse dasselbe sehen. Sie haben Prefork wohl nicht verwendet.

Aus diesem Grund:

http://httpd.apache.org/docs/2.4/mod/prefork.html

Dieses Multi-Processing-Modul (MPM) implementiert einen nicht-threaded, vorgegabelten Webserver.


Eine andere Erklärung, die ich gefunden habe

Das Laden des Prefork-Moduls vor den Konfigurationsoptionen funktioniert, aber wenn Sie es danach laden, werden anscheinend stattdessen einige Standardwerte geladen, wodurch Ihre IfModule-Direktive inaktiv wird. Sie werden dies wahrscheinlich nur bei einer angepassten Apache-Konfiguration sehen, da Distributionen es zum Starten korrekt eingerichtet haben.

Werke- Konfiguration wird angewendet

LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so

<IfModule mpm_prefork_module>
StartServers         1
MinSpareServers      1
MaxSpareServers      0
ServerLimit          4
MaxClients           4
MaxRequestsPerChild  4000
</IfModule>

Funktioniert nicht- Konfiguration hat keinen Effekt

<IfModule mpm_prefork_module>
StartServers         1
MinSpareServers      1
MaxSpareServers      0
ServerLimit          4
MaxClients           4
MaxRequestsPerChild  4000
</IfModule>

LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so

Antwort3

Ich komme mir jetzt irgendwie blöd vor, aber das hier:Warum zeigt htop viele Apache2-Prozesse an, ps aux jedoch nicht?erklärt mein Problem.

verwandte Informationen