Posts Tagged fastcgi

php on noMMU

php su una piattaforma noMMU è facilmente compilabile e funziona tranquillamente, ma ovviamente può causare problemi di frammentazione di memoria

Nel tentativo di risolvere questi problemi, ho provato a utilizzare una soluzione con lighttpd che via
fastcgi contatta php: in questo modo php viene avviato una volta e non deve essere lanciato ad ogni richiesta di un file php; la memoria occupata è quella iniziale e resta quella.

Il tutto funziona molto bene, permettendo di far girare egregiamente applicazioni php su piattaforme noMMU.
L’unico problema che ho riscontrato e che mi ha fatto perdere diverso tempo, è che php-fcgi dopo un po’ moriva senza dare errori di nessun tipo.

Dopo varie ricerche ho scoperto che questo è il comportamento normale.

Normalmente in una piattaforma con MMU avremmo un processo php, che forka n processi figli
(con n basato sulla variabile d’ambiente PHP_FCGI_CHILDREN) ognuno dei quali gestisce
al massimo PHP_FCGI_MAX_REQUESTS, che di default vale 500.
Si ritiene questo sistema il più efficiente, perché avere un processo php che gestisce infinite richieste
potrebbe permettere ad alcune funzioni php, note per avere alcuni problemi di memory leak, di destabilizzare il sistema.

Su sistemi noMMU, però, il processo php non può usare fork per creare processi figli, percui
lui da solo è l’unico che riesce a girare e dopo aver risposto alle 500 richieste di default
se ne esce bellamente, convinto di aver finito il suo lavoro.

Nel mio caso ho risolto il problema portando a 0 il numero di PHP_FCGI_MAX_REQUESTS,
cioè infinite e ora è li bello che ha già risposto a qualche centinaia di migliaia di connessioni
senza fiatare. Un’altra soluzione sarebbe modificare php in modo che possa usare vfork
invece di fork, ma questo è oltre le mie capacità e se non l’ha fatto nessun’altro, figuriamoci
se mi metto a farlo io.

Riporto parzialmente lo stesso post anche in inglese, perché so che è tornato utile ad altri:

In these days I had a problem with lighttpd and php in fastcgi mode on noMMU systems:
php dies after a while, with no error or whatsoever.

I have done some research and found that, php is dying after exactly
500 connections.

That’s normal behaviour for php in fastcgi mode.

Normally, on a MMUfull system, there would be a php process, spawning
n childrens (based on PHP_FCGI_CHILDREN environment var) each of them
handling PHP_FCGI_MAX_REQUESTS, which by default is 500.

On a noMMU system, php is not able to “fork” childrens, so it can handle only the first 500 connections.

In my case I solved by setting PHP_FCGI_MAX_REQUESTS to 0 and
now php never dies. I didn’t tried to patch php to use vfork
instead of fork, ’cause it is probably beyond my abilities,
but that may be another solution … even if this may lead
to more memory fragmentation.

, ,

No Comments