Reduzierung der Apache-Speichernutzung und des durchschnittlichen Prozessgrößenwerts

Reduzierung der Apache-Speichernutzung und des durchschnittlichen Prozessgrößenwerts

Ich weiß, dass die Frage etwas lang ist, aber ich habe mich entschieden, jeden einzelnen Aspekt zu beschreiben, der mir aufgefallen ist.

Ich verwende einen Linux-Server, das verwendete Betriebssystem ist Ubuntu 14.04, alle übrigen Konfigurationen sind unten definiert. Dieser Webserver wird zum Bereitstellen von in PHP erstellten Anwendungen verwendet, die Datenbank wird über RDS gehostet. Im Durchschnitt gibt es zu Spitzenzeiten fast 200 gleichzeitige Anfragen auf dem Server, was zu einer Speicherauslastung von 100 % führt. Dadurch wird die Anwendung sehr langsam oder antwortet manchmal mit Fehlern. Ich habe also einige Schritte befolgt, um das Problem zu beheben, die ich unten aufgeführt habe, und versucht, Apache zu optimieren und es für ungewöhnliche Situationen einzuschränken.

Betriebssystem

NAME="Ubuntu" VERSION="14.04.5 LTS

Serverkonfiguration

CPU: 8 Kerne
RAM: 15 GB
Hardwareanbieter: AWS
Instanztyp: c4.2xlarge

Apache.Conf-Parameter (2.4)

Timeout 300
KeepAlive Ein
MaxKeepAliveRequests 100
KeepAliveTimeout 5
HostnameLookups Aus
LogLevel warnen
AllowOverride alle (für Dokumentstamm der Anwendung)

Verwendetes MPM: prefork

MPM_PREFORK.CONF

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 256
MaxConnectionsPerChild 200

Mods_Aktiviert

access_compat.load autoindex.load mime.load setenvif.load alias.conf deflate.conf mpm_prefork.conf socache_shmcb.load alias.load deflate.load mpm_prefork.load ssl.conf authn_core.load dir.conf negotiation.conf ssl.load authn_file.load dir.load negotiation.load status.conf authz_core.load env.load php5.conf status.load authz_host.load filter.load php5.load authz_user.load headers.load rewrite.load autoindex.conf mime.conf setenvif.conf

Durchschnittliche Apache-Prozessgröße

Verwendeter Befehl:

sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}' <br/>

Apache-Speichernutzung (MB): 7227,66
Durchschnittliche Prozessgröße (MB): 314,246

Berechnung von MaxRequestWorkers

X = Dedizierter RAM, den ich Apache zuweisen möchte (13 GB): 13312 MB
Y = Durchschnittliche Prozessgröße, die ich seit 15 Tagen auf dem Server überwache: 314.246
MaxRequestWorkers = X/Y = ca. 40

Verwendetes MPM: prefork

Geänderte MPM_PREFORK.CONF

Startserver 5
Min. Ersatzserver 5 Max. Ersatzserver
10 Max. Anforderungsworker
40 Max.
Verbindungen pro Kind 8

Wenn Apache jetzt startet, werden 5 Startserver-Prozesse gestartet und jeder Startserver-Prozess startet 8 Kindverbindungen, sodass insgesamt 40 gleichzeitige Verbindungen zum Server hergestellt werden können. MaxRequestWorkers sind auf 40 begrenzt, was 40 gleichzeitige Anfragen nicht überschreitet. Dies verhindert DOS- und DDOS-Vorfälle oder schützt den Server vor einem Absturz, indem maximal 13 GB RAM belegt werden und 2 GB RAM für den Server frei bleiben.
Auch der Parameter MaxConnectionsPerChild ist mir nicht klar. Bitte korrigieren Sie mich, wenn ich ihn falsch verwende.

PHP.INI-Parameter (php5)

ALT
output_buffering = 4096
max_execution_time = 60
memory_limit = -1
log_errors = Ein

NEU
output_buffering = 4096
max_execution_time = 60
memory_limit = 64M
log_errors = Ein

PROBLEME, DIE MICH IMMER NOCH BESCHÄFTIGT HABEN

Nach dem Ändern von mpm_prefork_conf ging die Speicherauslastung zurück, aber der Server antwortet vielen Clients aufgrund des MaxRequestWorkers-Parameters mit einem 503-Fehler. Ich habe versucht herauszufinden, warum jeder meiner Apache-Prozesse 315 MB RAM verwendet. Ich habe etwa 2 Tage lang gegoogelt und konnte nicht den richtigen Weg finden, um das Problem weiter zu beheben. Also habe ich dies schließlich hier gepostet. Ich habe jetzt zwei Möglichkeiten.

  1. Um das durchschnittliche Prozesslimit von Apache zu optimieren und das MaxRequestWorkers-Limit zu erhöhen.

  2. Um den RAM zu erhöhen und Clients mit der gleichen durchschnittlichen Prozessgröße zu bedienen, halte ich das nicht für die richtige Wahl.

Bitte geben Sie mir die richtigen Vorschläge, wie ich die durchschnittliche Prozessgröße von Apache mit PHP ermitteln und reduzieren kann. Bitte nur ehrliche Antworten.

Antwort1

Ich glaube nicht, dass man viel besser werden kann als das. Ich würde den Weg wählen und php-fpm verwenden, dann wird das Laden von nicht-dynamischen Inhalten viel schneller und weniger speicherintensiv sein. Ich habe Folgendes gefundenAnleitung (digitalocean.com), das gibt gute Empfehlungen. Sie könnten beispielsweise die Keepalive-Zeiten in Apache ändern, sieheHier

Antwort2

Das ist ziemlich viel Speicher pro Apache-Prozess. Und Ubuntu 14.0.4 war 2019 EOL.

Das Auffälligste an der Konfiguration, die Sie gepostet haben, ist Folgendes:

KeepAliveTimeout 5

Ändern Sie das auf 1. Sie werden feststellen, dass mindestens die Hälfte Ihrer aktiven Prozesse derzeit nichts tut, während sie auf das Keepalive-Timeout warten.

Beginnen Sie mit der Analyse Ihres Datenverkehrs – stellen Sie sicher, dass alle Ihre statischen Inhalte zwischengespeichert werden können.

Gehen Sie Ihre Apache-Konfiguration durch und stellen Sie sicher, dass Sie keine Module laden, die Sie nicht verwenden.

Stellen Sie sicher, dass Sie eine Standardzeit für PHP festgelegt haben und dass Ihre Skripte die Fehlerberichterstattung nicht deaktivieren. Überprüfen Sie Ihre Fehlerprotokolle und bereinigen Sie die Fehler. Versuchen Sie, Ihr ListenBacklog in Apache zu optimieren.

MaxVerbindungenProKind 8

Warum? Das istsehrniedrig. Apache ist im Allgemeinen sehr stabil. Sie sollten diesen Wert auf 100 erhöhen können, um die Anzahl der Apache-Forks zu reduzieren und so die Kapazität zu erhöhen. Wenn sich die Änderung dieses Wertes auf die Fehlerrate der Anwendung auswirkt, überprüfen Sie, ob Sie keine schlecht codierten persistenten Datenbankverbindungen haben. Wenn es sich auf die Speichernutzung auswirkt, stellen Sie sicher, dass Ihre Patches auf dem neuesten Stand sind.

verwandte Informationen