Fortnite

MTL: Parquinho — Autópsia

18.07.2018
Por Equipe Fortnite
E aí, pessoal.

Recentemente, em 27 de junho, às 5h (horário de Brasília), lançamos nosso MTL: Parquinho. Depois disso, nosso serviço de pareamento sofreu uma sobrecarga que fez com que os modos padrão e Parquinho ficassem off-line.  Trabalhamos para deixar o serviço da maneira que precisávamos e finalmente conseguimos retomar o modo na noite de 2 de julho.

O que aconteceu?
Nosso pareamento é feito em algo chamado Matchmaking Service (MMS), que é responsável por facilitar o "aperto de mãos" entre os jogadores que querem entrar em uma partida e um servidor dedicado aberto disponível para hospedar tal partida.  Cada nó no grupo de pareamento tem uma longa lista de servidores dedicados abertos com que pode interagir, distribuídos aleatoriamente por região para manter uma quantidade aproximadamente proporcional de servidores livres para cada uma delas.  Jogadores que conectam-se ao MMS solicitam um servidor para aquela região. O MMS direciona aquele jogador a um nó, e o nó escolhe um servidor livre para a região solicitada a partir da lista.

Visto que o modo Parquinho cria partidas para cada 1-4 pessoas em vez de para cada 100, ele requer entre 25 e 100 vezes mais partidas que o normal dependendo do tamanho do grupo.  Apesar de termos conseguido alocar mais alguns servidores virtuais por processador físico para o modo Parquinho, ainda assim tivemos que usar 15 vezes mais servidores do que estávamos usando para os outros modos.  Conseguimos usar a capacidade total dos servidores, mas isso significa que a lista que cada nó precisava gerenciar também tornou-se 15 vezes maior.

Quando um nó de MMS não consegue encontrar um servidor livre para uma região solicitada dentro de sua própria lista, ele precisa pedir um servidor emprestado para todos os outros nós e, para isso, ele precisa ler cada uma das listas locais.  Quando você é um nó e, de repente, sua lista fica 15 vezes maior, você fica mais lento.  Quando você precisa verificar todas as outras listas e cada uma delas também é 15 vezes maior, isso deixa você 15 vezes mais lento por nó, o que pode ser traduzido em tempos de cálculos que são de ordens de grandeza maiores que o normal.  Quando lançamos o Parquinho, a demanda esmagadora esgotou rapidamente as listas locais dos nós de MMS em um ritmo muito mais rápido do que o sistema conseguia atualizá-las.  Cada nó estava indo até cada um dos outros nós para solicitar servidores extras que simplesmente ainda não estavam lá ou que, no mínimo, demoravam um longo tempo para selecionar a partir das listas não locais.  Os longos tempos de cálculo fizeram com que o processador ficasse com um acúmulo de solicitações pendentes, resultando em um ciclo de feedback que fazia com que o sistema parasse.

O que fizemos para corrigir esse problema?
A primeira coisa que fizemos após desabilitar o modo foi dividir o MMS do Parquinho para que ele seja executado em seu próprio conjunto de servidores.  Isso era necessário não apenas para evitar que um congestionamento afetasse os modos de base do jogo, mas também para permitir que aprimorássemos e corrigíssemos o serviço quantas vezes fosse necessário enquanto trabalhávamos para relançar o Parquinho. Testamos níveis crescentes de reestruturações extremas e fizemos testes a cada estágio até que chegamos aos critérios de aceitação para o relançamento do modo.

Após identificarmos que a exaustão de sessões nas listas locais era a raiz do problema, a solução foi dar ao grupo a habilidade de rebalanceamento em massa das sessões dos outros nós para garantir que não haveria a necessidade de pesquisas repetidas.  Com o sistema desviando constantemente a capacidade regional de nós com excedente para nós que estão com menos demanda, reduzimos drasticamente a probabilidade de um nó "secar" em uma região em particular e ter que pesquisar fora da sua lista local.  Apesar de, no momento, esse não ser um problema nos principais modos de jogo do Battle Royale do Fortnite, trata-se de um aprimoramento que também vamos implementar no grupo principal de MMS para proteger o sistema no futuro.

Durante a reestruturação do MMS, levamos o processo de teste de carga ao limite porque a escala do que estávamos tentando simular era muito maior do que o uso normal ou do que os padrões de testes.  Precisávamos criar muitos milhões de usuários fictícios e lançá-los no nosso sistema MMS do Parquinho em ondas gigantes e contínuas, numa tentativa de causar tensão no nosso novo rebalanceador de sessões.  Apesar do ciclo de avaliação de teste ter demorado horas por loop, ele nos permitiu desenvolver e refinar o comportamento do rebalanceamento a um ponto em que acreditamos que ele poderia aguentar o fluxo, assim como identificar e corrigir erros de casos extremos que poderiam ter destruído nossos esforços de relançamento do Parquinho.

O que aprendemos?
Resumindo, aprendemos muito sobre nosso próprio sistema de pareamento e sobre seus pontos fracos.  Planejamos e nos preparamos para o que achávamos ser o máximo de produção e capacidade de pareamento contínuo considerando o tamanho da nossa base de jogadores (além de uma margem generosa), mas não antecipamos corretamente o caso extremo da "enxurrada" inicial de jogadores esgotando as listas locais.

No relançamento do modo em si, tivemos mais uma experiência de aprendizagem.  Optamos por reintegrar o Parquinho em pequenas etapas por região e plataforma, com o objetivo de reduzir a tensão inicial no sistema para que pudéssemos aumentá-la progressivamente.  Acabamos encorajando o contrário, pois os jogadores trocaram de região para aquelas em que o modo havia sido reabilitado, e nos forçaram a desacelerar o lançamento conforme lidávamos com problemas de capacidade.  O lado bom é que nunca tivemos tanta visibilidade do total de recursos disponíveis na nuvem na Ásia, e queremos agradecer os parceiros da nuvem por trabalharem conosco para garantir que pudéssemos nos ajustar rapidamente!

O processo de estabilização do Parquinho e de levá-lo aos nossos jogadores foi mais difícil do que gostaríamos, mas foi um lembrete importante de que sistemas complexos de distribuição falham de maneiras imprevisíveis.  Fomos forçados a fazer grandes atualizações emergenciais em nosso Serviço de Pareamento, mas essas mudanças farão bem ao jogo conforme continuamos a aumentar e expandir nossa base de jogadores no futuro.