Fastcgi-Zombies abschießen

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.

4 Gedanken zu „Fastcgi-Zombies abschießen

  1. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.