he leídoesta respuesta sobre la comprensióntop
, así como man top
, pero creo que todavía tengo problemas para convertir los datos presentados top
en 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 top
para mostrar solo los php-fpm
procesos:
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:
- ¿Qué
VIRT
muestra la columna?de hecho? Entiendo que es memoria virtual, pero en la línea 2 del resumen de memoria, puedo ver que hay1052.0 avail Mem
, mientras que los procesos en laVIRT
columna suman mucho más que eso. - ¿Cómo hay
1052.0
memoria virtual/de intercambio disponible, mientras hay0.0
total? - ¿Cómo
692.3
se usa solo la memoria cuando la suma de la%MEM
columna es88.6%
? ¿No debería serlo al menos1935 * 0.886 = 1714
? Parece que me acerco a ese número si1065.7 buff/cache
los agrego692.3
, pero ¿cuál es la razón detrás de esto? - ¿Por qué el proceso maestro está inactivo (como lo indica la
S
columna)? ¿No debería al menosélestar corriendo?
mi principal preocupación
La memory_limit
configuració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 = 8960M
la memoria. Eso es mucho más de lo que 1935M
tengo en total.
Además, la suma total de memoria en la RES
columna 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 256M
a 128M
y reducirla pm.max_children
del valor predeterminado 50
a, 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 RES
columna, debería alinearse con el total de used
y buff/cache
. Esto se debe a que buff/cache
representan datos utilizados para esos procesos y, si bien no están disponibles de inmediato, deberían estar disponibles en breve.
En cuanto a memory_limit
y 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_children
tu 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.