Fortnite

Post mórtem del MPL Patio de juegos

18.7.2018
Por El equipo de Fortnite
¡Hola, amigos!

El 27 de julio, sobre las 4 a. m. (EDT), habilitamos el MPL Patio de juegos. Al poco tiempo, empezamos a sufrir una sobrecarga en nuestros servicios de emparejamiento. Esto causó que los modos predeterminados y que el Patio de juegos fallarán.  Empezamos a trabajar para que el servicio funcionara como es debido. Finalmente, pudimos lanzar el modo el 2 de julio por la tarde.

¿Qué pasó?
Nuestro emparejamiento está desarrollado sobre algo que llamamos "servicio de emparejamiento" (MMS, por sus siglas en inglés), que es el responsable de facilitar que los jugadores que estén buscando unirse una partida puedan encontrarse y unirse a un servidor dedicado y disponible para alojar esa partida.  Cada nodo del módulo de emparejamiento tiene una lista de servidores dedicados abiertos con los que puede trabajar. Estos se distribuyen al azar por región para mantener una cantidad proporcional de servidores libres en cada uno.  Los jugadores que se conecten al MMS solicitan unirse a un servidor de su región, luego el servicio asigna a ese jugador a un nodo y, finalmente, el nodo elige un servidor libre de su lista en la región solicitada.

Como el modo de Patio de juegos organiza partidas por cada 1-4 personas en vez de con 100, requiere entre 25 y 100 veces más partidas de lo normal dependiendo del tamaño del grupo.  Aunque tuvimos que empaquetar los servidores virtuales de forma más ajustada por cada CPU física en el modo Patio de juegos, igualmente tuvimos que usar 15 veces más servidores que si estuviéramos haciendo funcionar los otros modos.  Pudimos asegurar la capacidad total del servidor, pero eso significaba que la lista que cada nodo tenía que gestionar también era 15 veces mayor.

Cuando un nodo del MMS no puede encontrar un servidor disponible en la región solicitada en su propia lista, tiene que buscar uno libre entre los otros nodos leyendo cada una de sus listas locales.  Cuando eres un nodo y de repente tu lista es 15 veces más larga, tienes que ir más lento.  Y cuando tienes que comprobar todas las otras listas y cada una es 15 veces más larga, significa que irás hasta 15 veces más lento por cada nodo, lo que se traduce en tiempos de cálculo de una magnitud superior a la normal.  Cuando lanzamos Patio de juegos, la abrumadora demanda agotó rápidamente las listas locales de los nodos del servicio de emparejamiento, a una velocidad mucho más rápida de lo que el sistema tardaba en restablecerlos.  Todos los nodos buscaban servidores adicionales entre sí, pero todavía no había ninguno disponible o a lo mejor tardaban mucho tiempo para elegir entre las listas no locales.  Los largos tiempos de cálculo causaron que la CPU terminara con una acumulación de solicitudes pendientes, lo que resultó en un bucle de realimentación que finalmente causó que el sistema se detuviera.

¿Qué hicimos para solucionarlo?
Lo primero que hicimos después de desactivar el modo fue dividir el servicio de emparejamiento de Patio de juegos para que se ejecutara en su propio módulo de servicio.  Esta fue una medida necesaria, tanto para asegurarnos de que no se sobrecargaran también los modos predeterminados, como para poder reajustar el servicio las veces que fueran necesarias mientras trabajábamos para volver a poner Patio de juegos en línea. Intentamos aumentar los niveles de re-arquitectura dramática e hicimos pruebas en cada fase hasta que alcanzamos los criterios de aceptación para volver a lanzar el modo.

Una vez que identificamos el agotamiento de las sesiones de las listas locales como la raíz del problema, la solución fue darle al módulo la habilidad de reequilibrar las sesiones de otros nodos en grandes cantidades para asegurar que las búsquedas repetidas no fueran necesarias.  Con el sistema cambiando constantemente la capacidad regional de los nodos con exceso a los nodos a punto de agotarse, se redujo drásticamente las probabilidades de que un nodo se quede vacío en una región en particular y que tenga que buscar fuera de su lista local.  Es cierto que esto no es un problema ahora mismo en los modos principales de Batalla campal de Fortnite, pero vamos a incluir esta mejora a los servidores de emparejamiento principales para asegurar que no ocurra lo mismo en el futuro.

Llevamos el proceso de pruebas de carga al límite durante la reestructuración del servicio de emparejamiento, ya que la escala de lo que intentábamos simular iba más allá del uso normal o de los patrones de prueba.  Tuvimos que inventarnos muchos millones de usuarios teóricos y lanzarlos a nuestro sistema de emparejamiento del Patio de juegos a la vez, como en una gran ola, en un intento de forzar nuestro nuevo reequilibrador de sesiones.  El ciclo de ajuste-prueba-evaluación demoró varias horas por bucle, pero esto nos permitió desarrollar y afinar el comportamiento de reequilibrio hasta el punto en el que sentimos que podía resistir el tráfico de jugadores. También nos sirvió para identificar y corregir errores de los casos extremos que podrían haber entorpecido nuestro esfuerzo de volver a poner Patio de juegos en línea.

¿Qué aprendimos de esto?
El resumen es que aprendimos mucho sobre nuestro propio sistema de emparejamiento y sobre sus puntos débiles.  Planeamos y nos preparamos para lo que creíamos que sería el emparejamiento máximo que habría que sostener basado en el tamaño de nuestra base de jugadores (contamos muy por lo alto, por las dudas) pero no anticipamos la "gran oleada" inicial de jugadores que agotó las listas locales.

Al volver a lanzar el modo, tuvimos otra experiencia de aprendizaje.  Optamos por traer el Patio de juegos de vuelta en pequeños pasos por regiones y plataformas individuales, con el objetivo de reducir la carga inicial en el sistema y poder ampliarlo poco a poco.  Pero, de hecho, logramos todo lo contrario, ya que los jugadores se cambiaban a regiones que ya tenían el modo habilitado y nos obligaron a ralentizar la puesta en marcha a medida que trabajábamos en los problemas de capacidad.  La parte positiva es que ahora tenemos una visibilidad más clara que nunca sobre los recursos de la nube disponibles en Asia. ¡Y queremos agradecer a nuestros socios de la nube por trabajar con nosotros para asegurarnos de que podamos ajustarnos rápidamente!

El proceso de lograr que Patio de juegos sea estable y de ponerlo en manos de nuestros jugadores fue más duro de lo que nos hubiera gustado, pero fue un buen recordatorio de que los sistemas distribuidos complejos fallan de forma impredecible.  Nos vimos obligados a realizar importantes actualizaciones de emergencia a nuestro servicio de emparejamiento, pero estos cambios serán de gran utilidad para el juego a medida que sigamos creciendo y ampliando nuestra base de jugadores en el futuro.