¿Cómo detectar y medir el bloqueo del bucle de eventos en node.js?
npm blocking (3)
Código
este código medirá el tiempo en nanosegundos que tardó en activarse el bucle de eventos. mide el tiempo entre el proceso actual y el siguiente tick.
var time = process.hrtime();
process.nextTick(function() {
var diff = process.hrtime(time);
console.log(''benchmark took %d nanoseconds'', diff[0] * 1e9 + diff[1]);
// benchmark took 1000000527 nanoseconds
});
EDITAR: explicación adicional,
process.hrtime ([tiempo])
Devuelve el tiempo real de alta resolución actual en una matriz de tupla de [segundos, nanosegundos]. time es un parámetro opcional que debe ser el resultado de una llamada de process.hrtime () anterior (y, por lo tanto, un tiempo real en una matriz de tuplas [segundos, nanosegundos] que contiene una hora anterior) para diferir con la hora actual. Estos tiempos son relativos a un tiempo arbitrario en el pasado, y no están relacionados con la hora del día y, por lo tanto, no están sujetos a la tendencia del reloj. El uso principal es para medir el rendimiento entre intervalos.
process.nextTick (devolución de llamada [, arg] [, ...])
Una vez que el giro del bucle de evento actual se complete, llame a la función de devolución de llamada.
Este no es un simple alias para setTimeout (fn, 0), es mucho más eficiente. Se ejecuta antes de que se activen eventos de E / S adicionales (incluidos los temporizadores) en tics subsiguientes del bucle de eventos.
Me gustaría monitorear cuánto tiempo toma cada ciclo del evento en node.js. Sin embargo, no estoy seguro acerca de la mejor manera de medir esto. La mejor manera en la que podría encontrar un aspecto así:
var interval = 500;
var interval = setInterval(function() {
var last = Date.now();
setImmediate(function() {
var delta = Date.now() - last;
if (delta > blockDelta) {
report("node.eventloop_blocked", delta);
}
});
}, interval);
Básicamente, deduzco el tiempo de ejecución del bucle de eventos observando el retraso de un setInterval
. He visto el mismo enfoque en el módulo de nodo blocked , pero se siente impreciso y pesado. ¿Hay una mejor manera de obtener esta información?
Actualización: se cambió el código para usar setImmediate
como lo hizo hapi.js.
"¿Hay una mejor manera de obtener esta información?" No tengo una manera mejor de probar el bucle de eventos que el retraso de tiempo de SetImmediate, pero puede obtener una mayor precisión utilizando el temporizador de alta resolución del nodo en lugar de Date.now()
var interval = 500;
var interval = setInterval(function() {
var last = process.hrtime(); // replace Date.now()
setImmediate(function() {
var delta = process.hrtime(last); // with process.hrtime()
if (delta > blockDelta) {
report("node.eventloop_blocked", delta);
}
});
}, interval);
NOTA: delta será una matriz de tuplas [segundos, nanosegundos].
Para obtener más detalles sobre process.hrtime (): https://nodejs.org/api/all.html#all_process_hrtime
"El uso principal es para medir el rendimiento entre intervalos".
También es posible que desee ver el perfil integrado en node
y io.js
Consulte, por ejemplo, este artículo http://www.brendangregg.com/flamegraphs.html
Y esta respuesta de SO relacionada Cómo depurar aplicaciones de Node.js