Eu liesta resposta sobre compreensãotop
, assim como man top
, mas acho que ainda tenho dificuldade em transformar os dados apresentados top
em informações reais.
Estou conectado a uma instância do Amazon EC2 que faz parte de um grupo com balanceamento de carga. Está rodando PHP FPM e filtrei top
para mostrar apenas os php-fpm
processos:
top - 11:27:43 up 18:59, 2 users, load average: 0.59, 0.79, 0.74
Tasks: 171 total, 1 running, 125 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 9.1 sy, 0.0 ni, 90.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1935.6 total, 177.7 free, 692.3 used, 1065.7 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1052.0 avail Mem
PID USER PR VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1566 root 20 356.2m 30.5m 23.5m S 1.6 0:02.14 php-fpm: master process (/etc/php-fpm.conf)
2188 webapp 20 442.2m 51.3m 31.8m S 2.7 2:18.47 php-fpm: pool www
2189 webapp 20 442.1m 50.8m 30.4m S 2.6 2:19.21 php-fpm: pool www
2190 webapp 20 444.2m 52.6m 30.4m S 2.7 2:20.14 php-fpm: pool www
2191 webapp 20 442.1m 51.1m 31.3m S 2.6 2:22.69 php-fpm: pool www
2192 webapp 20 442.2m 50.8m 31.6m S 2.6 2:19.64 php-fpm: pool www
2193 webapp 20 436.3m 46.5m 32.0m S 2.4 2:17.29 php-fpm: pool www
2194 webapp 20 452.2m 60.6m 30.4m S 3.1 2:19.82 php-fpm: pool www
2195 webapp 20 438.1m 48.0m 31.6m S 2.5 2:17.78 php-fpm: pool www
2197 webapp 20 442.2m 50.9m 30.6m S 2.6 2:18.28 php-fpm: pool www
12626 webapp 20 443.6m 50.4m 28.4m S 2.6 0:37.02 php-fpm: pool www
12627 webapp 20 443.5m 50.3m 28.6m S 2.6 0:35.68 php-fpm: pool www
12628 webapp 20 438.0m 45.1m 29.1m S 2.3 0:36.28 php-fpm: pool www
12629 webapp 20 443.9m 51.4m 29.3m S 2.7 0:35.26 php-fpm: pool www
12630 webapp 20 441.6m 48.9m 29.5m S 2.5 0:34.90 php-fpm: pool www
12631 webapp 20 443.6m 50.5m 28.7m S 2.6 0:34.93 php-fpm: pool www
12632 webapp 20 436.0m 43.2m 29.1m S 2.2 0:36.01 php-fpm: pool www
12635 webapp 20 441.6m 48.1m 28.3m S 2.5 0:34.56 php-fpm: pool www
12636 webapp 20 446.1m 55.0m 30.8m S 2.8 0:37.10 php-fpm: pool www
12637 webapp 20 441.9m 48.8m 29.0m S 2.5 0:35.16 php-fpm: pool www
12639 webapp 20 443.6m 50.3m 28.5m S 2.6 0:34.23 php-fpm: pool www
12640 webapp 20 438.0m 44.7m 28.9m S 2.3 0:36.33 php-fpm: pool www
12641 webapp 20 442.8m 49.5m 28.4m S 2.6 0:35.51 php-fpm: pool www
12642 webapp 20 443.8m 50.8m 29.1m S 2.6 0:36.22 php-fpm: pool www
12643 webapp 20 438.0m 44.2m 29.2m S 2.3 0:33.49 php-fpm: pool www
12644 webapp 20 440.0m 47.4m 29.3m S 2.5 0:36.44 php-fpm: pool www
12645 webapp 20 441.6m 48.7m 29.0m S 2.5 0:34.38 php-fpm: pool www
12646 webapp 20 441.6m 48.5m 28.8m S 2.5 0:34.53 php-fpm: pool www
12647 webapp 20 437.6m 44.5m 28.5m S 2.3 0:34.73 php-fpm: pool www
12648 webapp 20 437.7m 44.4m 28.6m S 2.3 0:33.64 php-fpm: pool www
12649 webapp 20 440.0m 46.9m 29.0m S 2.4 0:35.81 php-fpm: pool www
12651 webapp 20 444.1m 51.1m 29.0m S 2.6 0:34.77 php-fpm: pool www
12652 webapp 20 439.8m 47.0m 29.1m S 2.4 0:35.02 php-fpm: pool www
12657 webapp 20 443.9m 51.7m 29.9m S 2.7 0:35.35 php-fpm: pool www
12658 webapp 20 438.0m 45.5m 29.3m S 2.3 0:34.81 php-fpm: pool www
12667 webapp 20 441.9m 49.6m 29.6m S 2.6 0:34.21 php-fpm: pool www
Aqui está o que eu não entendo:
- O que a
VIRT
coluna exibena verdade? Entendo que é memória virtual, mas na linha 2 do resumo da memória, posso ver que existe1052.0 avail Mem
, enquanto os processos naVIRT
coluna somam muito mais do que isso. - Como há
1052.0
memória virtual/swap disponível, enquanto há0.0
total? - Como só
692.3
a memória é usada, quando a soma da%MEM
coluna é88.6%
? Não deveria ser pelo menos1935 * 0.886 = 1714
? Parece que chego perto desse número se somar a1065.7 buff/cache
they692.3
, mas qual é a razão por trás disso? - Por que o processo mestre está inativo (conforme indicado na
S
coluna)? Não deveria pelo menosistoestar correndo?
Minha principal preocupação
A memory_limit
configuração no PHP ini está definida como 256M
. Isso deveria significar que cada processo filho gerado pelo FPM poderia usar tanta memória, correto? Se estiver certo e eu tiver 35 processos filhos (como mostrado atualmente por top
), então, teoricamente, eles poderiam usar (ou tentar usar) até 35 * 256 = 8960M
a memória. Isso é muito mais do que 1935M
tenho no total.
Além disso, a soma total da memória na RES
coluna é 1749.6
. Em outras palavras, a memória usada é 1749/1935 = 90.38%
. Mas é aí que todos os processos estão em estado de suspensão! Se houver um aumento no tráfego e o consumo de memória aumentar repentinamente, isso parece desastroso.
Penso em reduzir a memória permitida de 256M
para 128M
e reduzir pm.max_children
do padrão 50
para, digamos, 12
. Dessa forma, o consumo total de memória possível do PHP FPM seria 12 * 128 = 1536M
, que estará dentro da memória real disponível no sistema. Isso faz sentido?
Responder1
Algumas coisas a considerar. Em primeiro lugar, você vê 692.3 used
, mas também precisa levar em consideração 1065.7 buff/cache
. Se você somar a RES
coluna, ela deverá estar alinhada com o total de used
e buff/cache
. Isso ocorre porque buff/cache
representa os dados usados para esses processos e, embora não estejam disponíveis imediatamente, deverão estar disponíveis em breve.
Quanto a memory_limit
e pm.max_children
: Você pode executar o script com maior consumo de recursos em seu aplicativo e medir seu uso de memória usandouma memória_get_peak_usage().
Pegue esse valor, adicione alguma capacidade de crescimento ao seu conjunto de dados e agora você terá uma memória máxima realista necessária por script. Com esse número agora você pode estimar o que pm.max_children
seu servidor pode suportar. Ajuste esse valor para permitir outros processos em seu servidor.
Agora você também pode definir um valor mais preciso memory_limit
- mas esteja ciente de que violar esse valor fará com que seu script morra. Acho que muitas vezes funciona melhor como um controle para impedir que scripts descontrolados matem seu serviço e configurá-lo para um nível mais alto do que meus scripts que mais exigem memória para permitir trabalhos futuros e mais complexos.
Você também deve verificar as variáveis fpm (pm.*) e ajustar de acordo.