Si al asignar y liberar memoria una y otra vez el espacio libre queda partido en trozos pequeños, el proceso ocupa mucha más memoria de la que realmente usa.
Por qué Varios hilos asignan y liberan durante mucho tiempo bloques de memoria de tamaños muy distintos → Efecto El espacio libre queda disperso en trozos pequeños que no se pueden devolver al SO, y el uso sigue creciendo como si fuera una fuga → En pantalla Cuanto más tiempo lleva encendido, más lento va por el swap y la falta de memoria, hasta que se cierra a la fuerza
Responsable principal Desarrollo de servidor (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Usar pools de memoria por tamaño y asignadores resistentes a la fragmentación (jemalloc, mimalloc, etc.).
En el gráfico
Subida gradual · Memoria del proceso (RSS)
Dónde mirar
Levantar dos servidores con la misma build y, solo en uno, reducir el número de arenas de glibc con la variable de entorno MALLOC_ARENA_MAX o cambiar a otro asignador como jemalloc; comparar durante varios días el RSS de pidstat -r
Se confirma si
Con un número parecido de jugadores y entidades, solo en el servidor modificado el RSS deja de crecer o baja mucho
Se descarta si
Si sube igual después de cambiar de asignador: memoria que no se libera (mem-leak)
Se verifica con
Con herramientas de infraestructura (no hace falta código del juego)
Para saber más
Tiene el mismo aspecto que una fuga, pero el análisis del heap no muestra ningún punto de fuga. El asignador predeterminado de Linux (glibc) lo sufre especialmente en servidores con muchos hilos, y a veces basta con cambiar de asignador para reducir mucho el uso de memoria.
Fuentes
mallopt(3) — Linux manual pageLinux man-pages Para reducir la contención entre hilos, glibc malloc crea arenas hasta un múltiplo del número de CPU, y cuantas más arenas, más memoria usa (se limita con M_ARENA_MAX, también configurable con la variable de entorno MALLOC_ARENA_MAX)
jemalloc memory allocatorjemalloc Implementación de malloc de propósito general centrada en evitar la fragmentación y escalar con la concurrencia