Exceso de hilos y cambios de contexto Thread oversubscription, context switching
ID de la causa so-context · Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Infraestructura de servidores (Equipo de infraestructura)
Si se ejecutan muchos más hilos que núcleos, el SO gasta CPU solo en irlos turnando.
Por qué Cientos o miles de hilos, por ejemplo uno por conexión → Efecto Aumentan el costo de los cambios de contexto (cambiar el hilo en ejecución) y los fallos de caché → En pantalla La CPU está ocupada pero procesa poco y el tick se vuelve irregular: tirones y cámara lenta
Responsable principal Desarrollo de servidor (Equipo de desarrollo) · También Infraestructura de servidores (Equipo de infraestructura)
Tareas (Equipo de desarrollo)
Ajustar el número de hilos al de núcleos, usar E/S asíncrona (epoll, IOCP).
Tareas (Equipo de infraestructura)
Monitorear el número de cambios de contexto y de hilos esperando ejecución (cs y r de vmstat).
Cifras de referencia
Un cambio de contexto cuesta varios µs, y más si se suma el costo de los fallos de caché que vienen después.
En el gráfico
Sube con la carga · Cambios de contexto por segundo, hilos esperando ejecución
Dónde mirar
cs (cambios de contexto por segundo) y r (procesos en ejecución o esperando CPU) de vmstat 1 frente al número de núcleos; cambios de contexto voluntarios (cswch/s) e involuntarios (nvcswch/s) por hilo del servidor del juego con pidstat -w -t
Se confirma si
Al subir los jugadores conectados, r sube muy por encima del número de núcleos, cs se dispara con él y hay cientos de hilos con muchos cambios de contexto involuntarios
Se descarta si
Si r se queda en el número de núcleos o por debajo, no es esta causa. Si solo abundan los cambios voluntarios, los hilos están esperando locks o E/S (“Contención de locks”, “Modelo de E/S bloqueante”)
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)
Fuentes
Quantifying The Cost of Context Switch (ExpCS 2007)ACM Costo directo de un cambio de contexto: unos 3.8 µs; costo indirecto con el efecto en la caché: de varios µs a más de 1,000 µs (según el entorno de medición)
vmstat(8) — Linux manual pageprocps-ng Campos cs (cambios de contexto por segundo) y r (procesos en ejecución o esperando para ejecutarse)
I/O Completion PortsMicrosoft Procesar mucha E/S asíncrona con un pool de hilos creado de antemano e IOCP, y ajustar el número de hilos que corren a la vez a la concurrencia de la CPU
pidstat(1) — Linux manual pagesysstat cswch/s de -w: cambios de contexto voluntarios (el hilo se detiene por sí mismo para esperar un recurso); nvcswch/s: cambios de contexto involuntarios (forzados al agotar su time slice); con -t, por hilo