O que está errado na minha configuração do php-fpm?

8

Eu tenho um servidor de 64 bits, mas apenas 256MB de RAM. Então, mudei para o servidor nginx com o fast-cgi para conectar ao PHP. Eu tenho o PHP 5.3.6 em execução.

O problema é que a cada dois ou três dias, quando tento acessar qualquer página do PHP, obtenho um erro interno do servidor. A única maneira é reiniciar o php-fpm manualmente. Isso significa que eu deveria ter definido alguns parâmetros errados que estão causando um estrangulamento. Abaixo listei as configurações relevantes.

/etc/php-fpm.conf: -

include=/etc/php-fpm.d/*.conf
log_level = error
;emergency_restart_threshold = 0
;emergency_restart_interval = 0
;process_control_timeout = 0

/etc/php-fpm.d/www.conf: -

[www]
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500

/etc/nginx/php.conf: -

location ~ \.php {
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;

        fastcgi_pass unix:---some-location---;
}

Atualização 1

E eu tenho quatro processos nginx em execução. Em média, cada processo php-fpm leva 35MB de RAM (memória virtual de 320MB cada). Eu também tenho um processo MySql em execução.

Atualização 2

Esqueci de colar os registros.

log de erros do php-fpm: -

WARNING: [pool www] seems busy (you may need to increase start_servers, or min/max_spare_servers), spawning 8 children, there are 1 idle, and 7 total children
WARNING: [pool www] server reached max_children setting (10), consider raising it
NOTICE: Terminating ...

php-fpm www.errorlog: -

PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
    
por AppleGrew 30.07.2011 / 09:46

3 respostas

17

Uma recomendação improvisada seria reduzir os valores definidos - provavelmente cortá-los pela metade.

Você tem: pm.max_children = 10 Se você disser 35MB / process = 350MB; em uma caixa de 256MB que significa muita troca ou falta de memória - nem é bom.

Eu diria que pelo menos 100MB para outros processos, talvez até 150MB, para ser seguro, e depois dividir esse número por 35MB para obter o max_children. Mantenha todos os outros números na fila:

pm = dynamic
pm.max_children = 4
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500

Pare o PHP-FPM e execute free para ter uma ideia da sua memória disponível - divida por seus 35MB para obter seu max_children.

Dependendo da quantidade de memória que o MySQL leva, você pode ter que diminuir max_children para 3.

Eu acho que os processos do PHP-FPM compartilham muita memória, fazem um experimento rápido para determinar o quanto é realmente usado. Pare o PHP-FPM e execute free . Inicie o PHP-FPM para visitar algumas páginas comuns (necessário, pois a memória aumenta dependendo das páginas carregadas) e verifique a memória total usada, novamente usando free - divida a diferença pelo número de processos. Não é um sistema perfeito, mas acho que é bastante preciso (às vezes a coluna de dados no topo também não é ruim).

    
por 30.07.2011 / 10:21
6

Sua configuração do php-fpm parece OK.

Mas o servidor que você está executando é um pouco restrito por recursos. É óbvio, a partir dos logs, que os processos do PHP estão esgotando a memória disponível.

Somando-se às sugestões fornecidas pelo cyberx86:

Você pode tentar editar o parâmetro memory_limit no arquivo php.ini (veja aqui ) (embora eu não tenha certeza fará muito bem)

Dada a pequena quantidade de memória do sistema, acho que você deve considerar seriamente a mudança para o sistema operacional de 32 bits. Usar um sistema operacional x64 está prejudicando você em vez de ser benéfico.

Se você não estiver utilizando o armazenamento do InnoDB em seu banco de dados MySql, você também pode considerar desligar o InnoDB em seu my.cnf - ele salvará outros 100 MB de RAM.

Lowendbox tem um ótimo tutorial sobre como otimizar servidores para baixa configuração de memória.

    
por 30.07.2011 / 10:27
3

Um comando muito útil para encontrar a memória tirada pelo php:

ps --no-headers -o "rss,cmd" -C php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

Então você divide a RAM que você quer dedicar a php, e você tem o valor max_children!

Além disso, você pode monitorar manualmente (você deve configurar o status php do endpoint) ou com o Nagios.

    
por 12.05.2014 / 15:27