El uso del comando `top` muestra los procesos PHP FPM que utilizan más memoria de la disponible

El uso del comando `top` muestra los procesos PHP FPM que utilizan más memoria de la disponible

he leídoesta respuesta sobre la comprensióntop, así como man top, pero creo que todavía tengo problemas para convertir los datos presentados topen información real.

He iniciado sesión en una instancia de Amazon EC2 que forma parte de un grupo con equilibrio de carga. Está ejecutando PHP FPM y lo he filtrado toppara mostrar solo los php-fpmprocesos:

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

Esto es lo que no entiendo:

  1. ¿Qué VIRTmuestra la columna?de hecho? Entiendo que es memoria virtual, pero en la línea 2 del resumen de memoria, puedo ver que hay 1052.0 avail Mem, mientras que los procesos en la VIRTcolumna suman mucho más que eso.
  2. ¿Cómo hay 1052.0memoria virtual/de intercambio disponible, mientras hay 0.0total?
  3. ¿Cómo 692.3se usa solo la memoria cuando la suma de la %MEMcolumna es 88.6%? ¿No debería serlo al menos 1935 * 0.886 = 1714? Parece que me acerco a ese número si 1065.7 buff/cachelos agrego 692.3, pero ¿cuál es la razón detrás de esto?
  4. ¿Por qué el proceso maestro está inactivo (como lo indica la Scolumna)? ¿No debería al menosélestar corriendo?

mi principal preocupación

La memory_limitconfiguración en PHP ini está establecida en 256M. Eso debería significar que cada proceso hijo generado por FPM podría usar hasta esa cantidad de memoria, ¿correcto? Si eso es correcto y tengo 35 procesos secundarios (como lo muestra actualmente top), entonces, en teoría, podrían usar (o intentar usar) hasta 35 * 256 = 8960Mla memoria. Eso es mucho más de lo que 1935Mtengo en total.

Además, la suma total de memoria en la REScolumna es 1749.6. En otras palabras, la memoria utilizada es 1749/1935 = 90.38%. ¡Pero entonces es cuando todos los procesos están en estado de suspensión! Si hay un aumento en el tráfico y el consumo de memoria aumenta repentinamente, suena desastroso.

Pienso en reducir la memoria permitida de 256Ma 128My reducirla pm.max_childrendel valor predeterminado 50a, digamos, 12. De esta forma, el consumo total de memoria posible de PHP FPM sería 12 * 128 = 1536M, el cual estará dentro de la memoria real disponible en el sistema. ¿Tiene sentido?

Respuesta1

Algunas cosas a considerar. En primer lugar, verá 692.3 used, pero también debe tener en cuenta 1065.7 buff/cache. Si suma la REScolumna, debería alinearse con el total de usedy buff/cache. Esto se debe a que buff/cacherepresentan datos utilizados para esos procesos y, si bien no están disponibles de inmediato, deberían estar disponibles en breve.

En cuanto a memory_limity pm.max_children: puede ejecutar el script que consume más recursos en su aplicación y medir su uso de memoria usandouna memoria_get_peak_usage().

Tome ese valor, agregue algo de capacidad para el crecimiento de su conjunto de datos y ahora tendrá una memoria máxima realista necesaria por secuencia de comandos. Con esa cifra ahora puedes estimar lo que pm.max_childrentu servidor puede manejar. Ajuste esta cifra hacia abajo para permitir otros procesos en su servidor.

Ahora también puede establecer un valor más preciso memory_limit, pero tenga en cuenta que si se incumple este valor, el script dejará de funcionar. Encuentro que a menudo funciona mejor como control para evitar que los scripts fuera de control acaben con su servicio y lo configuro en un nivel más alto que mis scripts que requieren más memoria para permitir trabajos futuros más complejos.

También debe verificar las variables fpm (pm.*) y ajustarlas en consecuencia.

información relacionada