ID de la causa mem-swap · Responsable principal Infraestructura de servidores (Equipo de infraestructura) · También Desarrollo de servidor (Equipo de desarrollo)
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
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.
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
Concepts overviewLinux 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
Solidigm™ D7-P5520 and D7-P5620 Product BriefSolidigm 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
vmstat(8) — Linux manual pageprocps-ng si: memoria leída del swap por segundo; so: memoria enviada al swap por segundo
PSI - Pressure Stall InformationLinux 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