Fortnite

Tryb okresowy: Plac Zabaw – O problemach technicznych

18.07.2018
Przez: Twórcy Fortnite
Czołem wszystkim!

27 czerwca o godz. 10:00 czasu polskiego uruchomiliśmy tryb okresowy Plac Zabaw... i zaraz potem nasz system dobierania graczy uległ przeciążeniu, wskutek czego padły zarówno tryby domyślne, jak i sam Plac Zabaw. Od tej chwili pracowaliśmy nad usługą, by działała jak należy i tryb ponownie pojawił się w grze rano 3 lipca.

Co się stało?
Nasze dobieranie graczy działa w oparciu o element zwany Usługą Dobierania Graczy (UDG). Odpowiada ona za wymianę potwierdzeń (tzw. „handshake”) między graczami, którzy chcą dołączyć do gry i dostępnym serwerem dedykowanym, który może być jej gospodarzem. Każdy węzeł w grupie dobierania zawiera długą listę otwartych serwerów dedykowanych, z którymi może współpracować. Są one losowo rozdzielane między regionami, by każdy z nich dysponował proporcjonalnie zbliżoną liczbą dostępnych serwerów. Gracze łączący się z UDG, wysyłają żądanie dostarczenia serwera dla ich regionu, system przypisuje danego gracza do węzła, a węzeł wybiera dostępny serwer z listy swego regionu.

Ze względu na to, że Plac Zabaw jest trybem dla 1 do 4 graczy, a nie 100, wymaga w zależności od rozmiaru ekipy od 25 do 100 gier więcej, niż normalnie. I o ile mogliśmy dla Placu Zabaw „upakować” więcej wirtualnych serwerów na rzeczywistym procesorze, to i tak musieliśmy użyć do 15 razy więcej serwerów, niż to konieczne w innych trybach. Udało nam się zapewnić wystarczającą ilość miejsca na serwerach, ale lista, którą każdy z węzłów musiał obsłużyć, była nagle 15 razy dłuższa niż zwykle.

Jeżeli węzeł UDG nie może znaleźć wolnego serwera z wymaganego regionu z własnej listy, to musi prosić wszystkie pozostałe węzły o zastępstwo, sprawdzając ich listy lokalne. Jeżeli jesteś węzłem i twoja lista staje się nagle 15 razy dłuższa, zaczynasz zwalniać. Jeżeli musisz jeszcze sprawdzić wszystkie pozostałe listy i każda z nich jest również 15 razy dłuższa, zwalniasz do 15 razy na węzeł, co powoduje, że czas przetwarzania danych zwiększa się o rząd. Kiedy uruchomiliśmy Plac Zabaw, wasze przytłaczające potrzeby wyczerpywały listy lokalne UDG znacznie szybciej, niż system mógł je odświeżać. Każdy z węzłów wysyłał prośby o dodatkowe serwery, których po prostu nie było, a nawet jeżeli były, to znalezienie ich na zewnętrznych listach zajmowało mnóstwo czasu. Długie czasy przetwarzania powodowały, że procesory kończyły z całym plikiem zaległych żądań, które zapętlały się bez końca między sobą tak długo, aż cały system zatarł się na amen.

Co zrobiliśmy, by rozwiązać problem?
Pierwszą rzeczą, którą zrobiliśmy po wyłączeniu trybu, było odłączenie UDG Placu Zabaw, by działał na własnej grupie serwerów. Było to niezbędne, by nowy tryb nie wpływał na podstawowe tryby gry, a także pozwoliło nam poprawiać i zmieniać usługę tak często, jak było trzeba, by przywrócić Plac Zabaw do życia. Wypróbowywaliśmy zwiększanie poziomu radykalnych zmian w architekturze systemu i testowaliśmy je na każdym etapie, dopóki nie osiągnęliśmy kryteriów akceptacji ponownego udostępnienia trybu.

Po wskazaniu wyczerpywania sesji list lokalnych jako przyczyny problemu, rozwiązaniem było pozwolenie grupie na masowe równoważenie sesji z innych węzłów, by nie trzeba było powtarzać wyszukiwań. W systemie, który bezustannie przesuwa wolne zasoby z węzłów, które mają ich aż nadto, do tych, które mogą ich potrzebować, szansa na to, że węzeł wyczerpie dany region i zacznie szukać poza swoją listą lokalną, wyraźnie się zmniejsza. Nie jest to obecnie problemem w podstawowych trybach Fortnite: Battle Royale, ale ta zmiana dotknie także główną grupę UDG jako zabezpieczenie systemu na przyszłość.

Przy zmianie struktury UDG testowaliśmy proces obciążania systemu do oporu, bo skala, jaką chwieliśmy symulować, znacznie przekracza zwykłe obciążenie naszych systemów, a nawet procedur testowych. Generowaliśmy wiele milionów teoretycznych użytkowników i rzucaliśmy ich wszystkich na UDG Placu Zabaw w ramach wielkiej fali, próbując przeciążyć nasze nowe narzędzie przywracania równowagi sesji. Cykl zmiana-test-ocena trwał po kilka godzin na pętlę, ale pozwolił nam stworzyć i usprawnić system równoważący, które nie tylko daje sobie radę z obciążeniem, ale także jest w stanie identyfikować i naprawić błędy, które występują w warunkach ekstremalnych, które mogłyby storpedować wysiłek włożony w ponowne udostępnienie Placu Zabaw.

Czego się nauczyliśmy?
W skrócie, dowiedzieliśmy się mnóstwo o naszym systemie dobierania graczy i jego wadach. Byliśmy przygotowani na sytuację, w której system dobierania graczy osiąga maksymalną stałą przepustowość na postawie wielkości naszej społeczności graczy (i to ze sporym zapasem). Nie przewidzieliśmy jednak skrajnej sytuacji, w której pierwsza „lawina” graczy wyczerpuje listy lokalne.

Przy okazji ponownego uruchomienia trybu nauczyliśmy się czegoś jeszcze. Planowaliśmy przywracanie Placu Zabaw małymi kroczkami, po jednym regionie i platformie w celu zredukowania początkowego obciążenia systemu, byśmy mogli go skalować. Efekt był odwrotny od zamierzonego: gracze przełączali się na te regiony, w których Plac Zabaw był już włączony, przez co musieliśmy walczyć z obciążeniem i proces przywracania zwalniał. Dobre też i to, że obecnie świetnie orientujemy się w azjatyckich chmurach obliczeniowych i chcielibyśmy w tym miejscu podziękować naszym partnerom od chmur, którzy pomogli nam opanować sytuację!

Proces przywracania Placu Zabaw do stabilności w rękach naszych graczy był trudniejszy, niż zakładaliśmy i nauczył nas, że złożone systemy dystrybucji zawodzą na najróżniejsze sposoby. Zostaliśmy zmuszeni do wprowadzenia znaczących modyfikacji awaryjnych do naszego systemu dobierania graczy, które jednak w dalszej perspektywie przysłużą się grze, zapewniając jej stabilność w miarę wzrostu liczby graczy.