L'utilizzo della memoria dei processi php-cgi è in costante aumento


8

Sto cercando di configurare un server Web su un VPS. Il mio problema è che l'utilizzo della memoria dei processi php-cgi aumenta nel tempo anche se il sito Web non riceve alcun traffico. (per il momento è protetto da un firewall)

Il VPS ha una RAM di 360 MB. Sto usando Debian Lenny a 32 bit e i suoi pacchetti lighttpd e php5-cgi. A parte alcune modifiche alla configurazione (elencate di seguito), sto usando la configurazione stock di Debian.

Il sito Web si basa su Drupal. Utilizzando il modulo di sviluppo di Drupal, posso dire che l'utilizzo della memoria degli script PHP è in media inferiore a 20 KB e non supera mai gli 8 MB.

Ecco le parti rilevanti dall'output di 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
  • È normale avere php-cgi così grande?
  • È possibile stimare l'utilizzo della memoria php-cgi in base alle impostazioni?
  • Qualche consiglio per ridurre il consumo di memoria dei processi php-cgi?

La ricerca di bug noti che perdono memoria non ha prodotto nulla di rilevante. E sarei sorpreso se i pacchetti / configurazione Debian predefiniti presentassero una perdita di memoria così evidente. Altri utenti sullo stesso host non presentano questo problema.

Quello che ho fatto finora è impostato PHP_FCGI_MAX_REQUESTSsu un valore basso in modo che i processi php-cgi vengano riciclati rapidamente. Quando uso abper simulare un carico elevato, funziona molto bene. I processi muoiono rapidamente prima di crescere oltre i 10 MB. Tuttavia, con un carico medio-basso, tutti i processi crescono costantemente (a causa del bilanciamento del carico) e la maggior parte consuma contemporaneamente 28 MB +, mettendo il mio VPS a rischio di scambio. Si prega di notare che anche senza alcun tipo di traffico, i processi crescono costantemente.

Posso ridurre il numero di processi php-cgi, ma sembra una soluzione più che una soluzione. Sarei sorpreso se php-cgi normalmente cresceva così.

Inoltre, sommando i numeri RSS totali per i processi php-cgi si ottiene:

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

Tuttavia, free -mfornisce il seguente output:

             total       used       free     shared    buffers     cached
Mem:           360        351          8          0         33        190
-/+ buffers/cache:        127        232
Swap:          255          0        255
  • Mi sto perdendo qualcosa? Come mai la memoria utilizzata (senza buffer) è inferiore alla memoria residente totale dei processi php-cgi sull'host?

Ho le seguenti estensioni PHP:

php5-cgi php5-comune php5-curl php5-gd php5-mysql php5-xcache

xcache.sizeè impostato su 24M. Una volta era 32M ma ridurlo non aiutava. xcache.var_sizeè impostato su 0. I plug-in rimanenti utilizzano la configurazione stock. Le pagine di amministrazione di xcache mostrano che xcache utilizza meno di 1 MB.

PHP memory_limitè impostato su 32M.

Ecco la mia configurazione FastCGI:

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

Sto usando più o meno lo stock lighttpd.conffornito con Debian.

Per favore fatemi sapere se ci sono altri dati che posso fornire.

Qualsiasi aiuto è apprezzato. Ho provato a risolvere questo problema per giorni. Ho finito le idee.

Risposte:


2

Prova ad abbassare var_size. Se avessimo un valore a 64 MB, dopo alcune ore ha iniziato a scambiarsi molto e dopo alcune ore è stato completamente in calo. Cerca di mantenere le impostazioni originali a 32M, forse questo dovrebbe aiutarti molto - abbiamo avuto lo stesso problema sul nostro sito di viaggi Xcache è ancora un sacco di software difettoso :(


1

L'impostazione delle richieste massime è l'idea giusta. Questo è il modo per evitare che la RAM del sistema si riempia in caso di perdita di memoria.

Una cosa che ti suggerisco di provare è passare ad apache + mod_php. Se funziona senza perdita di memoria, significa che il tuo problema era legato alla CGI. Se continua a perdere con mod_php, probabilmente c'è una perdita di memoria nel codice da qualche parte.

Hai detto che stai usando Drupal. Hai qualche tipo di modulo Drupal installato? Dubito che una versione stabile di Drupal abbia perdite di memoria nel core, quindi è più probabile che si verifichino problemi nei moduli e in altri componenti aggiuntivi e personalizzazioni di terze parti.


Grazie per la tua risposta. Tutti i moduli Drupal sono noti e il modulo di sviluppo non segnala perdite di memoria in Drupal. Inoltre, la perdita di memoria si verifica anche se non ci sono hit. Per quanto riguarda il tentativo di Apache, lo lascerei come ultima risorsa quando non avrò più idee. Grazie ancora.
Giovanni,

Sto riscontrando gli stessi problemi ... Come si fa a terminare il processo PHP-CGI quando hai finito? Sto solo usando la stessa configurazione con Wordpress e sta quasi uccidendo la mia fetta da 256mib.
Kyle

Usa Nginx in quanto è più piccolo di entrambi i server e non ha perdite di memoria da PHP. Wordpress e altri grandi siti lo usano.
Xeoncross,

0

Molte volte questo tipo di problemi sono dovuti a una cache del codice operativo come XCache o l'estensione PHP memcached.


0

Rimuovere le librerie non utilizzate da /etc/php5/apache2/conf.d. Probabilmente non hai bisogno di pdo.ini e pdo_mysq.ini o mysqli.ini Questo risparmierà qualche mega di ram

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.