한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Libro blanco del lag en juegos › L7 SO del servidor (kernel)

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)

Abrir la ficha interactiva con gráficos y simulaciones →

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

Síntomas
Tirones, Cámara lenta
Factores
Detención, Jitter
A quién afecta
Todo el servidor
Cuándo
Cuando se junta mucha gente
Responsable
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

  1. 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)
  2. vmstat(8) — Linux manual page procps-ng
    Campos cs (cambios de contexto por segundo) y r (procesos en ejecución o esperando para ejecutarse)
  3. I/O Completion Ports Microsoft
    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
  4. pidstat(1) — Linux manual page sysstat
    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

Ver también

Misma capa: L7 SO del servidor (kernel)

Causas de otras capas con el mismo síntoma (Tirones)

Ver la ficha interactiva con gráficos y simulaciones