Seit ich auf die neue Debian-Version aktuallisiert hatte, gibt es aus mir nicht begreiflichen Gründen immer wieder php5-cgi-Prozesse, die zwar durch fastcgi gestartet wurden, sich jedoch darüber nicht mehr beenden lassen. Dadurch wurde der Speicher immer voller, was dazu führte, dass der Webserver irgendwann tot war.
Die vorläufige Lösung, bis ich mich an die Ursache des Problems machen kann (dazu muss ich mich noch tiefer in fastcgi einarbeiten) sieht so aus, dass ich nach allen php5-cgi-Prozessen suche, die nicht mehr unter fastcgi als Vaterprozess suche (also alle php5-cgi mit ppid=1) und diese kille. Dabei reicht ein einfaches kill nicht mehr, sondern man muss schon die harte Variante fahren (weshalb der Fehler wohl auch in php zu suchen ist). Hier also das shell-Script:
#!/bin/sh
for child in $(ps -o pid,ppid,command -ax | grep php5-cgi | \
awk "{ if (\$2==1) {print \$1}}")
do
echo "Killing child process $child because ppid=1"
kill -s 9 $child
done
Das jetzt stündlich ausführen und der Speicher ist zumindest derzeit kein Problem. Trotzdem natürlich keine schöne Lösung, nur ein vorläufiger Workaround.
Hi,
erstmal danke für das Skript.
Gibt es eine Lösung zu dem Problem? Denn es ist schon ein dreckiger Workaround 😉
Nein, leider ist mir bisher keine andere Lösung bekannt. Inzwischen setze ich bei fast allen Servern auf Ubuntu und da ist mir das Problem bisher nicht begegnet.
Auf meinen Debian-Servern scheint folgende Config nicht zu greifen.
AddHandler fcgid-script .fcgi
FcgidConnectTimeout 40
IPCConnectTimeout 40
IPCCommTimeout 360
IdleScanInterval 120
BusyTimeout 300
BusyScanInterval 120
ErrorScanInterval 3
ZombieScanInterval 3
ProcessLifeTime 900
SpawnScoreUpLimit 10
SpawnScore 1
TerminationScore 2
MaxProcessCount 200
DefaultMaxClassProcessCount 10
DefaultMinClassProcessCount 1
IPCCommTimeout 900
MaxRequestsPerProcess 500
auf den Ubuntu-Servern (10.04) scheint es zu helfen, die Zombies zu entfernen. Das Problem ist, dass die Webapps unterschiedlich sind und ich nicht prüfen kann, ob in der Programmierung ein Fehler vorliegt.