Estoy un poco confundido con lo que veo con un proceso de nodo que tengo en ejecución. docker stats en el host muestran que el contenedor usa más del 100 % de la CPU. Esto me hace pensar que el proceso del nodo está maximizando la CPU. Esto se confirma cuando ejecuto la top del host y veo que el proceso del nodo usa más del 100 % de la CPU.
Cuando entro en el contenedor docker, veo que el nodo solo usa el 54 % de la CPU y que el procesamiento se divide entre los dos núcleos. Esperaba ver un núcleo al máximo y el otro a 0, ya que Node es de un solo subproceso.
Encontré este control de calidad y parece que el sistema operativo podría estar moviendo el proceso entre los núcleos (noticias para mí). ¿Esta aplicación Single Node.JS utiliza varios núcleos?
¿Me pueden ayudar a interpretar los resultados? ¿Está el nodo bastante al máximo? O dado que el proceso en el contenedor muestra un uso del 54 %, ¿puede llegar al 100 %? ¿Por qué la parte superior del contenedor de nodos muestra un uso del 54 % para el nodo, pero un 45 % + 46 % para ambos núcleos? Nada se ejecuta en el contenedor, excepto el proceso de un solo nodo. No estoy usando la agrupación en clústeres, aunque tal vez un paquete que he incluido sí lo esté.
Estoy preguntando todo esto porque estoy tratando de entender si debería escalar esta instancia de ECS o si el nodo puede manejar más.
Node.JS: 15.1.0 EC2 Instance: c5.large NestJS: 7.3.1top diferentes Lo que está viendo se debe (probablemente) a una diferencia en los sabores de top .
Voy a hacer una suposición descabellada y decir que su imagen de Docker quizás esté basada en Alpine. El comando top en Alpine es busybox . Informa el uso de CPU por proceso como un porcentaje del número TOTAL de CPU disponibles (nCPU * 100%).
Esto difiere de la mayoría de los otros tipos de top , que informan el uso de CPU por proceso como un porcentaje de UNA SOLA CPU.
Las dos capturas de pantalla top en realidad muestran lo mismo: el proceso del node usa aproximadamente el 50% de cada una de las 2 CPU.
Podemos probar esto con lo siguiente:
# This will max out 1 cpu of the system docker run --name stress --rm -d alpine sh -c 'apk add stress-ng && stress-ng --cpu 1' # This shows the busybox top with usage as ratio of total CPUs # press 'c' in top to see the per-CPU info at the top docker exec -it stress top # This will install and run procps top, with usage as a ratio of single CPU docker exec -it stress sh -c 'apk add procps && /usr/bin/top' En la captura de pantalla anterior, podemos ver dos sabores diferentes de top . Están informando el mismo uso de CPU, pero el superior informa esto como "100 % de CPU" (como porcentaje de un solo núcleo), mientras que el inferior informa esto como 6 % (1/16 núcleos = 6,25 %).
node ? El nodo es de subproceso único y no puede utilizar más del 100 % de una CPU. ...algo así como. Debajo del capó, Node usa libuv , que ejecuta subprocesos en silos. Así es como Node recibe eventos asíncronos para operaciones IO, por ejemplo. Estos subprocesos usan CPU y pueden impulsar su uso de CPU por encima del 100%. Algunos paquetes también se escriben como complementos para Node y estos también usan subprocesos.
La variable de entorno UV_THREADPOOL_SIZE limita el número máximo de subprocesos controlados por libuv que pueden ejecutarse simultáneamente. Establecer esto en un número mayor (el valor predeterminado es 4) antes de ejecutar el nodo puede eliminar un cuello de botella.
Si está realizando algunas operaciones que requieren un uso intensivo de la CPU, considere usar cluster , Worker Threads , escribir su propio complemento o generar procesos separados para realizar el cálculo.