Auch wenn der Thread schon sehr alt ist, nochmal ein Beitrag dazu:
Ich habe aktuell einen Server, bei dem mir hauptsächlich diverse Wordpress-Instanzen den Server "wegschießen". D. h. der RAM-Verbrauch erreicht auf dem Server kritische Werte und dann ist der Server erst einmal voll überlastet. D. h. der RAM ist irgendwann aufgebraucht, wonach dann Swap verwendet wird, was natürlich dazu führt, dass der Server extrem langsam wird. Ist der Swap dann auch noch aufgebraucht, dann wird geplanterweise der OOM-Killer aktiv und schießt mir da diverse Prozesse mit dem größten Speicherverbrauch weg. Einer der obersten Kanditaten ist da natürlich der mysqld, wonach dann alle DB-basierten Webseiten auf dem Server offline sind.
Das Problem tritt gelegentlich auf. Eine Ursache ist vermutlich, wenn ein Kunde im Wordpress-Backend gewisse Websiteeditoren startet.
Hier mal so der aktuelle Top-20 Speicherverbrauch nach aufräumen(KiB resident Memory):
[web204] 814068
[web334] 734864
[web1] 560828
[web556] 548416
[web20] 454260
[web205] 307780
[web194] 278520
[web472] 214092
[web268] 199664
[web254] 162328
[web119] 153280
[web325] 136380
[web365] 97564
[web321] 96672
[web288] 68296
[web315] 62700
[web543] 54716
[web121] 52436
[web373] 43876
[web179] 41612
Alles anzeigen
Ich habe apache2/prefork/fcgid im Einsatz. Im aktuellen Zustand laufen 64 php-cgi Prozesse.
fcgid.conf
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
FcgidConnectTimeout 20
FcgidPassHeader Authorization
FcgidMaxProcesses 100
</IfModule>
mpm_prefork.conf
<IfModule mpm_prefork_module>
StartServers 15
MinSpareServers 15
MaxSpareServers 15
MaxRequestWorkers 150
MaxConnectionsPerChild 10
</IfModule>
System: Debian 9
Apache: 2.4.25-3+deb9u9
php: 7.2 + 7.3
php.ini
memory_limit = 64M
Nachdem ich mir als Sofortmaßnahme erst mal den RAM der virtuellen Maschine von 8 GB auf 16 GB erhöht habe, habe ich jetzt als Workaround erst mal ein Prüfscript(php-Script) laufen, was in kurzen Intervallen schaut, wie viel Speicher die einzelnen Kunden verbrauchen. Wenn ein fest eingestelltes Limit erreicht ist, dann werden die PHP-Prozesse mittels kill sanft beendet. Ich vermute, dass das SIGTERM dazu führt, dass der FCGID-Prozess brav den aktuellen Request zu Ende verarbeitet, bevor er dann sich selbst beendet. Das wäre schön, wenn es so wäre.
Ich habe das Speicherlimit einmal sehr heruntergedreht und konnte trotz regelmässiger Aufräumarbeiten keinerlei Probleme bei der Webseitenfunktion feststellen. Also insgesamt zumindest scheinbar ein brauchbarer Workaround.
Das ist das Script:
https://github.com/megabert/sc…/apache2-user-mem-watcher
Aber so richtig doll finde ich das trotzdem nicht. Ich habe in der Apache fcgid Dokumentation noch nix gefunden, was mir da helfen könnte.
Gibt es da bessere Lösungsmöglichkeiten?
Hilft da evtl. FcgidMaxProcessesPerClass?