PHP5-fpm fora de controle - otimizar a configuração

1

Eu tenho um site com cerca de 80K de visitantes (diariamente).

Este site está hospedado no linode.com e tem um nodebalancer (o mesmo que um loadbalancer) com 3nodes atrás dele (2x linode 512 & 1x linode 1024).

Às vezes, o tráfego está me matando e meus servidores não respondem (/ ping não funciona mais e força meu balanceador de nó a tirar o nó da rotação).

Estou procurando uma maneira de descobrir como gerenciar a carga. Eu já estou procurando no www.slow.log, para descobrir possíveis causas de processos duradouros. Talvez vocês possam me ajudar a otimizar minhas configurações para minhas máquinas?

Minha configuração atual:

[www]
user = www-data
group = www-data

listen = 127.0.0.1:9000


pm = dynamic
pm.max_children = 70
pm.start_servers = 10
pm.min_spare_servers = 6
pm.max_spare_servers = 15
pm.process_idle_timeout = 10s;
pm.max_requests = 200
pm.status_path = /status
ping.path = /ping
ping.response = pong
slowlog = /var/log/$pool.log.slow
request_slowlog_timeout = 60
chdir = /
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on

EDITAR

Aqui está o topo de uma máquina que está construindo uma carga operacional

> top - 12:33:41 up 35 days, 44 min, 12 users,  load average: 8.57,
> 12.83, 12.21 Tasks: 193 total,   6 running, 187 sleeping,   0 stopped,   0 zombie Cpu(s): 36.6%us,  4.2%sy,  0.0%ni, 30.1%id,  0.0%wa,  0.0%hi,
> 0.6%si, 28.5%st Mem:   1027516k total,   603048k used,   424468k free,   149040k buffers Swap:   524284k total,   110392k used,   413892k free,
> 54064k cached
> 
>   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND  
> 31585 www-data  20   0 70600  16m 4388 R   37  1.7   0:09.92 php5-fpm 
> 31558 www-data  20   0 71352  17m 4344 R   33  1.7   0:18.18 php5-fpm 
> 31581 www-data  20   0 66480  13m 4312 S   22  1.3   0:12.08 php5-fpm 
> 31555 www-data  20   0 66220  12m 4344 S   19  1.3   0:16.51 php5-fpm 
> 31578 www-data  20   0 67244  13m 4352 S   19  1.4   0:10.53 php5-fpm 
> 31604 www-data  20   0 66992  13m 4180 S   15  1.3   0:05.31 php5-fpm 
> 31556 www-data  20   0 67244  13m 4324 S   15  1.4   0:16.53 php5-fpm 
> 31557 www-data  20   0 66476  12m 4340 R   13  1.3   0:17.35 php5-fpm 
> 31602 www-data  20   0 66468  13m 4320 S   12  1.3   0:06.59 php5-fpm 
> 31582 www-data  20   0 67244  13m 4328 S   11  1.4   0:11.18 php5-fpm 
> 31579 www-data  20   0 69328  15m 4344 R   11  1.6   0:10.76 php5-fpm 
> 31586 www-data  20   0 66736  13m 4308 S    9  1.3   0:08.17 php5-fpm 
> 31603 www-data  20   0 67504  14m 4324 S    8  1.4   0:06.35 php5-fpm 
> 31580 www-data  20   0 67244  13m 4336 S    7  1.4   0:11.06 php5-fpm 
> 31583 www-data  20   0 66736  13m 4300 S    7  1.3   0:10.80 php5-fpm 
> 31584 www-data  20   0 68024  14m 4356 S    6  1.4   0:10.17 php5-fpm 
> 31587 www-data  20   0 66736  13m 4328 S    6  1.3   0:08.18 php5-fpm 
> 31574 www-data  20   0 57856  52m  816 S    2  5.2   0:01.75 nginx    
> 31634 ward      20   0  2520 1040  736 R    1  0.1   0:00.09 top      
> 15554 ward      20   0  2520  552  264 R    1  0.1  59:04.40 top      
> 1023 root       0 -20     0    0    0 S    0  0.0  18:19.96
> kworker/0:1H                                                          
> 31575 www-data  20   0 57856  52m  808 S    0  5.2   0:00.53 nginx    
> 31607 ward      20   0  8868 1292  772 S    0  0.1   0:00.01 sshd     
> 
>     1 root      20   0  2088  120  120 S    0  0.0   0:46.60 init                                                                                                                                                                                                                                                            
>     2 root      20   0     0    0    0 S    0  0.0   0:03.17 kthreadd

EDIT2: Feedback sobre a solução por growse

Eu troquei os 3 servidores para pools estáticos. Parece que a carga está melhor sob controle agora. Eu também aumento os max_requests para 5000.

Você pode ver as estatísticas do pool de cada servidor abaixo:

Servidor1: 1024 máquina

pool:                 www
process manager:      static
start time:           30/Dec/2012:12:48:23 +0100
start since:          489
accepted conn:        4311
listen queue:         0
max listen queue:     0
listen queue len:     128
idle processes:       35
active processes:     15
total processes:      50
max active processes: 35
max children reached: 0

Servidor2: 512 máquina

pool:                 www
process manager:      static
start time:           30/Dec/2012:12:45:40 +0100
start since:          709
accepted conn:        11010
listen queue:         0
max listen queue:     9
listen queue len:     128
idle processes:       33
active processes:     7
total processes:      40
max active processes: 40
max children reached: 0

Servidor3: 512 máquina

pool:                 www
process manager:      static
start time:           30/Dec/2012:12:38:25 +0100
start since:          1159
accepted conn:        21645
listen queue:         0
max listen queue:     129
listen queue len:     128
idle processes:       35
active processes:     5
total processes:      40
max active processes: 40
max children reached: 0

Todos os servidores estão sendo mais estáveis agora com uma carga em torno de 1-2.

    
por Ward Loockx 30.12.2012 / 11:58

1 resposta

2

Eu vou sair em um membro depois de pensar sobre os comentários e sugerir três coisas:

  1. Alternar de um pool dinâmico para um pool estático : supondo que você tenha um único pool FPM e seu servidor não esteja fazendo muito mais, não há muitos motivos para continuar expandindo e o número de processos que você está usando. Escolha um número de filhos, gire muitos processos e depois o deixe.

  2. Tem muito menos processos filho : em última análise, o seu VPS tem um par de CPUs no máximo. Cada processo filho do FPM pode manipular uma solicitação de uma só vez, outras são colocadas na fila atrás. Todos com muitos processos aceitam muitos pedidos da fila e, em seguida, os forçam a competir pelo uso da CPU. Você pode ter melhores resultados se tiver um pool menor e deixar a fila de tráfego aumentar.

  3. Aumente a vida útil dos processos filhos do FPM : você está matando cada filho no momento, já que ele atendeu a 200 solicitações. Isso não é um grande número, e uma explosão de tráfego pode ver uma enxurrada de processos infantis sendo mortos e reabertos, o que apenas adiciona sobrecarga. Aumente isso para um valor maior (digamos, 5000) e veja o que acontece.

Vale a pena ressaltar que é difícil saber se essas sugestões funcionarão, porque eu realmente não sei qual é o problema (pode ser um hardware defeituoso ou algo totalmente diferente). Isso parece sensato para mim: experimente e veja se funciona para você em seu ambiente.

    
por 30.12.2012 / 12:30

Tags