Jak osiągnęliśmy najwydajniejsze serwery VALORANT od czasu premiery

Dowiecie się, jak nasz zespół deweloperski przekuł pecha w najwydajniejsze jak dotąd serwery.

Wprowadzenie serwerów z tickrate’em na poziomie 128 było dla ekipy VALORANT priorytetem jeszcze przed premierą. Naszym celem od zawsze było wydanie światowej klasy rywalizacji rankingowej z tickrate’em na poziomie 128. Aby dowiedzieć się, jak udało nam się osiągnąć ten cel przed premierą, przeczytajcie nasz artykuł o serwerach VALORANT z tickrate’em na poziomie 128.

Utrzymanie wydajności serwerów jest nieustającą bitwą. Wprowadzanie z czasem nowych funkcji oznacza, że musimy pozostać ekstra czujni, by nie przekraczać naszego „budżetu na wydajność” i nadal utrzymywać serwery z tickrate’em na poziomie 128. Drobne spadki wydajności nakładają się na siebie wraz z upływem czasu, a sporadyczne poważne spadki wymagają natychmiastowego działania.

W sierpniu 2022 roku natrafiliśmy na największy spadek wydajności serwera od czasu premiery. Problem dotyczył rozgrywek w VALORANT, w których brało udział więcej niż 10 graczy (np. gier niestandardowych i meczów e-sportowych). Rozwiązanie tego problemu wymagało połączonych wysiłków małej armii inżynierów, producentów, kierownictwa i zespołu ds. e-sportu w Stambule, na dzień przed jednym z naszych największych wydarzeń opartych na rywalizacji tego roku.

Nasze dochodzenie w trakcie naprawy tego problemu podsunęło nam kilka możliwości znacznego poprawienia czasu renderowania klatek, co poskutkowało znaczną poprawą wydajności. Od wprowadzenia patcha 5.07 gracze mogą się cieszyć najbardziej spójnymi serwerami z tickrate’em na poziomie 128 od czasu premiery VALORANT w czerwcu 2020 roku.

Nazywam się Aaron Cheney i jestem programistą w zespole ds. wydajności VALORANT. Oto podsumowanie tematów, które poruszy niniejszy artykuł:

  • Opisuje, jak zespół ds. wydajności wyłapuje spadki.
  • Omawia poważne spadki wydajności odkryte tuż przed Champions 2022.
  • Wyjaśnia nasz proces klasyfikacji i wyjawia, jak nasze zespoły zajmują się nowo powstałymi problemami oraz omawia nasze wnioski z tego incydentu.

Najpierw omówię, jak wyłapujemy spadki wydajności i rzucę trochę światła na kontekst potrzebny do zrozumienia powagi sytuacji.

Jak wyłapujemy spadki wydajności?

Spadki wydajności to chleb powszedni branży gier. Gry są szalenie skomplikowanymi układami z wieloma podzespołami, z których każdy ma wpływ na ogólną wydajność. To skomplikowanie zwiększa się wraz z kolejnymi dokładanymi z czasem funkcjami i systemami. Ważne jest trafne wykrycie, kiedy spadki mają miejsce i przypisanie ich do konkretnego źródła.

VALORANT ma odrębny, odpowiedzialny za to zespół ds. wydajności. Naszemu zespołowi powierzono monitorowanie, utrzymanie i ulepszanie wydajności na różnym sprzęcie – zarówno w kwestii klienta, jak i serwera. Do wczesnego wyłapywania spadków i radzenia sobie z nimi, zanim trafią do graczy wykorzystujemy kilka narzędzi i procedur.

Cele wydajności serwera

Utrzymanie serwerów z tickrate’em na poziomie 128 oznacza, że każda klatka musi być gotowa w 7,8125 milisekundy (ms), ale jeżeli trzymalibyśmy się tego, pojedyncza gra zajęłaby zasoby całego rdzenia CPU. Aby spełnić nasze surowe wymagania tickrate’a na poziomie 128 i cele operacyjne, serwery VALORANT są zoptymalizowane, by w około 7,8 ms mieścić 3 klatki. Oznacza to, że każda klatka serwera musi być krótsza niż 2,6 ms. W rzeczywistości nasza docelowa wydajność czasu klatki serwera to 2,34 ms. Służy to dwóm ważnym celom:

  1. Zapewnia potrzebny margines. Ten zapas w celach wydajności pomaga zamortyzować wpływ dłuższych klatek, ale bez konieczności schodzenia poniżej tickrate’a na poziomie 128. Czyni to nasze serwery bardziej elastycznymi w większej liczbie sytuacji i zostawia miejsce na system operacyjny, szeregowanie i inne oprogramowanie pracujące na serwerze.
  2. Pomaga zapewnić finansową opłacalność VALORANT. Infrastruktura serwerowa jest kosztowna. Mimo iż fajnie byłoby, gdyby VALORANT hulał na jednym sprzęcie, to nie jest to możliwym do utrzymania modelem biznesowym.AskVal_Feb22_Champions_Article_Graph_3_PL.jpg

Ocena teraźniejszości i przewidywania na przyszłość

Zespół ds. wydajności wykorzystuje dwa główne źródła danych, by wyłapywać spadki:

  1. Dane przedpremierowe – dane te generowane są z kilku źródeł, w tym: z wewnętrznych testów, zautomatyzowanych testów i PBE.
  2. Dane bieżące – te dane są zbierane od graczy z aktywnych serwerów na całym świecie.

Dane przedpremierowe pozwalają nam przewidywać przyszłość poprzez analizę niepublikowanej zawartości i funkcji. Tych danych jest o wiele mniej, niż danych bieżących, co oznacza, że często ciężko jest wyciągnąć z nich wnioski z powodu zagłuszeń i rozbieżności. Trendów nie widać tak łatwo na podstawie tylko kilku próbek. Nieprawidłowości mogą również nie zostać przetestowane, ponieważ – nieważne, jak byśmy tego chcieli – nie możemy w wyczerpujący sposób przetestować wszystkiego.

Z drugiej strony dane bieżące pozwalają nam zrozumieć obecne doświadczenie gracza poprzez dokładny pomiar tego, co gracze widzą w grze. Ten zestaw danych jest o wiele większy, niż dane wewnętrzne (odpowiadając za miliardy pomiarów), co może utrudnić ich przetwarzanie. Zbieramy je więc, by je zrozumieć.

Ogólnie rzecz ujmując, dane przedpremierowe pozwalają nam na proaktywność względem niepublikowanej treści, a dane bieżące pozwalają nam reagować na aktualne warunki. Te zestawy danych, użyte razem, pomagają wykryć większość problemów.

Typowa gra w VALORANT

Zdecydowana większość graczy VALORANT spędza czas w nierankingowych i rankingowych kolejkach. Obie te kolejki są przedstawicielami tego samego trybu gry z dokładnie 10 graczami, tylko z innymi stawkami. Mimo iż istnieje wiele innych sposobów na grę w VALORANT (Replikacja, Gorączka Spike’a, Deathmatch, itd.), to inwestujemy naprawdę znaczne zasoby i dokładamy starań, aby tryb Spike oferował najlepsze możliwe doświadczenie.

O ile w większości gier w VALORANT gra dokładnie 10 osób, to w niektórych konkretnych (i ważnych) sytuacjach wymaganych jest więcej graczy.

Niestandardowe gry w VALORANT

Nawet 22 klienty gry są połączone z trybem gry Spike w czasie transmisji e-sportowej. To są gry niestandardowe, które zapewniają wsparcie dla transmisji. W tych grach można powszechnie zobaczyć następujący przekrój:

  • 10 miejsc przeznaczonych dla graczy (po 5 na drużynę).
  • 2 miejsca przeznaczone dla trenerów (po 1 na drużynę).
  • 10 miejsc przeznaczonych dla obserwatorów sterowanych przez zespół nadawczy. Te dodatkowe miejsca umożliwiają transmisję dla fanów kibicujących z domu lub z areny!

Takie gry z 22 klientami zdecydowanie wychodzą poza definicję typowej rozgrywki w VALORANT. Każdy połączony klient w grze musi być wzięty pod uwagę przez serwer, by była pewność, że otrzyma informacje wymagane do wyświetlenia gry na ekranie. W środowisku live normalnie stanowiłoby to problem. Jednakże w grze e-sportowej używamy specjalnego, lokalnego sprzętu, by utrzymać spójność rozgrywki dla sportowców.

Cele wydajności w niestandardowych grach w VALORANT

Pamiętacie cele wydajności serwera, o których mowa była wcześniej? Naszym celem w typowej rozgrywce w VALORANT z 10 graczami są 2,34 ms na klatkę serwera. W sytuacjach, w których połączonych jest więcej niż 10 graczy, oczekujemy, że wydajność wyskaluje się liniowo w stosunku do liczby dodatkowych graczy.

Na przykład przy 22 klientach średni czas klatki wyskaluje się o współczynnik mniej więcej 2,2, z 2,34 ms do 5,2 ms. To nadal znacznie mniej, niż 7,8 ms czasu klatki wymaganego do utrzymania tickrate’u serwera na poziomie 128.

W oparciu o nasze doświadczenie z niestandardowymi rozgrywkami VALORANT i o nasze zrozumienie wydajności serwerów VALORANT, jest to dobry sposób ekstrapolacji danych wydajności ze zwykłych gier w celu zrozumienia gier niestandardowych.

Ale co się stanie, gdy coś się zmieni? Co się stanie, gdy wydajność serwera nie będzie się już dłużej skalować zgodnie z liczbą połączonych klientów?

Spadek

Cofnijmy się w czasie do sierpnia 2022. Pierwsze zapowiedzi kłopotów pojawiły się w czasie testów gry z 22 klientami. Gracze w czasie testów zauważyli wahania tickrate’u serwera i odczuli ogólne niespójności w czasie rozgrywki. Nagrania wideo z gry potwierdziły, że coś było nie tak. Mieliśmy szczęście, że wyłapaliśmy ten problem, ponieważ wówczas takie testy nie były unormowane. W samym środku przetasowania drużyn i przygotowań do Champions 2022, jeden pomysłowy deweloper VALORANT pomyślał, żeby zlecić test z 22 klientami u jednej z naszych zewnętrznych firm testerskich.

Mimo iż nie trzeba było jeszcze bić na alarm, to od razu rzuciliśmy się do pracy, by zweryfikować problem, sklasyfikować go i postarać się go naprawić.

Weryfikacja problemu

Pojedynczy pomiar nie wskazuje na trend. Zaczęliśmy od przetwarzania danych telemetrycznych z naszego środowiska live w celu pełnego zrozumienia powagi i zasięgu problemu, rozdzielając gry wg. liczby zaangażowanych klientów w przedziale 10–22. Byliśmy zszokowani tym, co odkryliśmy.

Mimo że nie znaliśmy dokładnej przyczyny problemu, wykresy wskazywały na niepokojący związek pomiędzy liczbą połączonych klientów, a wydajnością serwera. Problem skalował się nielinearnie względem liczby graczy.

Dane wykazały, że mieliśmy przed sobą poważny problem, zwłaszcza w związku ze zbliżającymi się Champions 2022, które miały być rozgrywane na patchu 5.04. Wszczęliśmy alarm i natychmiast rzuciliśmy się do klasyfikowania problemu.

(Ten wykres przedstawia czasy klatek serwera na przestrzeni patchów. Każda linia reprezentuje liczbę klientów, od zwykłych gier z 10 do maksimum z 22 klientami. Tak, jak się tego spodziewaliśmy, osiągi spadały stopniowo wraz z każdym kolejnym połączonym klientem, ale skok przy patchu 5.03 oznaczał, że nasza wydajność spadała nielinearnie).

Klasyfikacja spadku

Klasyfikowanie problemu generalnie oznacza łagodzenie skutków problemu bez pełnego zrozumienia pierwotnej przyczyny. Technika ta używana jest w medycynie, by ocenić sytuację i „zatamować krwawienie”, i używana jest przez Riot w celu szybkiego reagowania na pojawiające się problemy.

Jednocześnie podjęto dwa osobne wysiłki w celu sklasyfikowania problemu.

Przygotowanie planów awaryjnych

Po pierwsze, kierownictwo VALORANT podjęło współpracę z naszymi partnerami w Stambule, by przygotować plany awaryjne. Celem było ustalenie, co mogłoby się stać, gdybyśmy nie naprawili tego problemu przed rozpoczęciem Champions 2022.

Jako że zrozumieliśmy, że problem skalował się wraz z liczbą połączonych klientów, szczególnie zainteresowaliśmy się ustaleniem minimalnej liczby obserwujących potrzebnej do zapewnienia niezakłóconej oglądalności. 22 klienty nie wchodziły w grę... więc jak wiele klientów można byłoby teoretycznie utrzymać w tych warunkach? We współpracy z naszymi e-sportowymi przyjaciółmi ustaliliśmy, że 15 połączonych klientów jest w stanie utrzymać stały tickrate na poziomie 128, zostawiając tym samym 5 miejsc dla obserwatorów prowadzących transmisję. Było to możliwe dzięki marginesowi w naszym standardowym czasie klatki serwera.

Ustalanie pierwotnej przyczyny

Po drugie, deweloperzy VALORANT nie ustawali w dochodzeniu, chcąc lepiej zrozumieć problem i znaleźć pierwotną przyczynę spadku. Kiedy przytrafia się coś tak poważnego, mało prawdopodobne jest, że przyczyna leżeć będzie w wielu systemach.

Myśleliśmy, że może nam się poszczęści, znajdziemy pierwotną przyczynę problemu i naprawimy go przed startem Champions 2022. Niestety tak się nie stało.

Naprawa spadku

Spadek zidentyfikowaliśmy po raz pierwszy 25 sierpnia 2022, a problem został rozwiązany tydzień później. W przeciągu 7 dni wielu programistów VALORANT zostało zaangażowanych w proces, by sprawdzić wiele potencjalnych rozwiązań.

Pierwszego dnia dochodzenia ustaliliśmy, która część bazy kodu była odpowiedzialna za spadek: Replikacja (nie, nie mówimy o trybie gry). Replikacja jest sposobem Unreal Engine’u na zapewnienie spójności pomiędzy serwerami i klientami poprzez synchronizację właściwości aktorów i komponentów. Więcej na temat systemu replikacji w Unreal Engine przeczytacie tutaj.

Naszym początkowym priorytetem była analiza zmian pomiędzy wersjami 5.02 i 5.03 oraz znalezienie śladów tego, co mogło się zmienić wraz z replikacją. Okazało się to trudne, ponieważ dopiero co przesiedliśmy się na Unreal Engine 4.26, co oznaczało, że kilka kluczowych części silnika zostało zmodyfikowanych. (Więcej informacji o tym, jak VALORANT aktualizuje Unreal Engine znajdziecie w tym wątku autorstwa Marcusa Reida, dyrektora ds. technologii VALORANT, na Twitterze).

Badanie replikacji nie było łatwe. Nie jest to system wymagający znacznej uwagi ze strony deweloperów, ponieważ od wielu lat mieliśmy już wypracowane najlepsze praktyki. Nie jest to też system stworzony przez programistów Riot – zmodyfikowaliśmy podstawowy silnik, by spełniał nasze wymagania, ale dogłębna znajomość tematu nie jest u nas codziennością.

Następnie systematycznie rozbieraliśmy różne części gry na czynniki pierwsze, chcąc zbadać różnice pomiędzy wersjami 5.02 i 5.03 i namierzyć pierwotną przyczynę. Wykorzystaliśmy narzędzia profilujące zapewnione przez Unreal oraz nasze własne, by porównać szczegóły wydajności pomiędzy tymi dwoma patchami. Doprowadziło to nas do wniosku, że postacie, broń i umiejętności replikowały się o wiele częściej w 5.03, niż w 5.02.

Zaczęliśmy badać dwie ścieżki:

  1. Znalezienie TEGO konkretnego spadku i naprawienie go. To było idealne rozwiązanie, które było naszym celem.
  2. Znalezienie innych okazji do poprawy wydajności. Gdybyśmy byli w stanie znaleźć inne obszary wymagające udoskonalenia (wystarczające, by odzyskać utracony czas klatek), zapanowalibyśmy nad wydajnością, pomimo niemożliwości naprawy pierwotnego problemu.

Wiele zespołów programistów szło po nitce do kłębka, starając się przetestować potencjalne środki zaradcze i usprawnienia. Wielu programistów przy okazji obyło się z replikacją i nabrało w niej doświadczenia. Odkryliśmy wtedy kilka okazji do poprawy wydajności, które zostały uznane za zbyt ryzykowne i odłożone na poczet późniejszych prac.

1 września 2022 znaleźliśmy przyczynę: pojedyncza linijka kodu z aktualizacji silnika Unreal 4.26 skutkowała o wiele częstszymi replikacjami w konkretnych warunkach, które często mają miejsce w VALORANT. Skutkiem tego był spadek wydajności, tym gorszy, im więcej klientów połączonych było z serwerem. Mimo iż problem był zauważalny już przy zwykłych grach z 10 klientami, to blokował możliwość rozgrywki przy 22 klientach.

Spadek został zidentyfikowany, naprawa nie była ryzykowna i byliśmy jej całkiem pewni. To był scenariusz idealny. Nie odkorkowaliśmy od razu szampana, ale mogliśmy wprowadzić całkiem satysfakcjonującą poprawkę w naszym kodzie.

Po spadku

Gdy źródło spadku zostało już zidentyfikowane i naprawione, przeprowadziliśmy szeroko zakrojone testy, by upewnić się, że wydajność spełniała oczekiwania i nie wynikły żadne błędy.

Wprowadzenie poprawki

Mimo iż poprawkę mieliśmy opracowaną już 1 września 2022, nie wprowadzaliśmy zmian w naszym środowisku e-sportowym aż do 8 września 2022, po zakończeniu fazy grupowej. Zdecydowaliśmy się na to, by zminimalizować ryzyko i poświęcić więcej czasu na testowanie i weryfikację. Pozwoliło to także zminimalizować zakłócenia dla wszystkich w Stambule.

Nasze środowiska live otrzymały poprawkę wraz z patchem 5.05, co doprowadziło do znacznych usprawnień.

Po Champions 2022

Zabawa nie skończyła się wraz z 5.05. W czasie badania systemu replikacji wiele potencjalnych poprawek wydajności zostało zidentyfikowanych i przeznaczonych do dalszych prac. Były one zarazem zbyt ryzykowne do wprowadzenia, ponieważ nie stanowiły remedium na pierwotną przyczynę problemu. Po naprawieniu pierwotnego spadku, wykorzystaliśmy nowo nabyte doświadczenie z replikacją, by przyjrzeć się kilku obszarom, które naszym zdaniem mogłyby pomóc w dalszym usprawnieniu wydajności serwerów.

Wysiłki te poskutkowały poprawą wydajności we wszystkich obszarach, niosąc ze sobą 15-procentową redukcję w ogólnym czasie klatki serwera w porównaniu do danych sprzed spadku. Zmiany te zmniejszyły rozdźwięk we wszystkich regionach, zwiększając stabilność czasu klatki.

Od patcha 5.07, ponad 99,3% klatek serwera spełniło nasze surowe wymagania tickrate’a na poziomie 128, co oznacza, że gracze mogą cieszyć się najbardziej stabilnymi i spójnymi serwerami od czasu premiery VALORANT.

(Ten wykres przedstawia czasy klatek serwera na przestrzeni patchów. Każda linia reprezentuje liczbę klientów, od zwykłych gier z 10 do maksimum z 22 klientami. Po poważnym spadku w patchach 5.03 i 5.04 naprawiliśmy spadek i powróciliśmy do normy w patchu 5.05. Dalsze polepszenie sytuacji zauważyliśmy wraz z wejściem patcha 5.07, kiedy zanotowaliśmy 15-procentową poprawę wydajności serwera w stosunku do danych sprzed spadku).

Wyciągnięte wnioski

Rozwiązanie tego problemu wymagało wysiłków małej armii: kilkunastu programistów, partnerów e-sportowych, zewnętrznych firm testerskich, producentów, kierowników zespołów i uprzejmości zespołów partnerskich, które dzieliły się z nami radami i udzielały wsparcia. Ten incydent nauczył nas wiele i znaleźliśmy w procedurach luki, którym chcemy się przyjrzeć.

  • Monitorowanie gier niestandardowych – Większość naszej uwagi poświęcona jest typowemu doświadczeniu VALORANT, czyli klasycznemu, dziesięcioosobowemu trybowi gry z bombą. Nasze dane nie wykazywały załamań w związku z liczbą połączonych graczy, czyniąc skalę spadku nieznaną do czasu opracowania nowych wykresów. Opracowaliśmy więc nowe procedury mające pomóc sprawdzać i zrozumieć specyfikę wydajności niestandardowych gier VALORANT z więcej niż 10 graczami.
  • Intensyfikacja testowania gier niestandardowych – Zwykły, dziesięcioosobowy tryb gry z bombą nadal pozostaje naszym priorytetem, ale zamierzamy stworzyć nowe procedury i metody testowania, by zrozumieć zagadnienie wydajności serwera przy 22 klientach. Wielkość próby dla gier z 22 klientami jest przyćmiona przez wszystko inne, więc zbieranie tego typu informacji wymaga regularnego testowania gier z 22 klientami. Normą stało się teraz przeprowadzanie testów z 22 klientami przy każdej wersji, zamiast testów tylko przed turniejami. Prawdopodobne będziemy potrzebować też innych, bardziej skomplikowanych procedur.
  • Stwarzanie warunków do rozwoju dla ekspertów dziedzinowych (SME) – Nawet jeśli wymaga to znaczącej inwestycji czasu, wprowadzenie SME w zespole pomaga uzupełnić luki w wiedzy i podnieść poziom merytoryczny całego zespołu. Kilku programistów nabyło doświadczenie związane z replikacją w trakcie naprawy spadku, co okazało się być świetną inwestycją zasobów.
  • Minimalizowanie ryzyka dla turniejów – rozgrywanie Champions 2022 na świeżo zaktualizowanej wersji, zwłaszcza biorąc pod uwagę, że dopiero co skończyliśmy integrację nowej wersji silnika Unreal Engine, było ryzykowne. Chcemy mieć pewność, że zmiany w rozgrywce (np. wyważenia, postacie, itd.) trafią na duże zawody, tak więc przyszłe turnieje nie powinny być rozgrywane na najnowszych wersjach. W przypadkach, gdyby nie dało się tego uniknąć, będziemy starannie oceniać ryzyko.

Możecie być pewni, że nie zaprzestaniemy tego typu usprawnień, aby bycie graczem VALORANT było jeszcze lepsze. Miłego grania z tickrate’em na poziomie 128 i przyjemnych łowów!