Ik ben bezig met het opzetten van een webserver op een VPS. Mijn probleem is dat het geheugengebruik van php-cgi-processen in de loop van de tijd toeneemt, ook al ontvangt de website helemaal geen verkeer. (het zit voorlopig achter een firewall)

De VPS heeft 360 MB RAM. Ik gebruik Debian Lenny 32bit en zijn lighttpd- en php5-cgi-pakketten. Afgezien van enkele configuratiewijzigingen (hieronder vermeld), gebruik ik de voorraadconfiguratie van Debian.

De website is gebaseerd op Drupal. Met behulp van de ontwikkelmodule van Drupal kan ik zien dat het geheugengebruik van PHP-scripts gemiddeld minder dan 20 KB is, en nooit meer dan 8 MB.

Hier zijn de relevante delen uit de output van 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
  • Is het normaal dat php-cgi zo groot is?
  • Is het mogelijk om php-cgi geheugengebruik te schatten op basis van instellingen?
  • Tips om het geheugengebruik van php-cgi-processen te verminderen?

Zoeken naar bekende geheugenlekkende bugs leverde niets relevants op. En het zou me verbazen als de standaardpakketten/config van Debian zo'n duidelijk geheugenlek hadden. Andere gebruikers op dezelfde host hebben dit probleem niet.

Wat ik tot nu toe heb gedaan, is PHP_FCGI_MAX_REQUESTSop een lage waarde ingesteld, zodat php-cgi-processen snel worden gerecycled. Wanneer ik gebruik abom hoge belasting te simuleren, werkt dit heel goed. Processen sterven snel voordat ze groter worden dan 10 MB. Bij een lage tot gemiddelde belasting groeien alle processen echter gestaag (vanwege load balancing) en de meeste verbruiken tegelijkertijd 28 MB+, waardoor mijn VPS het risico loopt te worden geruild. Houd er rekening mee dat zelfs zonder enige vorm van verkeer, de processen gestaag groeien.

Ik kan het aantal php-cgi-processen verminderen, maar dit voelt meer als een tijdelijke oplossing dan als een oplossing. Het zou me verbazen als php-cgi normaal zo zou groeien.

Ook het optellen van de totale RSS-nummers voor php-cgi-processen geeft:

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

Toch free -mgeeft de volgende uitvoer:

             total       used       free     shared    buffers     cached
Mem:           360        351          8          0         33        190
-/+ buffers/cache:        127        232
Swap:          255          0        255
  • Mis ik iets? Hoe komt het dat het gebruikte geheugen (zonder buffers) lager is dan het totale residente geheugen van php-cgi-processen op de host?

Ik heb de volgende PHP-extensies:

php5-cgi php5-gewone php5-curl php5-gd php5-mysql php5-xcache

xcache.sizeis ingesteld op 24M. Vroeger was het 32M, maar het verminderen ervan hielp niet. xcache.var_sizeis ingesteld op 0. De overige plug-ins gebruiken de standaardconfiguratie. De xcache-beheerderspagina's laten zien dat xcache minder dan 1 MB gebruikt.

PHP memory_limitis ingesteld op 32M.

Hier is mijn FastCGI-configuratie:

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" 
  ))
)

Ik gebruik min of meer de voorraad lighttpd.confdie bij Debian wordt geleverd.

Laat het me weten als er nog andere gegevens zijn die ik kan verstrekken.

Alle hulp wordt op prijs gesteld. Ik probeer dit al dagen op te lossen. Ik heb geen ideeën meer.

answer

Probeer var_size te verlagen. Als we waarde hadden op 64 MB, begon het na een paar uur veel te wisselen en na de volgende paar uur was het helemaal down. Probeer de originele instellingen op 32M te houden, misschien zou dit je veel moeten helpen - we hadden hetzelfde probleem op onze reissite Xcache is nog steeds veel buggy-software :(

Het instellen van de maximale verzoeken is het juiste idee. Dat is de manier om te voorkomen dat uw systeem-RAM vol raakt als er een geheugenlek is.

Een ding dat ik je aanraad om te proberen, is over te schakelen naar apache + mod_php. Als dat werkt zonder geheugenverlies, betekent dit dat uw probleem CGI-gerelateerd was. Als het blijft lekken met mod_php, dan is er waarschijnlijk ergens een geheugenlek in de code.

Je zei dat je Drupal gebruikt. Heb je een soort Drupal-modules geïnstalleerd? Ik betwijfel of een stabiele versie van Drupal geheugenlekken in de kern heeft, dus de kans is groot dat problemen optreden in modules en andere add-ons en aanpassingen van derden.

Vaak zijn dit soort problemen het gevolg van een op-code cache zoals XCache of een memcached PHP-extensie.

Verwijder ongebruikte bibliotheken uit /etc/php5/apache2/conf.d. Waarschijnlijk heb je pdo.ini en pdo_mysq.ini of mysqli.ini niet nodig Dit bespaart een paar Mega Ram