Como reiniciar automaticamente o php-fpm?

1

Estou usando o nginx + php-fpm no Debian Squeeze para um servidor ocupado e tive muita dificuldade em lidar com o máximo de conexões sendo alcançadas. Aqui o problema é que os processos php às vezes simplesmente morrem aleatoriamente sob alta carga e deixam o servidor sem nenhum processo php. Então eu preciso reiniciar manualmente o serviço php5-fpm para trazer de volta o servidor à vida.

Eu estou querendo saber como evitar que isso aconteça, ou pelo menos tratar os sintomas, reiniciando o php5-fpm automaticamente sempre que não houver processo php para escutar os pedidos recebidos. Minhas configurações relevantes são:

pm = dynamic
pm.max_children = 1400

pm.start_servers = 10
pm.max_spare_servers = 20
pm.process_idle_timeout = 1s; #not sure it will be useful when pm=dynamic
pm.max_requests = 100000
request_terminate_timeout = 30

Agradeço suas sugestões para lidar com esse problema desagradável.

    
por alfish 17.06.2012 / 23:34

3 respostas

3

A velha ideia do roteiro do cão de guarda, né? Não é a maneira mais elegante de resolver o seu problema, mas pode remediar temporariamente a situação até que você possa descobrir por que isso está acontecendo em primeiro lugar.

O problema real precisa ser resolvido. Ou é que o servidor precisa ser mais bem ajustado ou que o servidor não é poderoso o suficiente para lidar com a carga em primeiro lugar.

Você determinou que o processo realmente morre. Nesse caso, é tão simples quanto determinar se o processo ainda existe. ps aux deve fazer isso por você.

por exemplo:

ps aux|grep php-fpm|grep -v grep|awk '{print $2}'

deve gerar o id do processo do php-fpm. Se não existe, precisa de ser reiniciado

então algo ao longo das linhas disso deve fazer o truque. (curto e simples)

#!/bin/bash
pid='ps aux|grep php-fpm|grep -v grep|awk '{print $2}''
if [ $pid == '' ]
then
service php-fpm restart
fi

Esse script seria executado como um crontab a cada minuto. e não foi depurado. então experimente e certifique-se de que está funcionando.

O problema em fazer isso com processos zumbis é que eles realmente existem e estão "rodando", mas não fisicamente fazendo nada. Nesse caso, eles precisariam ser mortos primeiro e, em seguida, o processo reiniciado.

Novamente, a coisa certa a fazer é determinar o que realmente está causando o travamento do serviço. A ideia do script de vigilância é apenas para você ganhar tempo.

Espero que ajude. Boa sorte

    
por 18.06.2012 / 00:32
1

O problema do php-fcgi é: O processo se mantém vivo após cada requisição (diferente do php-cgi). Cada pedido aumenta o uso de memória do processo do php. A qualquer momento, o processo atinge o limite de memória do php.

Você pode evitar isso diminuindo

pm.max_requests = <value>
    
por 03.01.2013 / 14:48
0

pm.max_children = 1400

Você não não quer definir o parâmetro max children tão alto. Isso é realmente muito alto.

Você pode querer experimentar isso, mas honestamente:

Comece com:

pm.max_children = 50

E veja como é isso.

    
por 19.06.2012 / 10:47