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

Libro blanco del lag en juegos › L10 Memoria

Swap Swapping

ID de la causa mem-swap · Responsable principal Infraestructura de servidores (Equipo de infraestructura) · También Desarrollo de servidor (Equipo de desarrollo)

Abrir la ficha interactiva con gráficos y simulaciones →

Cuando falta memoria y el SO envía una parte al disco, cada vez que se usa esa memoria hay que esperar a un disco más de 1,000 veces más lento.

Por qué La memoria usada supera la RAM física → Efecto El SO envía una parte al disco y la vuelve a leer cuando hace falta → En pantalla El tick se dispara a cientos de ms y todos los jugadores del servidor sufren cámara lenta y congelamientos

Síntomas
Cámara lenta, Congelamiento
Factores
Detención
A quién afecta
Todo el servidor
Cuándo
Cuanto más tiempo lleva encendido, Horas pico de la noche
Responsable
Responsable principal Infraestructura de servidores (Equipo de infraestructura) · También Desarrollo de servidor (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Poner un tope al uso de memoria del proceso (tamaño del heap, entre otros) y revisar si hay fugas.
Tareas (Equipo de infraestructura)
Configurar los servidores del juego para que no usen swap, responder con alertas de memoria, reservar RAM de sobra por encima del uso en el pico (sin swap, el proceso se cierra a la fuerza por OOM en cuanto falta memoria).
Cifras de referencia
Leer de la RAM tarda unos 100 ns; volver a leer de un SSD, unos 100 µs (1,000 veces más); de un disco en la nube al otro lado de la red, alrededor de 1 ms (10,000 veces), y de un HDD, 10 ms (100,000 veces).
En el gráfico
Subida gradual · Uso de swap, entradas y salidas de swap (swap in/out)
Dónde mirar
Columnas si y so de vmstat 1 (cantidad leída del swap y enviada al swap por segundo), some y full de /proc/pressure/memory (porcentaje de tiempo detenido esperando memoria) y majflt/s de pidstat -r del proceso del servidor del juego (fallos de página que obligaron a leer del disco), superpuestos al tiempo de tick
Se confirma si
A la hora del lag, la columna si es mayor que 0, y majflt/s del servidor del juego y el valor full de memory suben a la vez
Se descarta si
Si las columnas si y so están en 0 y la presión de memoria (PSI) también está cerca de 0, la causa no es el swap. Si no hay swap pero suben majflt/s y el PSI, la memoria está agotada y se están volviendo a leer páginas de código: lo primero es liberar memoria
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)
Para saber más
Un servidor con GC recorre todo el heap al recolectar, así que, aunque solo una parte del heap esté en swap, un solo GC puede pasar a durar de varios segundos a decenas de segundos. Si se desactiva el swap, el proceso pasa directamente al cierre forzado (OOM) sin la etapa de lentitud por swap, por eso primero hay que asegurar memoria libre de sobra. Incluso sin swap, cuando la memoria está casi agotada el SO llega a descargar de la memoria las páginas de código del ejecutable para volver a leerlas después, y todo el servidor puede ir muy lento durante un buen rato antes del cierre forzado.

Fuentes

  1. Designs, Lessons and Advice from Building Large Distributed Systems (LADIS 2009 keynote) Google
    “Numbers Everyone Should Know”: referencia a memoria principal 100 ns, búsqueda en disco 10 ms (datos de 2009)
  2. Documentation for /proc/sys/vm/ Linux kernel
    swappiness: costo relativo del swap frente a la recuperación de páginas de archivo; el swap es E/S aleatoria y por eso es caro
  3. Concepts overview Linux kernel
    Se recuperan las páginas de la caché de páginas que tienen su original en disco y las páginas que se pueden enviar al swap; si aun así no basta, el OOM killer mata un proceso
  4. Solidigm™ D7-P5520 and D7-P5620 Product Brief Solidigm
    Latencia del 99.99% (four-nines latency) de un SSD NVMe para servidores: 130 µs. Respalda que una lectura de SSD ronda los 100 µs
  5. Amazon EBS General Purpose SSD volumes AWS
    La latencia del disco estándar de la nube (gp3) es de unos pocos milisegundos (menos de 10 ms)
  6. vmstat(8) — Linux manual page procps-ng
    si: memoria leída del swap por segundo; so: memoria enviada al swap por segundo
  7. PSI - Pressure Stall Information Linux kernel
    some (porcentaje de tiempo en que algunas tareas estuvieron detenidas) y full (porcentaje de tiempo en que todas las tareas estuvieron detenidas a la vez) de /proc/pressure/memory
  8. pidstat(1) — Linux manual page sysstat
    -r: majflt/s (fallos que obligaron a leer páginas del disco)

Ver también

Misma capa: L10 Memoria

Causas de otras capas con el mismo síntoma (Cámara lenta)

Ver la ficha interactiva con gráficos y simulaciones