Flutuação ímpar de desempenho com o php-fpm e o nginx

6

Estou executando um teste de carga em um serviço da web. É um aplicativo PHP rodando em php-fpm e nginx, com fastcgi. Há um backend do MySQL sendo usado apenas para pequenas leituras.

Invariavelmente, estou vendo um padrão peculiar: o desempenho é estável e aumenta de maneira previsível conforme o tráfego aumenta, mas se torna instável no pico: o uso da CPU flutua constantemente.

Aqui está o padrão de desempenho que estou vendo (visualizado com nmon ):

Odrop-offsemprecoincidecomabrevepausaqueminhaferramentadetestedecarga-locust.io-temquandoterminadesubirparaoníveldepicoquedefiniparaoteste.

Minhahipótese:Duranteestebrevemomento,omestrephp-fpmachaqueacargadesapareceuecomeçouamatartrabalhadores;elenãoconseguerespondercomrapidezsuficientequandootráfegovoltaatodovaporummomentodepois.

Oqueeunãoentendomuitobeméporquenuncaécapazdevoltaraoritmo:vejoessaflutuaçãoindefinidamentenos4servidoresdeaplicativosatrásdobalanceadordecarga.

Aquiestáminhaconfiguraçãodopooldophp-fpm:

[www]user=www-datagroup=www-datalisten=/var/run/php5-fpm.socklisten.group=www-datalisten.mode=0660pm=dynamicpm.max_children=100pm.start_servers=40pm.min_spare_servers=40pm.max_spare_servers=100pm.max_requests=10000

Eujáconfirmeiquenãoéumproblemacomobancodedados-euviexatamenteomesmocomportamentodepoisdedobraronúmerodeescravosdeleituradoMySQL.

Oqueestácausandoisso?Comopossopará-lo?

EDITAR:

Aquiestáumgráficoquedemonstraoqueestouvendo.Observequeataxadefalhasgeralmenteaumentaquandoauser_countatingeopico,egradualmenteseestabilizanovamente.

    
por Cera 29.10.2014 / 05:04

2 respostas

1

E o seu gerenciamento de memória? Nas últimas semanas fiz alguns testes simlar e coloquei um servidor no limite. Eu vi muitas mudanças na memória. No meu caso, uma quantidade enorme de dados foi trazida para o swap em vez da RAM para lidar com a carga. Depois de um teste eu tive um resultado muito estranho, nenhuma RAM foi usada mais e tudo foi levado para o swap. Talvez seja isso que as seguintes solicitações estão diminuindo.

Esta é uma imagem de exemplo de como minha troca ficou depois de um teste de carga

    
por 27.03.2016 / 07:33
0

O que está acontecendo com o disco IO e o bloqueio? Presumivelmente, se o seu processo está ligado à CPU até um ponto em que isso muda, então algo mais está ocupado e é mais provável que seja o seu disco.

Você está atingindo limites de memória que poderiam fazer com que você iniciasse a troca? Quanta RAM seus processos PHP usam (RSS)? Quanta RAM você tem disponível? Você consegue um desempenho similarmente flutuante se você derrubar o número de processos PHP? Em que nível a flutuação aparece?

Note que pm.max_children = 100 é provavelmente muito alto. A menos que você esteja lidando com solicitações de longa duração, como grandes downloads, provavelmente é melhor reduzi-lo bastante. Hesito em especificar um número sem saber o que o sistema está fazendo, mas provavelmente algo na faixa 5-40 funcionará muito melhor. É provável que pm.max_requests seja alto demais. Você provavelmente descobrirá que obtém pouco benefício, e mais provavelmente degradação significativa se exceder 100 ou mais, e se o que está sendo executado pelo php é altamente variável e consome memória, ou se você tem vazamentos de memória, então você fará melhor reduzindo-o um pouco mais. Se você realmente não sabe o que funciona, comece com cada uma dessas configurações por volta de 30 e experimente.

O PHP está gerando sessões? Como eles são armazenados? Se eles estão em um sistema de arquivos, que tipo de sistema de arquivos é? Em alguns casos, você obtém um gargalo com o bloqueio no diretório em que eles estão. Usando uma estrutura de diretórios hash para eles ou usando, por exemplo, memcached pode ajudar com isso.

O que strace executa no relatório de processos do PHP está demorando? Você pode ver isso com um comando composto ao longo destas linhas:

(ps wwaux | grep '^www-data.*php' |  awk '{print $2}' \
  | xargs -n 1 -P 32 strace -r -p ) 2>&1 
  | perl -ne '($n) = /^ *(\d*\.\d*)/; print "$n\t$_" if ((defined $n) and ($n > 0.01))'
    
por 21.06.2015 / 21:22