
Ich verwende Apache 2.2.25 mit Prefork und mod_perl auf CentOS (meistens 6.4). Vor kurzem ist eine Instanz besonders durcheinander geraten und hat Kinder von Kindern von Kindern abgespalten:
<snip>
\_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | | | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | | | \_ /usr/sbin/httpd
| | | \_ /usr/sbin/httpd
| | \_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
\_ /usr/sbin/httpd
| \_ /usr/sbin/httpd
\_ /usr/sbin/httpd
\_ /usr/sbin/httpd
</snip>
Gleichzeitig ging der Box der Speicher aus (ich bin nicht sicher, was zuerst passierte, die tiefe Verzweigung oder der Speichermangel).
Ich habe noch nie gesehen, dass Apache das macht, und habe die Ursache noch nicht eingegrenzt. Die beiden Möglichkeiten, die ich untersuche, sind ein Speicherleck in mod_perl (oder eher in unserem Code, der dann aufgrund von mod_perl bestehen bleibt) oder ein Sicherheits-Exploit, der eine begrenzte Fork-Bombe ermöglicht (kann keine beliebigen Kinder abspalten, kann aber zusätzliche Apache-Kinder abspalten).
Ich bin nicht sicher, was dazu führen würde, dass Apache sich auf diese Weise verzweigt (bearbeitenIch erwähnte ursprünglich eine falsche Vorstellung davon, wie Graceful funktionierte, aber ich denke, dass ein Speicherleck vom Typ „Circular Ref“ (entweder direkt oder indirekt durch die Nutzung des gesamten verfügbaren Speichers auf der Box) eine Art mod_perl-Verwirrung verursachte, die dazu führte, dass zusätzliche Worker-Childs von den Children anstatt vom Haupt-Parent abzweigten. Ich habe dafür keinen wirklichen Grund, sondern versuche nur, die beiden Probleme (Deep Forking und Speichernutzung) in Einklang zu bringen.
Alternativ haben wir möglicherweise eine Sicherheitslücke, die ich aufspüren muss.
Hat jemand dieses Verhalten bei Apache schon einmal beobachtet und kennt eine Lösung?
Antwort1
Es stellte sich heraus, dass dies eine Code-Fork unter mod_perl war (was schon eine schlechte Idee ist) und dann wurde es noch schlimmer, indem das Kind nicht bereinigt wurde. Unter mod_perl forken Sie beim Forken nicht Ihren Code, sondern Apache. Dieses Kind stellt also weiterhin Inhalte bereit wie jedes andere geforkte Apache-Kind, wird aber nicht in die Zählung einbezogen und daher nie gelöscht, wenn Sie zu viele Instanzen erhalten.