nodejs - Utilización de la CPU de Node.js en Amazon EC2
nodejs server aws (5)
Si tengo un servidor de nodo en ejecución en una instancia de amazon EC2 con 4 unidades de cómputo EC2, ¿funcionará más rápido / manejará más carga que si tuviera 2 unidades de cómputo EC2?
No, si está utilizando node.js en una capacidad de servidor, solo tendrá acceso a un solo núcleo.
var http = require(''http'');
http.createServer(function (req, res) {
res.writeHead(200, {''Content-Type'': ''text/plain''});
res.end(''Hello World/n'');
}).listen(1337, "127.0.0.1");
console.log(''Server running at http://127.0.0.1:1337/'');
Genera un solo oyente, aunque eso no significa solo una conexión. Node.js rompe el pensamiento convencional de esa manera. Event Loop no bloqueará las conexiones a menos que codifiques incorrectamente. Esta publicación ayuda a explicar el bucle de eventos y lo importante que es entenderlo. Me tomó un tiempo para realmente "captar" las implicaciones.
¿La utilización de la CPU en Amazon requiere que un programa sea multiproceso para usar todos los recursos?
Sí, apache / nginx correctamente configurado aprovechará las configuraciones multi-cpu. Se están developed servidores node.js que también aprovecharán este tipo de configuraciones.
Al ver cómo el nodo tiene un solo hilo, si tengo un servidor de nodo ejecutándose en una instancia de amazon EC2 con 4 unidades de cómputo EC2, ¿se ejecutará más rápido / manejará más carga que si tuviera 2 unidades de cómputo EC2?
¿La utilización de la CPU en Amazon requiere que un programa sea multiproceso para usar todos los recursos?
El concepto de Amazon de "unidades de cómputo EC2" totales para un tipo de instancia no se asigna directamente a una CPU o núcleo. Es el número de núcleos multiplicado por la velocidad de cada núcleo en unidades de cómputo EC2 (su propia medida relativa).
Amazon hace una lista de cuántos núcleos virtuales tiene cada tipo de instancia:
http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?instance-types.html
Su mejor opción es utilizar todos los núcleos como otros lo señalan. Sin embargo, si termina con una solución de un solo subproceso, entonces querrá concentrarse en la velocidad de los núcleos individuales, no en las unidades de cómputo EC2 totales de todos los núcleos sumados.
En Node.js, su código es de un solo hilo, pero las llamadas que, por ejemplo, acceden al sistema de archivos o un servidor de base de datos no utilizan el hilo principal de node.js. El subproceso principal sigue ejecutándose mientras que otros subprocesos esperan que se lean 4 GB del disco a la RAM o que el servidor DB devuelva una respuesta. Una vez que la acción finaliza, la devolución de llamada suministrada se pone en una cola para ejecutarse en el hilo principal. Más o menos, de todos modos.
La ventaja es que en una situación de servidor, tiene un subproceso muy rápido que puede manejar miles de solicitudes simultáneas sin poner en espera ninguno completamente o generar un subproceso del sistema operativo para cada ciclo de solicitud-respuesta del cliente.
Más concretamente, debería evaluar su caso de uso específico en EC2: varios procesadores pueden ser útiles cuando se ejecuta una única instancia de nodo si la aplicación realiza una gran cantidad de IO.
La respuesta corta a su pregunta es que agregar más núcleos para mejorar el rendimiento de su nodo no funcionará, si todo lo que hace es escribir javascript de un solo hilo "estándar" (estará vinculado por una sola CPU).
La razón es que node.js utiliza un bucle de eventos para el procesamiento, por lo que si todo lo que está haciendo es iniciar un solo proceso node.js sin nada más, no será multiproceso y, por lo tanto, no utilizará más de una CPU (núcleo). ).
Sin embargo , puede utilizar la API de clúster node.js para bifurcar el proceso del nodo para poder aprovechar varias CPU (núcleos): https://nodejs.org/docs/latest/api/cluster.html . Si escribe su código de esa manera, entonces le ayudará tener más unidades de cómputo.
Hay una advertencia, ya que las unidades de cómputo EC2 se detallan por instancia . Para algunos casos, puede obtener más "unidades de cómputo" por núcleo virtual. Entonces, si elige una instancia que tiene 2 unidades de cómputo por núcleo virtual en comparación con una que tiene una por núcleo , podrá ejecutar el nodo en una CPU que tenga más unidades de cómputo. Sin embargo, parece que después de 2 unidades de cómputo, la potencia de cálculo se divide por núcleo, lo que significa que no obtendrá ningún beneficio de los múltiples núcleos.
Para utilizar completamente los recursos informáticos de N núcleos, necesita al menos N hilos listos para realizar un trabajo útil. Esto no tiene nada que ver con EC2; Es así como funcionan las computadoras. Supongo que de su pregunta, usted está eligiendo entre los tipos de instancia m1.medium
y m1.large
, que tienen 1 y 2 núcleos dedicados, respectivamente (la m1.small
es la mitad de un núcleo compartido, y la m1.xlarge
es la totalidad caja dedicada de 4 núcleos). Por lo tanto, necesita al menos 2 procesos que realicen un trabajo útil para utilizar el cuadro más grande (a menos que solo desee acceder a más memoria / io).
Cada proceso Node.js es de un solo hilo por diseño. Esto le permite proporcionar un paradigma de programación limpio y libre de semánticas de bloqueo. Esto es mucho por diseño.
Para que una aplicación Node.js utilice múltiples núcleos, debe generar múltiples procesos. Luego, estos procesos usarían algún tipo de mensajería (tuberías, sockets, etc.) para comunicarse, en lugar de "memoria compartida", donde el código puede mutar directamente las ubicaciones de la memoria visibles para varios procesos, algo que requeriría bloquear la semántica.
En la práctica, esto es muy fácil de configurar. De vuelta en Node.JS v0.6.X, el módulo "clúster" se integró en la distribución estándar, facilitando la configuración de varios trabajadores de nodo que pueden escuchar en un solo puerto. Tenga en cuenta que este módulo de "clúster" NO es el mismo que el módulo de "clúster" de learnboost, que tiene una API diferente y posee el nombre de "clúster" en el registro NPMjs.
http://nodejs.org/docs/latest/api/cluster.html
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.Server(function(req, res) { ... }).listen(8000);
}