El documento resume una presentación sobre el bucle de eventos en Node.js. Explica que las suposiciones comunes sobre cómo funciona el bucle de eventos en Node.js son incorrectas. En realidad, solo hay un subproceso que ejecuta el código de JavaScript y el bucle de eventos, y Libuv usa estructuras de datos dedicadas en cada fase en lugar de una pila o cola. También discute cómo medir el rendimiento del bucle de eventos para detectar cuellos de botella y anomalías.
Everything I thought I knew about the Node.js event loop was wrong
1. Daniel Khan / @dkhan
Everything I thought I knew
about the Event Loop waswrong
NodeConf Argentina / Daniel Khan / 28-10-2017
Todo lo que pensé que sabía sobre el loop de eventos estaba mal
2. Daniel Khan / @dkhan
Who’s that guy?
¿Quién es ese chico?
• Developer since 1999, Node.js since 2012
Developer desde 1999, Node.js desde 2012
• Member of Node.js Diagnostics working group
Miembro del grupo de trabajo Node.js Diagnostics
• Technical Product Manager and “Node.js guy”
at Dynatrace
Director Técnico de Producto y "Node.js guy" en Dynatrace
• Lecturer for Node.js at a local university
Profesor de Node.js en una universidad local
• Course author for Lynda / LinkedIn
Autor del curso para Lynda / LinkedIn
3. Daniel Khan / @dkhanhttp://roundtripticket.me/austria-on-world-map.html
4. Daniel Khan / @dkhanhttps://laprensasa.com/culture/art-music/mozart-festival-texas-returns-uiw/
12. Daniel Khan / @dkhan
• Node.js is Evented as is JavaScript in the Browser
Node.js es Evented como es JavaScript en el navegador
• Node.js runs in a Single Thread
Node.js se ejecuta en un solo subproceso
• In Node.js all I/O is Asynchronous
En Node.js, todas las E / S son asíncronas
• Libuv provides an Event Loop and a Thread Pool to achieve all of that
Libuv proporciona un loop de eventos y un grupo de hilos para lograr todo eso
What we know
Lo que sabemos
13. Daniel Khan / @dkhan
Request 1
Request 2
Request 3
Request 4
Request 5
Traditional Request Handling
Manejo tradicional de solicitudes
Node.js Interwoven Thread Handling
Node.js Manejo de hilos entrelazados
Threads
Thread
Libuv
Show me a picture!
¡Muestrame una foto!
14. Daniel Khan / @dkhan
Derived Misconceptions
Conceptos erróneos derivados
• The event loop runs in a separate thread to the user code
El loop de evento se ejecuta en un hilo separado del código de usuario
• Everything that’s asynchronous is handled by a thread pool
Todo lo que es asincrónico es manejado por un grupo de subprocesos
• The event loop is something like a stack or queue
El loop de eventos es algo así como una pila o cola
18. Daniel Khan / @dkhan
Reality
Realidad
• The event loop runs in a separate thread than the user code
El loop de evento se ejecuta en un hilo separado del código de usuario
There is only one thread that executes JavaScript code and this is the thread where the
event loop is running.
Solo hay un hilo que ejecuta código JavaScript y este es el hilo donde se ejecuta el loop de evento.
• Everything that’s asynchronous is handled by a thread pool
Todo lo que es asincrónico es manejado por un grupo de subprocesos
Libuv creates a pool with four threads that is only used if no asynchronous API is available
Libuv crea un grupo con cuatro subprocesos que solo se usa si no hay una API asíncrona disponible
• The event loop is something like a stack or queue
El loop de eventos es algo así como una pila o cola
No … it’s a set of phases with dedicated data structures for each phase
No ... es un conjunto de fases con estructuras de datos dedicadas para cada fase
19. Daniel Khan / @dkhan
Timers
Callbacks
I/O Polling
Set Immediate
Close Events
Phases fases
Ticks
Datastructures
Estructuras de
datos
Threadpool
System
My Turn …
Mi turno …
20. Daniel Khan / @dkhan
setTimeout(function() {console.log(‚hello‘)}, 1000);
setInterval(function() {console.log(‚hello‘)}, 1000);
Timers
Callbacks
I/O Polling
Set Immediate
Close Events
const server = http.createServer(requestHandler)
fs.readFile(‚/etc/passwd’, function(err, res) {
for(let i = 0; i < res.length; i++) {
console.log(res[i]);
}
});
setImmediate(function() {console.log(‚Immediate‘)});
socket.on(‚close‘, function() {console.log(‚socket closed‘)};
21. Daniel Khan / @dkhan
What about nextTick()?
¿Qué pasa con nextTick()?
Timers
I/O Callbacks
I/O Polling
Set Immediate
Close Events
Ticks
23. Daniel Khan / @dkhan
Metrics of the Event Loop
Métricas del loop de evento
24. Daniel Khan / @dkhan
Tick Frequency
The Number of Ticks per Time
El número de marcas por tiempo
How long does a Tick take?
¿Cuánto tiempo toma una garrapata?
Queue a task via setImmediate() and collect
duration and count
Ponga en cola una tarea a través de setImmediate()
y recopile la duración y el recuento
Timers
I/O Callbacks
I/O Polling
Set Immediate
Close Events
Tick Duration
25. Daniel Khan / @dkhan
• Idle looks similar to high load
Inactivo parece similar a la carga alta
• We don’t really know where the time is spent
Realmente no sabemos dónde se gasta el tiempo
Problems / Problemas
26. Daniel Khan / @dkhan
Timers
I/O Callbacks
I/O Polling
Set Immediate
Close Events
Why is the frequency low when there is no load?
¿Por qué la frecuencia es baja cuando no hay carga?
28. Daniel Khan / @dkhan
Work Processed
Latency
Latencia procesada
por trabajo
How long does an asynchronous task
wait to be executed
¿Cuánto tiempo espera que se ejecute
una tarea asíncrona?
Schedule a task on the thread pool and measure
the time until it gets executed
Programe una tarea en el grupo de subprocesos y
mida el tiempo hasta que se ejecute
Timers
I/O Callbacks
I/O Polling
Set Immediate
Close Events
29. Daniel Khan / @dkhan
Timers
I/O Callbacks
I/O Polling
Set Immediate
Close Events
TickDuration
Work Processed Latency
30. Daniel Khan / @dkhan
• High work processed latency = busy / exhausted threadpool
Latencia procesada de alto trabajo = threadpool ocupado / agotado
Insight / Visión
31. Daniel Khan / @dkhan
Event Loop
Latency
How long does a callback wait to be executed
¿Cuánto tiempo espera una devolución de
llamada para ejecutarse?
Schedule a callback and measure
the time until it gets executed
Programe una devolución de llamada y
mida el tiempo hasta que se ejecute
Timers
I/O Callbacks
I/O Polling
Set Immediate
Close Events
32. Daniel Khan / @dkhan
setTimeout(foo,1000)
0 1000
Latency
Execution
What does “latency” mean here?
¿Qué significa "latencia" aquí?
33. Daniel Khan / @dkhan
• High event loop latency = event loop is busy processing callbacks
Latencia de loop de evento alto = loop de evento está ocupado procesando devoluciones de llamada
Insight / Visión
36. Daniel Khan / @dkhan
What’s normal?
Event loop metrics need to be
baselined and correlated
over a longer period to detect anomalies
Las métricas de loop de eventos deben basarse
y correlacionarse durante un período
más largo para detectar anomalías