Nginx e PHP-FPM ficando sem conexões


9

Eu continuo encontrando erros como esses,

[02-Jun-2012 01:52:04] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 19 idle, and 49 total children
[02-Jun-2012 01:52:05] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 19 idle, and 50 total children
[02-Jun-2012 01:52:06] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 19 idle, and 51 total children
[02-Jun-2012 03:10:51] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 18 idle, and 91 total children

Alterei minhas configurações para php-fpm para estas,

pm.max_children = 150 (It was at 100, i got a max_children reached and upped to 150)
pm.start_servers = 75
pm.min_spare_servers = 20
pm.max_spare_servers = 150

Resultando em

[02-Jun-2012 01:39:19] WARNING: [pool www] server reached pm.max_children setting (150), consider raising it

Acabei de lançar um novo site que está recebendo uma quantidade considerável de tráfego nele. Esse tráfego é legítimo e os usuários estão recebendo 504 tempos limite do gateway quando o limite é atingido.

Eu tenho conexões limitadas ao meu servidor com IPTABLES e estou executando o fail2ban e acompanhando os logs de acesso do nginx. O tráfego é legítimo, estou ficando sem espaço para os usuários.

Atualmente, estou executando em uma caixa dual core com o ubuntu 64bit.

free
             total       used       free     shared    buffers     cached
Mem:       6114284    5726984     387300          0     141612    4985384
-/+ buffers/cache:     599988    5514296
Swap:       524284       5804     518480

Meu php.ini max_input_time = 60

Minha configuração nginx é

worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 19000;
    # multi_accept on;
}
worker_rlimit_nofile    20000;  #each connection needs a filehandle (or 2 if you are proxying)

client_max_body_size 30M;
client_body_timeout   10;
client_header_timeout 10;
keepalive_timeout     5 5;
send_timeout          10;

    location ~ \.php$ {
    try_files $uri /er/error.php;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 256 16k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_max_temp_file_size 0;
    fastcgi_intercept_errors on;
    fastcgi_pass unix:/tmp/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

O que posso fazer para parar de ficar sem conexões? Por que isso continua ocorrendo? Estou monitorando meu tráfego no Google Analytics em tempo real e, quando a contagem de usuários ultrapassa os 120, meu php-fpm.log está cheio desses avisos.

Respostas:


5

Você já pensou em seguir os bons conselhos fornecidos na mensagem de log, aumentando o valor de pm.max_children? Você tem um monte de RAM grátis para acomodá-los.

Para responder suas perguntas:

  • O que posso fazer para parar de ficar sem conexões? Provisione mais conexões ou reduza o número de conexões que você recebe.
  • Por que isso continua ocorrendo? Porque você continua ficando sem conexões.

Desculpe, esse erro foi marcado com carimbo de data e hora depois de atualizá-lo para 150 de 100 .... Sim, eu tenho. Em que configuração devo configurá-lo para todo o meu carneiro?
E3pO

Você deve aumentá-lo para (free/mem_per_worker)+150, onde freeestá a quantidade de memória que você terá depois de levar em conta as necessidades de outros processos cujos requisitos de memória aumentarão com mais carga e mem_per_workeré a quantidade máxima de memória que você prevê que cada processo de trabalho PHP exige.
Womble

4

Tivemos o mesmo problema em nossos servidores da web.

Você pode tentar reaparecer o processo filho a cada pedido do X, para evitar vazamentos de memória. Funcionou bem no Apache e no FPM, está começando a funcionar bem também.

 pm.max_requests = 50000

Isso reiniciará um processo filho a cada 50 mil solicitações

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.