Usar o comando `top` mostra que os processos PHP FPM usam mais memória do que a disponível

Usar o comando `top` mostra que os processos PHP FPM usam mais memória do que a disponível

Eu liesta resposta sobre compreensãotop, assim como man top, mas acho que ainda tenho dificuldade em transformar os dados apresentados topem 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 toppara mostrar apenas os php-fpmprocessos:

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:

  1. O que a VIRTcoluna exibena verdade? Entendo que é memória virtual, mas na linha 2 do resumo da memória, posso ver que existe 1052.0 avail Mem, enquanto os processos na VIRTcoluna somam muito mais do que isso.
  2. Como há 1052.0memória virtual/swap disponível, enquanto há 0.0total?
  3. Como só 692.3a memória é usada, quando a soma da %MEMcoluna é 88.6%? Não deveria ser pelo menos 1935 * 0.886 = 1714? Parece que chego perto desse número se somar a 1065.7 buff/cachethey 692.3, mas qual é a razão por trás disso?
  4. Por que o processo mestre está inativo (conforme indicado na Scoluna)? Não deveria pelo menosistoestar correndo?

Minha principal preocupação

A memory_limitconfiguraçã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 = 8960Ma memória. Isso é muito mais do que 1935Mtenho no total.

Além disso, a soma total da memória na REScoluna é 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 256Mpara 128Me reduzir pm.max_childrendo padrão 50para, 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 REScoluna, ela deverá estar alinhada com o total de usede buff/cache. Isso ocorre porque buff/cacherepresenta os dados usados ​​para esses processos e, embora não estejam disponíveis imediatamente, deverão estar disponíveis em breve.

Quanto a memory_limite 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_childrenseu 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.

informação relacionada