performance - Equilibrio de carga de la CPU Node.js
jmeter cpu-usage (3)
¿Está utilizando el módulo de cluster
para equilibrar la carga y el Nodo 0.10.x?
Si es así, actualice su node.js a 0.11.x.
El nodo 0.10.x utilizaba el algoritmo de equilibrio proporcionado por un sistema operativo. En 0.11.x, el algoritmo se modificó , por lo que estará distribuido de forma más uniforme a partir de ahora.
Creé la prueba con JMeter para probar el rendimiento de la plataforma de blogs Ghost. Ghost escrito en Node.js y se instaló en el servidor de la nube con 1Gb de RAM, 1 CPU.
Me di cuenta después de que 400 usuarios simultáneos obtuvieron errores de JMeter. Hasta 400 usuarios simultáneos de carga es normal. Decido aumentar la CPU y agregué 1 CPU.
Pero los errores se reprodujeron y agregaron 2 CPU, totalmente 4 CPU. El problema está ocurriendo después de 400 usuarios simultáneos.
No entiendo por qué 1 CPU puede manejar 400 usuarios y los mismos resultados con 4 CPU.
Durante la supervisión noté que solo una CPU está ocupada y otras 3 CPU están inactivas. Cuando verifico el resumen de JMeter en la consola, hubo errores, alrededor del 5% de la solicitud. Ver captura de pantalla.
Me gustaría saber si es posible equilibrar la carga entre las CPU.
Utilice el núcleo del clúster y para el equilibrio de carga nginx. Eso es mala parte de node.js. Fantástico marco, pero el desarrollador tiene que entrar en el desorden de equilibrio de carga. Mientras que Java y otros tiempos de ejecución son sin fisuras. De todos modos, nada es perfecto.
Node.js es famoso por tener un único subproceso (ver esta respuesta ): un proceso de nodo único solo usará un núcleo (consulte esta respuesta para obtener un aspecto más profundo), por lo que verá que su programa usa completamente un núcleo, y que todos los otros núcleos están inactivos.
La solución habitual es utilizar el módulo central del cluster
de Node, que le ayuda a iniciar un clúster de procesos Node para gestionar la carga, permitiéndole crear procesos secundarios que comparten todos los mismos puertos de servidor.
Sin embargo, no puedes usar esto sin arreglar el código de Ghost. Una opción es usar pm2
, que puede envolver un programa de nodo, utilizando el módulo de clúster por usted. Por ejemplo, con cuatro núcleos:
$ pm2 start app.js -i 4
En teoría, esto debería funcionar, excepto si Ghost depende de algunas variables globales (que no pueden ser compartidas por cada proceso).