Apache - Konfiguration und Performance

Aus Wikizone
Version vom 9. April 2010, 11:42 Uhr von 193.196.133.66 (Diskussion) (→‎Links)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Links[Bearbeiten]

Sehr guter Artikel zu Performance bezogenen Einstellungen (englisch): http://www.devside.net/articles/apache-performance-tuning

Übersicht und Links auf andere gute Seiten: http://www.joomlaperformance.com/articles/server_related/how_to_track_down_a_high_server_load_5_16.html

Allgemeine Tipps zur Performance[Bearbeiten]

Die Zusammenhänge[Bearbeiten]

Es gibt das Prefork MPM und das Worker MPM. Der Hauptunterschied besteht darin daß der Worker MPM mehrere Threads bilden kann. Das ist unter Umständen gut wenn mehrere Prozessor-Kerne am Werk sind.

Prefork bildet einen Thread und spaltet davon Kindprozesse ab. Das braucht weniger Speicher für die Threads.

Apache2 unter Worker MPM[Bearbeiten]

Unter Worker MPM muß man aufpassen das die Einstellungen zum Speicherangebot des Servers passen. Bei kleinen Servern oder VServern ist die Standardkonfiguration ein Killer, weil allein die Prozesse des Apache den ganzen Speicher brauchen und kein Platz mehr für andere Tätigkeiten (z.B. CGI-Skripte) bleiben.

Standardkonfiguration Worker und Prefork:

# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
    StartServers         50
    MinSpareServers      10
    MaxSpareServers      50
    MaxClients          250
    MaxRequestsPerChild   0
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

Für den Worker muß man also versuchen die Werte so einzustellen, daß nicht zuviel Speicher verschwendet wird, aber trotzdem die erwartete Last gut abgearbeitet wird und noch Reserven zur Verfügung stehen. Wenn die Werte zu hoch gesetzt sind riskiert man außerdem daß die threads gar nicht genutzt werden könnnen, weil die Prozessorleistung zu niedrig ist und der Speicherverbrauch zu hoch.

Die wichtigsten Werte sind hierbei:

MaxClients - Dieser Wert gibt an, wieviel Clients sich maximal zur gleichen Zeit verbinden dürfen ThreadsPerChild - Gibt an wieviel Threads in einem Serverprozess laufen. (Sollte nicht niedriger sein als MinSpareThreads) MaxRequestsPerChild - Wenn gesetzt wird ein Serverprozess nach der angegebenen Zahl beendet und wenn benötigt ein neuer gestartet. Gerade bei vielen Skripten wichtig, um zu verhindern daß ein Serverprozess zu lange auf ein Skript wartet und nicht anderswo genutzt werden kann.

Weitere Tipps[Bearbeiten]

  • Die KeepAliveTimeout kann man u.U. ebenfalls etwas heruntersetzten (z.B. von 15 auf 10 oder sogar 5s). Dann muß der Browser zwar evtl. eine neue Verbindung aufbauen, dafür wird bei langsamen Verbindungen die Verbindung nicht blockiert. Ganz auschalten ist aber auch nicht sinnvoll, dann ist der Server dauernd beschäftigt, neue Verbindungen aufzubauen, was natürlich auch wieder Zeit benötigt.
  • Min und MaxSpareThreads sollten durch ThreadsPerChild Teilbarsein. Sonst rundet der Server.
  • Den Speicherverbrauch eines Workerprozesses kann man angeblich effektiv mit der ThreadStackSize beeinflussen, auf geringe Kosten der Performance bezogen auf die Requestdauer. I reduced my setting down to 65536 bytes and was able to bring down my apache2 process usage from 50MB to just 10MB! And it works quite well with little to no effect on the speed of requests handled!
  • Man kann sich auch bei knappem Speicher überlegen lieber weniger Server und MaxClients zu nehmen und dafür mehr ThreadsPerChild. Spart Speicher geht aber wieder zu lasten der Geschwindigkeit (vor allem bei Prozessoren mit mehrerern Kernen.