Die Speichernutzung von PHP-CGI-Prozessen nimmt stetig zu

8

Ich versuche, einen Webserver auf einem VPS einzurichten. Mein Problem ist, dass die Speichernutzung von PHP-CGI-Prozessen im Laufe der Zeit zunimmt, obwohl die Website überhaupt keinen Datenverkehr empfängt. (Es befindet sich vorerst hinter einer Firewall.)

Der VPS verfügt über 360 MB RAM. Ich verwende Debian Lenny 32bit und seine Pakete lighttpd und php5-cgi. Abgesehen von einigen Konfigurationsänderungen (unten aufgeführt) verwende ich das Standard-Setup von Debian.

Die Website basiert auf Drupal. Mit dem Entwicklungsmodul von Drupal kann ich feststellen, dass die Speichernutzung von PHP-Skripten im Durchschnitt weniger als 20 KB beträgt und 8 MB nie überschreitet.

Hier sind die relevanten Teile aus der Ausgabe von ps aux:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data 29871  0.0  1.7  54552  6368 ?        Ss   Aug12   0:00 /usr/bin/php-cgi
www-data 29873  0.0  7.4  65808 27468 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29874  0.0  3.7  55808 13736 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29875  0.0  4.3  58040 16204 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29876  0.0  4.4  57444 16288 ?        S    Aug12   0:00 /usr/bin/php-cgi
www-data 29877  0.0  1.7  54552  6368 ?        Ss   Aug12   0:00 /usr/bin/php-cgi
www-data 29879  0.0  9.6  67140 35684 ?        S    Aug12   0:26 /usr/bin/php-cgi
www-data 29880  0.0  6.6  59172 24492 ?        S    Aug12   0:23 /usr/bin/php-cgi
www-data 29881  0.0  7.1  59784 26388 ?        S    Aug12   0:22 /usr/bin/php-cgi
www-data 29882  0.0  7.4  60880 27440 ?        S    Aug12   0:23 /usr/bin/php-cgi
  • Ist es normal, php-cgi so groß zu haben?
  • Ist es möglich, die Speichernutzung von PHP-CGI basierend auf den Einstellungen zu schätzen?
  • Irgendwelche Tipps zur Reduzierung des Speicherverbrauchs von PHP-CGI-Prozessen?

Die Suche nach bekannten Speicherleck-Fehlern ergab nichts Relevantes. Und ich wäre überrascht, wenn die Standard-Debian-Pakete / -Konfiguration einen so offensichtlichen Speicherverlust hätten. Andere Benutzer auf demselben Host haben dieses Problem nicht.

Was ich bisher gemacht habe, ist PHP_FCGI_MAX_REQUESTSauf einen niedrigen Wert eingestellt, damit PHP-CGI-Prozesse schnell recycelt werden. Wenn ich abhohe Lasten simuliere, funktioniert das sehr gut. Prozesse sterben schnell ab, bevor sie höher als 10 MB werden. Unter niedriger bis mittlerer Last wachsen jedoch alle Prozesse stetig (aufgrund des Lastausgleichs) und die meisten verbrauchen gleichzeitig 28 MB +, wodurch mein VPS dem Risiko eines Austauschs ausgesetzt ist. Bitte beachten Sie, dass die Prozesse auch ohne jeglichen Datenverkehr stetig wachsen.

Ich kann die Anzahl der PHP-CGI-Prozesse reduzieren, aber dies scheint mehr eine Problemumgehung als eine Lösung zu sein. Ich wäre überrascht, wenn php-cgi normalerweise so wachsen würde.

Das Summieren der gesamten RSS-Nummern für PHP-CGI-Prozesse ergibt außerdem:

$ ps -C php-cgi -o rss= | awk '{s+=$1}END{print s/1024}'
195.738

Gibt jedoch free -mdie folgende Ausgabe:

             total       used       free     shared    buffers     cached
Mem:           360        351          8          0         33        190
-/+ buffers/cache:        127        232
Swap:          255          0        255
  • Vermisse ich etwas Wie kommt es, dass der verwendete Speicher (ohne Puffer) niedriger ist als der gesamte residente Speicher von PHP-CGI-Prozessen auf dem Host?

Ich habe die folgenden PHP-Erweiterungen:

php5-cgi php5-common php5-curl php5-gd php5-mysql php5-xcache

xcache.sizeist auf 24M eingestellt. Früher waren es 32 Millionen, aber das Reduzieren hat nicht geholfen. xcache.var_sizewird auf 0 gesetzt. Die restlichen Plugins verwenden die Standardkonfiguration. Die xcache-Administrationsseiten zeigen, dass xcache weniger als 1 MB verwendet.

PHPs memory_limitsind auf 32M eingestellt.

Hier ist meine FastCGI-Konfiguration:

fastcgi.server    = ( ".php" =>
  ((
    "bin-path" => "/usr/bin/php-cgi",
    "socket" => "/tmp/php.socket",
    "max-procs" => 2,
    "idle-timeout" => 20,
    "bin-environment" => (
      "PHP_FCGI_CHILDREN" => "4",
      "PHP_FCGI_MAX_REQUESTS" => "1000"
    ),
    "bin-copy-environment" => (
      "PATH", "SHELL", "USER"
    ),  
    "broken-scriptfilename" => "enable" 
  ))
)

Ich verwende mehr oder weniger den Bestand lighttpd.conf, der mit Debian geliefert wird.

Bitte lassen Sie mich wissen, ob ich weitere Daten zur Verfügung stellen kann.

Jede Hilfe wird geschätzt. Ich habe seit Tagen versucht, dies zu beheben. Ich habe keine Ideen mehr.

John
quelle

Antworten:

2

Versuchen Sie, var_size zu senken. Wenn wir einen Wert von 64 MB hatten, begann es nach ein paar Stunden viel zu tauschen, und nach den nächsten Stunden war es komplett ausgefallen. Versuche ursprüngliche Einstellungen 32M zu halten, vielleicht sollte dies helfen, eine Menge - wir haben das gleiche Problem bei unserer hatten Reise - Website Xcache ist noch viel fehlerhafter Software :(

Tixik
quelle
1

Das Einstellen der maximalen Anforderungen ist die richtige Idee. Auf diese Weise können Sie verhindern, dass sich der RAM Ihres Systems bei einem Speicherverlust füllt.

Ich schlage vor, Sie versuchen, zu Apache + mod_php zu wechseln. Wenn dies funktioniert, ohne dass Speicher verloren geht, bedeutet dies, dass Ihr Problem mit CGI zusammenhängt. Wenn es weiterhin mit mod_php leckt, liegt wahrscheinlich irgendwo ein Speicherverlust im Code vor.

Sie sagten, Sie verwenden Drupal. Haben Sie irgendwelche Drupal-Module installiert? Ich bezweifle, dass eine stabile Version von Drupal Speicherlecks im Kern aufweist, sodass Probleme höchstwahrscheinlich in Modulen und anderen Add-Ons und Anpassungen von Drittanbietern auftreten.

Apreche
quelle
Danke für deine Antwort. Alle Drupal-Module sind bekannt, und das Entwicklungsmodul meldet keine Speicherlecks in Drupal. Darüber hinaus tritt der Speicherverlust auch dann auf, wenn überhaupt keine Treffer vorliegen. Was Apache betrifft, würde ich dies als letzten Ausweg belassen, wenn ich keine Ideen mehr habe. Danke noch einmal.
John
Ich habe die gleichen Probleme ... Wie können Sie den PHP-CGI-Prozess beenden, wenn Sie damit fertig sind? Ich verwende nur das gleiche Setup mit Wordpress und es tötet fast mein 256mib-Slice.
Kyle
Verwenden Sie Nginx, da es kleiner als beide Server ist und keine Speicherverluste durch PHP aufweist. Wordpress und andere große Websites verwenden es.
Xeoncross
0

Oft sind diese Probleme auf einen Op-Code-Cache wie XCache oder eine zwischengespeicherte PHP-Erweiterung zurückzuführen.

Janne Pikkarainen
quelle
0

Entfernen Sie nicht verwendete Bibliotheken aus /etc/php5/apache2/conf.d. Wahrscheinlich brauchen Sie nicht pdo.ini und pdo_mysq.ini oder mysqli.ini. Dies spart ein paar Mega Ram

Mazgalici
quelle