Libro blanco del lag en juegos › Buscar por síntoma
Congelamiento: 67 causas y sus responsables
También se dice: se congela, se queda colgado, no responde, freeze
Abrir en la guía de síntomas interactiva →
Todo lo que hay en pantalla se detiene un momento (de 0.5 s a varios segundos) y luego vuelve a moverse.
Todos quietos. Solo tu personaje se mueve un poco gracias a la predicción, o corre sin avanzar. Al reanudarse, el movimiento acumulado llega de golpe como cámara rápida o teletransporte.
Se detuvo el servidor entero (GC, deadlock, llamadas síncronas), la conexión se cortó un momento o se detuvo tu PC.
Causas de este síntoma
L1 Proceso del juego en el cliente
- Pico de frametime: Calcular un frame tarda varias veces más de lo normal y la imagen se detiene un instante. (Desarrollo de cliente (Equipo de desarrollo))
- Recolección de basura (GC) en el cliente: El juego entero se detiene mientras se recupera la memoria ya usada y desechada (basura). Lo característico son tirones a intervalos regulares. (Desarrollo de cliente (Equipo de desarrollo))
- Carga síncrona y compilación de shaders en el hilo principal: El juego se detiene para leer archivos y crear shaders justo antes de dibujar zonas, monstruos o efectos que aparecen por primera vez. (Desarrollo de cliente (Equipo de desarrollo))
- Almacenamiento lento que retrasa el streaming de assets: En un almacenamiento lento como un HDD, la lectura de texturas y modelos de un mundo abierto no sigue el ritmo del desplazamiento, así que las entidades aparecen tarde o el juego da tirones mientras espera la lectura. (Desarrollo de cliente (Equipo de desarrollo))
- Escaneos del módulo anti-cheat: El módulo de seguridad que se ejecuta junto al juego para impedir los hacks hace escaneos periódicos. Si el escaneo es pesado o si el heartbeat (señal periódica que confirma que el cliente sigue activo) que intercambia con el servidor de seguridad llega tarde, hay tirones o desconexiones. (Desarrollo de cliente (Equipo de desarrollo))
L2 SO y dispositivo del cliente
- Cambio Wi-Fi ↔ LTE/5G: Al salir de casa, el Wi-Fi se corta y el dispositivo pasa a LTE o 5G; tu dirección IP cambia y la conexión existente deja de valer. (Desarrollo de servidor (Equipo de desarrollo))
- Falta de memoria y swap en el cliente: Con decenas de pestañas del navegador abiertas junto al juego, el SO saca a disco parte de la memoria del juego. (Externo (Externo))
- Falta de memoria gráfica (VRAM): Si las opciones gráficas piden más memoria de la que tiene la tarjeta gráfica, el SO saca texturas a la RAM del sistema y las vuelve a traer, y hay tirones. (Desarrollo de cliente (Equipo de desarrollo))
- Ahorro de energía y drivers de la NIC: Si la tarjeta de red o el chip Wi-Fi entran en ahorro de energía entre paquete y paquete, tardan en volver a activarse. (Externo (Externo))
- Interferencias de programas de overlay: Los programas de mensajería, los launchers, los grabadores y los contadores de FPS se meten en el proceso de renderizado del juego (hooking) para dibujar su propia UI encima de la imagen. Añaden trabajo en cada frame y, a veces, chocan con el juego y provocan un tirón o un cierre forzado. (Externo (Externo))
L3 Red doméstica
L4 Ruta por internet
- Cambios de ruta BGP y convergencia: Cuando cambia la información de rutas de internet, se pierden paquetes durante los segundos o decenas de segundos (rara vez, unos minutos) que tarda en volver a converger. (Infraestructura de red (Equipo de infraestructura))
- Mala calidad de la conexión: Un conector flojo, un cableado viejo o un módem averiado provocan pérdida de paquetes constante y cortes periódicos de la conexión. (Externo (Externo))
L5 Equipos de red del centro de datos
- Failover de equipos de red: Cuando falla un router o un firewall y el tráfico pasa al dispositivo de reserva (failover), todos se quedan congelados durante unos segundos. (Infraestructura de red (Equipo de infraestructura))
- Desajuste de MTU (solo desaparecen los paquetes grandes): Si la MTU (el tamaño máximo que se puede enviar de una vez) se reduce en un tramo intermedio y los avisos de tamaño excedido están bloqueados, solo los paquetes grandes desaparecen una y otra vez. (Infraestructura de red (Equipo de infraestructura))
L6 Tarjeta de red del servidor
- Mantenimiento del host en la nube y migración en vivo: Cuando el proveedor de nube hace mantenimiento de un servidor físico (host), mueve las máquinas virtuales a otro host (migración en vivo) o las pausa un momento. Mientras tanto, todo el servidor se detiene y, si la pausa es larga, las conexiones se cortan. (Infraestructura de servidores (Equipo de infraestructura))
- Problemas de driver y firmware de la NIC: Cuando un bug del driver o una función que falla deja colgada la tarjeta, se corta todo el envío y la recepción mientras se reinicia. (Infraestructura de servidores (Equipo de infraestructura))
L7 SO del servidor (kernel)
- CPU steal (máquinas virtuales): Mientras el servidor físico (hipervisor) cede por un momento el tiempo de CPU de la máquina virtual a otra máquina virtual (CPU steal), el servidor del juego se detiene. (Infraestructura de servidores (Equipo de infraestructura))
- Pausas por recuperación y compactación de memoria: Mientras el SO compacta la memoria para formar páginas grandes (huge pages) o recupera memoria libre, el proceso se detiene. (Infraestructura de servidores (Equipo de infraestructura))
L8 Sockets y protocolos
- Bloqueo HOL en TCP: Para mantener el orden, TCP no entrega al juego los paquetes que llegaron después de uno perdido hasta que vuelve a recibir ese paquete. (Desarrollo de servidor (Equipo de desarrollo))
- RTO de TCP y backoff exponencial: Cada vez que una retransmisión vuelve a fallar, la espera se duplica, así que un corte breve de la conexión se convierte en una detención larga. (Desarrollo de servidor (Equipo de desarrollo))
- Envíos bloqueantes por clientes lentos: Si el búfer de envío de un jugador con una conexión lenta está lleno y se le envía en modo bloqueante (un envío cuya llamada no vuelve hasta que hay espacio en el búfer), el hilo del servidor se queda esperando a ese único jugador. (Desarrollo de servidor (Equipo de desarrollo))
- Reparto desigual con SO_REUSEPORT: Cuando varios procesos reciben en el mismo puerto, el kernel asigna cada conexión a un proceso según un hash de la dirección y no cambia esa asignación. Si ese proceso se detiene, solo esperan los jugadores asignados a él. (Desarrollo de servidor (Equipo de desarrollo))
- Error WSAECONNRESET en sockets UDP de Windows: Cuando un servidor Windows envía UDP a un cliente que ya se fue, vuelve un aviso de “puerto inalcanzable” (ICMP). Ese aviso hace que la siguiente llamada de recepción termine con error, y si el código del servidor lo trata como una avería del propio socket, todos los que usan ese socket se ven afectados. (Desarrollo de servidor (Equipo de desarrollo))
L9 Proceso del juego en el servidor
- Contención de locks: Si varios hilos esperan un mismo lock para escribir los mismos datos, por más hilos que se añadan, solo se ejecuta uno a la vez. (Desarrollo de servidor (Equipo de desarrollo))
- Deadlock: Si dos hilos esperan cada uno el lock que tiene el otro, se quedan detenidos para siempre. (Desarrollo de servidor (Equipo de desarrollo))
- Llamadas síncronas en el hilo del juego: Si durante un tick se espera la respuesta de la BD o una escritura en archivo, todo el avance del juego en el servidor se detiene ese tiempo. (Desarrollo de servidor (Equipo de desarrollo))
- Temporizadores que se disparan todos a la vez: Si la reaparición de todos los monstruos, el fin de todos los buffs y las recompensas a la hora en punto caen en el mismo tick, ese tick pesa decenas de veces más. (Desarrollo de servidor (Equipo de desarrollo))
- Agotamiento del pool de hilos: Si todos los hilos de trabajo que procesan tareas quedan atados a trabajos lentos, las solicitudes nuevas esperan indefinidamente. (Desarrollo de servidor (Equipo de desarrollo))
- Bucles infinitos y lógica desbocada: Si por un bug un tick no termina nunca, el servidor se detiene y el watchdog lo reinicia a la fuerza. (Desarrollo de servidor (Equipo de desarrollo))
- Avalancha de spawns al entrar en una zona concurrida: Al teletransportarse a un pueblo lleno de gente, el servidor tiene que enviar de golpe la apariencia, el equipamiento y el estado de los cientos de jugadores que ahora son visibles. (Desarrollo de servidor (Equipo de desarrollo))
L10 Memoria
- Pausa stop-the-world del GC en el servidor: Un servidor en Java o C# detiene todos sus hilos para recolectar la basura (stop-the-world), y mientras tanto todo el servidor queda detenido. (Desarrollo de servidor (Equipo de desarrollo))
- Pausa del GC en el motor de scripts: Aunque el servidor esté escrito en C++, si las misiones, la IA y las habilidades se ejecutan en scripts como Lua, la zona se detiene mientras corre el GC del motor de scripts. (Desarrollo de servidor (Equipo de desarrollo))
- Avalancha de asignaciones: Si durante un evento se crean muchísimos objetos temporales, el GC se ejecuta mucho más a menudo que de costumbre. (Desarrollo de servidor (Equipo de desarrollo))
- Fuga de memoria: La memoria que no se libera se acumula poco a poco y, al cabo de unos días, termina en un GC excesivo, swap o un cierre forzado. (Desarrollo de servidor (Equipo de desarrollo))
- Thrashing del GC (heap casi lleno): Cuando los datos vivos se acercan al límite del heap, el GC casi no encuentra nada que liberar y se repite sin parar. (Desarrollo de servidor (Equipo de desarrollo))
- Swap: 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. (Infraestructura de servidores (Equipo de infraestructura))
L11 Disco
- Escritura síncrona de logs: Si el hilo del juego espera a que el disco termine cada línea de log, cuando el disco está ocupado el juego también se detiene. (Desarrollo de servidor (Equipo de desarrollo))
- Límite de IOPS y saturación de la cola: Cuando se supera el número de solicitudes por segundo que el disco puede procesar, la cola se alarga y la latencia se dispara. (Infraestructura de servidores (Equipo de infraestructura))
- Carga diferida (lazy loading) en el servidor: Si el servidor lee del disco los datos de una mazmorra o un mapa la primera vez que se los piden, el juego se detiene para todos durante ese tick. (Desarrollo de servidor (Equipo de desarrollo))
L12 Base de datos
- Failover de la BD: Cuando la BD principal cae, no se puede escribir mientras se cambia a la de respaldo, y los últimos datos que no llegaron a replicarse pueden perderse. (Infraestructura de BD (Equipo de infraestructura))
- Estampida de caché: Si la caché de unos datos populares caduca a la vez, miles de solicitudes se lanzan de golpe contra la BD. (Desarrollo de servidor (Equipo de desarrollo))
- Comandos lentos en Redis: Redis procesa los comandos de uno en uno, así que un solo comando lento bloquea todas las solicitudes que vienen detrás. (Desarrollo de servidor (Equipo de desarrollo))
L13 Arquitectura y operación de servidores
- Cambio de zona (traspaso entre servidores): Al entrar en otra zona o mazmorra, los datos del personaje se traspasan a otro servidor, y en ese proceso surgen retrasos y fallos. (Desarrollo de servidor (Equipo de desarrollo))
- Fallo en cascada: Cuando un servicio se vuelve lento, los servidores que lo llaman se quedan bloqueados esperando su respuesta y hasta funciones sin relación se detienen. (Desarrollo de servidor (Equipo de desarrollo))
- Sobrecarga por logs y monitoreo: Cuando hay un incidente, los logs se disparan, y los servidores que envían sus logs de forma síncrona se vuelven todavía más lentos por culpa de esos logs. (Desarrollo de servidor (Equipo de desarrollo))
Diseño del netcode
- Espera al jugador más lento en lockstep: En una arquitectura en la que todos calculan juntos el mismo turno, si el input de uno llega tarde, todos esperan. (Desarrollo de servidor (Equipo de desarrollo))
- Arquitectura de anfitrión (host): Cuando la computadora de un jugador hace de servidor, su conexión y el rendimiento de su PC determinan lo que perciben todos. (Desarrollo de servidor (Equipo de desarrollo))
Problemas que solo afectan a algunos
- Personaje con datos sobredimensionados: Un personaje con miles de objetos o correos acumulados, o con listas de amigos o de bloqueados y buffs fuera de lo normal, tiene varias veces más datos que cargar al conectarse, que guardar y que anunciar a su alrededor. Va lento solo con ese personaje, sin importar la conexión. (Desarrollo de servidor (Equipo de desarrollo))
Causas raíz de la retransmisión TCP
- Pérdida en el tramo inalámbrico: El Wi-Fi y las redes móviles reintentan varias veces la transmisión en el tramo inalámbrico y, si aun así no lo consiguen, descartan el paquete. TCP vuelve a enviar ese paquete bastante después. (Externo (Externo))
- Desbordamiento de la cola en el cuello de botella (pérdida por congestión): Cuando se llena la cola del punto más estrecho, como el router, la interconexión entre ISP o el enlace del centro de datos, los paquetes que llegan se descartan. (Infraestructura de red (Equipo de infraestructura))
- Ráfagas de envío que desbordan búferes poco profundos: Si el servidor envía de golpe en cada tick las actualizaciones de miles de jugadores, el pequeño búfer de un switch o el límite instantáneo de la nube se desborda en menos de 1 ms y parte de los paquetes se descarta. (Desarrollo de servidor (Equipo de desarrollo))
- Descarte del exceso por un policer: Los planes de los ISP, los límites de las instancias en la nube y los dispositivos de protección DDoS a veces descartan al instante, sin encolarlos, los paquetes que superan una velocidad fijada. (Infraestructura de red (Equipo de infraestructura))
- Errores físicos (cables, transceptores ópticos o conectores defectuosos): Los cables dañados, los conectores ópticos sucios y los transceptores ópticos al final de su vida útil producen errores de bit, y los dispositivos descartan en silencio los paquetes corruptos. (Infraestructura de red (Equipo de infraestructura))
- Desajuste de dúplex: Si un extremo usa autonegociación y el otro tiene la velocidad y el dúplex fijos, un lado acaba funcionando en half-duplex (semidúplex) y pierde paquetes por colisiones cada vez que hay carga. (Infraestructura de red (Equipo de infraestructura))
- Descarte de paquetes en el host del servidor receptor: Los paquetes llegan al servidor, pero se descartan porque se desborda el búfer circular de la NIC (el búfer donde se guardan un momento los paquetes que llegan) o porque se satura el núcleo que procesa la recepción en el kernel. (Infraestructura de servidores (Equipo de infraestructura))
- Descartes del firewall o del seguimiento de conexiones: Los firewalls y el seguimiento de conexiones de Linux (conntrack, la función que registra en una tabla las conexiones que pasan) descartan paquetes cuando la tabla se llena o cuando consideran que no encajan con el estado de la conexión. (Infraestructura de red (Equipo de infraestructura))
- Límite de procesamiento superado en dispositivos intermedios (firewall, IPS, protección DDoS): Los firewalls, los sistemas de prevención de intrusiones (IPS) y los dispositivos de protección DDoS inspeccionan uno a uno los paquetes que pasan. En cuanto se supera su capacidad de inspección, descartan los paquetes que no alcanzan a procesar. (Infraestructura de red (Equipo de infraestructura))
- Agujero negro de MTU (solo los paquetes grandes se pierden una y otra vez): Si un tramo intermedio pasa a aceptar paquetes más pequeños y el aviso de “demasiado grande” (ICMP) está bloqueado, los paquetes grandes siguen desapareciendo por muchas veces que se reenvíen. (Infraestructura de red (Equipo de infraestructura))
- Expiración del mapeo NAT o del balanceador de carga en mitad de la conexión: Si un dispositivo intermedio borra el mapeo de una conexión inactiva (la entrada que indica a dónde reenviar esa conexión), el siguiente paquete que se envía no llega a su destino. O bien se repiten las retransmisiones hasta que la conexión se corta, o bien el dispositivo devuelve un rechazo de conexión (RST) y se corta al momento. (Desarrollo de cliente (Equipo de desarrollo))
- Cambio de ruta o ruta ECMP defectuosa: Se pierden paquetes durante los segundos en que cambia una ruta de internet, o en las conexiones asignadas a una ruta defectuosa entre varias rutas ECMP. (Infraestructura de red (Equipo de infraestructura))
- Retransmisiones espurias por picos de latencia: El paquete no se pierde; solo llega muy tarde por un momento. Pero si ese retraso supera el RTO, el emisor lo da por perdido y lo retransmite. (Externo (Externo))
- RTO mal ajustado al entorno: Si se baja demasiado el RTO mínimo, cualquier pequeño retraso provoca retransmisiones espurias; y el valor predeterminado (200 ms) es demasiado largo para un juego, así que cada pérdida detiene la conexión mucho tiempo. (Infraestructura de servidores (Equipo de infraestructura))
- Recuperación lenta en thin streams: Cuando se envían paquetes pequeños y espaciados, como en un juego, el RTO llega antes de que se junten los “3 paquetes posteriores”. Ante la misma pérdida, la conexión se detiene mucho más tiempo que en una transferencia grande. (Desarrollo de servidor (Equipo de desarrollo))
- Eliminación de opciones TCP en dispositivos intermedios: Si algunos firewalls o aceleradores eliminan o modifican las opciones TCP, cuando se pierden varios paquetes solo se recupera uno por cada ida y vuelta, o la ventana (lo que se puede enviar de una vez) se reduce, y todo va más lento. (Infraestructura de red (Equipo de infraestructura))
- Ventana cero (una detención que parece retransmisión): Cuando el programa receptor no lee el socket a tiempo y el búfer se llena, el emisor deja de enviar y solo manda sondas de ventana cero. El problema no está en la red. (Desarrollo de cliente (Equipo de desarrollo))
Ver la guía de síntomas interactiva