23
Led

Systém statistik pro BFBC2 – osvětlení situace

battlefield-1-nejlevneji-banner

Před dvěma dny, sepsal Mikael Kalms na EA UK Fóru informace a další detaily ohledně serverů a databází se statistikami. Rozhodl jsem se to pro Vás tedy přeložit (s korekcí mi pomohl zdejší uživatel Liman), a snad to pro Vás bude dostatečně srozumitelné. Celý článek je opravdu dlouhý a tak pokud ho dočtete až do konce, tak klobouk dolů 🙂

Může se hodit:

Následující popis slouží k objasnění funkčnosti backendu pro statistiky BFBC2, co se dělo během zátěže databáze a co děláme, abychom to vyřešili. Berte to jako „nahlédnutí pod kapotu“ BFBC2.

Systémový přehled

Při hraní online, je každý herní klient a herní server permanentně propojen s herními backend servery.

Jsou zde oddělné backendy, každý pro určitou platformu BFBC2 (tedy PC/PS3/X360).

Backend je rozdělen na 2 části – jedna skupina jsou stroje, na kterých může běžet uživatelský software a databáze. Databáze není přímo přístupná pro herního klienta/server; mohou z ní získávat data pouze zasíláním požadavků k uživatelským softwarovým částem, které dále komunikují s databází.

Každá databáze je cluster, který je složený z několika strojů na kterých běží Oracle 9i s povoleným RAC.

V backendu je několik modulů a pár tabulek v databázi, jenž jsou sdíleny mezi několika platformami/ tituly. To jsou obvykle méně zatěžující procesy. Nicméně se o ně musíme starat, kdyby bylo potřeba provést nějaké výkonnostní změny ve fyzické konfiguraci jednoho ze strojů, pohánějících backend.

Statistiky

„Stat“ je krátký identifikátor, jenž má dodatečnou hodnotu. Statistiky jsou sledovány u každého hráče a jsou ukládány mezi herními koly. Pro BC2 existuje přibližně 2000 unikátních hodnot se statistikami. Některé z nich nemají nějaký přímý význam – vaše aktuální skóre s určitým povoláním, počet zabití s určitou zbraní apod. – zatímco ostatní statistiky jsou bezvýznamné a pouze zaznamenávají váš pokrok skrze různé achievementy/trophies, ocenění a vyznamenání.

Statistiky jsou uchovávány v několika obřích tabulkách v databázi Oracle.

Herní klient a statistiky

Herní klient pouze z databáze čte, nikdy nezapisuje.

Čtení z databáze se děje při dvou událostech: když se hráč přihlásí a když se hráč vrací ze serveru do herního menu. Klient má lokální cache všech statistik. Když nastane jedna z předešlých situací, herní klient zažádá o dodání statistik (například: hráčovo celkové skóre a celkový nahraný čas). Pokud se některá z těchto statistik liší od těch v lokální databázi, herní klient si zažádá o všechny statistiky (tedy asi o 2000 hodnot).

Herní klient používá tyto statistiky pouze pro zobrazení v menu, nepoužívá je při hraní v multiplayeru.

Herní server a statistiky

Herní server čte a i zapisuje do databáze statistik.

Když hráč přijde na server, server si zažádá asi o 1000 statistik z databáze.  Cokoliv co má dočinění se statistikami a rankem, je kontrolováno serverer (například: která zbraň je odemčena pro konkrétního hráče).

Server zapisuje hráčovi statistiky zpět do databáze, když hráč odchází ze serveru. Také, jsou veškeré hráčovi statistiky zapsány do databáze na konci každého kola. Toto minimalizuje riziko, že by se ztratil hráčův postup při pádu serveru. Při zapisování statistik, server zapisuje jen ty, kde se odehrála nějaká změna. Kromě toho, kdykoliv je to možné tak server dává pokyny jako „přidej 3 do stat jménem ABCD“, než aby dával například „přidej 27 do stat jménem ABCD“. Tím se tak minimalizuje riziko, že by nějaká chyba v síti nebo problémy s komunikací zapříčinily změnu statistik; nejhorší, co může nastat je, že se statistiky nenavýší, nemůžou být neúmyslně vynulovány nebo sníženy.

Obvykle herní server zapíše mnohem méně než 1000 statistik. Nemám po ruce přesná čísla, ale je to asi 100 statistik, které se obvykle aktualizují, když hráč dohraje celé kolo.

Případy zátěže u backend

Obvykle databáze reaguje na požadavky čtení/zápis uživatelského softwaru velmi rychle. Databáze umožňuje vyřídit požadavky z několika herních klientů/serverů paralelně; pokud je příliš mnoho požadavků najednou, nové požadavky jsou řazeny do řady. Normální čekací doba pro získání 2000 statistik je asi sekunda. Požadavek 2000 statistik trvá o trochu déle, než požadavek 1000 statistik – asi tak dvakrát déle. Databáze zpracovává požadavky ve frontě tak rychle, jak jen to je možné.

Požadavky nechodí popořadě. Někdy zažádá o statistiky spoustu serverů a klientů skoro ve stejný okamžik. Databáze tak, některé z těchto žádostí vyřídí o něco pomaleji než obvykle.

Databáze je nejslabší částí BFBC2; To znamená, že vlastní software zvládne mnohem více aktivních hráčů, než databáze.

Pokud klienti/servery vytvářejí spoustu žádostí delší dobu, tak počet nevyřízených požadavků ve frontě databáze narůstá a narůstá. Pokud je fronta už tak dlouhá, že databáze není schopna je vyřídit během 10s, tak uživatelský software to vzdá a zahlásí klientům/serverům, že je problém.

Případy vysoké zátěže u herního klienta/serveru

S tím co jste četli výše, si teď představte, co se stane, když se počet hráčů hrajících zároveň zvýší.

Z počátku, zde není moc hráčů. Databáze zvládá vyřizovat požadavky rychle a fronta je skoro pořád prázdná.

Jak se počet hráčů zvyšuje, je databáze stále schopna zvládnout většinu požadavků. Nicméně, příležitostně zažádá hodně klientů/serverů o požadavek na statistiky skoro ve stejný čas. To vyústí v naplnění fronty o něco více než obvykle. Některé z těchto žádostí ve frontě vyprší, jakmile dosáhnou 10 sekund. Vzhledem k tomu, že herní klient má větší požadavky na data (než server), tak obvykle jako první selže.

Jestliže požadavek herního klienta selže, pokusí se získat statistiky navýšením času o dalších 10 nebo 20 sekund – a potom to vzdá, a v herním menu se zobrazí, že hráč má hodnost 1 a nulové skóre, apod.

Jakmile se zátěž stále stupňuje, selhává i herní server v získávání statistik. Pokud se toto stane, hráč má na serveru hodnost 1 a nemá žádné statistiky – žádné unlocky. Pokud se tohle stane, herní server nezaznamenává a nezapisuje žádný postup hráče.

Nakonec, s opravdu vysokou zátěží, všechny požadavky od herních klientů a serverů selžou.

Vysoká zátěž proti velmi vysoké zátěži

Jedna důležitá věc, kterou byste měli vzít na vědomí ohledně online systémů a zátěže je, že zátěž se nebude chovat intuitivně, tak jak byste očekávali. Obvykle roste pomalu… dokud nedosáhne určité hranice a potom se vše vymkne kontrole a nastává horor. Je zde několik důvodů, proč se to děje.

Prvním je lidský faktor: Pokud je zátěž v takovém stádiu, že požadavky na statistiky selhávají občasně, tak to pak vypadá, že hráč ztratil celý svůj postup, ale při přihlášení/odhlášení (v případě nulových statistiky v menu) nebo odpojení/připojení (v případě nulových statistiky na serveru) je určitá procentuální šance, že se statistiky vrátí. Lidé to tedy dělají přirozeně znovu a znovu, dokud se jim jejich statistiky neobjeví, nebo nejsou dostatečně frustrovaní a vzdají to. Toto chování způsobí ještě větší zátěž na backendu než chování při normálním hraní, což zhoršuje celkový problém.

Další důvod může být v kódu; občas tak kód herního klienta/serveru je napsán tak, aby se snažil akci několikrát opakovat, pokud dojde k selhání. Tohle je dobrá věc, pokud backend není pod velkou zátěží – koneckonců, může být problém v důsledku momentálního nárazu. Nicméně pokud je zátěž vysoká, tak to problém zhoršuje (stejným způsobem jako „lidský faktor“).

Samozřejmě jsou tu také záležitostí, které se dějí na pozadí celé databáze – jako zálohování nebo pravidelná údržba/zpracování dat.

To znamená, že občas se zdá, že online systém funguje normálně i během zátěže, a potom se něco stane a během několika minut se vše může zhroutit.

Dobře se chovající systém závisí na tom, jakou funkci vykonává a jak se chovají uživatelé toho systému.

BFBC2 uživatelský backendoví software se chová dobře ve většině ohledů. Databáze trpí trochu z výše popsaných problémů – ta část kdy „hráč občas nedostane statistiky“ a „hráč nikdy nedostane statistiky“ má mnohem menší vliv, než byste čekali.

Bližší pohled na databázi samotnou

Nějakým způsobem zvládala databáze pobrat podstatně více hráčů dříve, než nyní. Jinými slovy, čtení/zápis v databázi zabere více času. Existují pro to 2 hlavní důvody.

Existuje teď mnohem více hráčů v databázi, než když jsme začali. Databáze jsou v pořádku a vyřizují požadavky jako „dej mi obsah pro hráče s ID=1234, je někde v té obří tabulce“, ale jejich výkon klesl a tabulky se rozšířily.

Tabulky samotné jsou rozkouskované. Před několika lety a několika hrami, když administrátoři databáze navrhovali databázové nastavení pro systém, se ptali co bude pro databázi hlavní prioritou. Odpověď byla – výkon běhu systému; databáze by měla být nastavena tak, aby zvládala zpracovat co nejvíce čtení/zápisů za vteřinu. Jeden úmyslný kompromis udělaný pro vysoký výkon byl, že databáze postupně získává malé mezery. Tyto mezery se automaticky neopravují. Množství „prázdného“ místa v databázi za čas naroste, a po nějaké době toto prázdné místo může vyústit v poklesy výkonu (cache paměti na discích už nejsou efektivní). Toto je vyřešeno tím, že jednou za několik měsíců se databáze vypne a je předělána – tím se tam odstraní všechny ty mezery. Nicméně, z nějakého důvodu se tyto pravidelné údržby neděli ani pro jeden BFBC2 titul.

Definování problémů

Problém který budeme řešit je následující: aktuální hráčská populace trpí z výpadků databáze. To se nemělo stát. Statistiky měly být stabilní i s počtem hráčů, který máme dnes a to mělo by to zvládnout i víc. Nebudeme se snažit, aby jeden backend zvládl 100 000 ze současných uživatelů.

Řešení problému

Za prvé se můžeme pokusit vytvořit individuální databáze, které budou rychleji dostupné.

– Vypnout databázi a předělat tabulky

To by jistě pomohlo. To je také první věc, kterou uděláme. (A plánujeme nové přestavění kdykoliv to bude potřeba v budoucnosti.)

– Zvětšit cache paměti na discích

Paměť je rychlejší než disk, takže pokud se v paměti uchová více z databáze bude možné k ní přistupovat rychleji.

Clustery PC a X360 databáze mají tolik paměti, kolik je možné. Cluster pro PS3 má zatím stále místo pro další paměť.

Přidáme ji.

– Předělání tabulek

Styl tabulek není navržen pro BFBC2; tento styl tabulek je použit mnoha jinými tituly od EA. Změna design by zlepšila výkon pro požadavky a to znatelně. Nicméně, čas potřebný pro provedení takové úpravy, testování a spuštění nemáme.

Proto to dělat nebudeme.

– Přidání dalších strojů do databázových clusterů

Jeden by si myslel, že zdvojnásobením počtu strojů v databázovém clusteru, také dvojnásobně zvýší výkon clusteru. Ve skutečnosti, všechny stroje potřebují zkoordinovat svoji práci s ostatními. Proto, přidáním dalších strojů může pomoci jen občas. V některých případech potřeby vyššího výkonu to může i zhoršit.

Proto to dělat nebudeme.

– Přechod na novější verzi Oracle nebo celkově nové databáze

Opět zde platí, že dobu potřebnou pro tuto změnu a oživení systému, nemáme.

Proto to dělat nebudeme.

Nebo, snížit množství přístupů do databáze:

– Upravit herní klienty, aby žádali méně statistik

Herní klient už nyní načítá méně dat, než načítal (v případech skóre/času nebo přidavších změnách statistik). Pokud by klient nenahrával všechny statistiky do cache paměti, herní menu by nebylo schopné zobrazit správný postup hráče. Možná by bylo možné rozdělit načítání statistik na dvě části – jednu pro zobrazení nejdůležitějších statistik v menu (v případě BC2 PC, položky se statistikami na hlavní obrazovce) a druhou část pro zobrazení všech achievementů/trophies apod.

Uvažujeme nad tím.

– Vytvořit cache paměť v herních serverech pro hráče

Servery by mohly mít cache stejně jako herní klienti, ale cache statistiky pro spoustu hráčů. To by pomohlo lidem, kteří hrají obvykle na jednom serveru. Není jisté, jestli by to vytvořilo nějaké rozdíl (nemám pro to žádné statistiky, jenom hádám).

Nebudeme to dělat.

– Upravit herní servery, aby žádali méně statistik

Načítání méně statistik, by způsobilo, že herní server by nebyl schopen správně vyhodnotit celkový hráčův postup.

Proto to nebudeme dělat.

– Upravit herní servery, aby zapisovali méně statistik

Pokud by herní servery zapisovali statistiky do backendu každé N-té kolo, namísto každého kola, zapisovalo by se tak méně unikátních dat. Je tu jedna věc – je zde vysoký risk, hráč by mohl ztratit svůj postup, díky výpadku serveru – ale N=2 nebo N=3 zachovává jako risk tak i nebude mít žádný vliv.

Tuto změnu jsme už implementovali pro obě konzole a budeme ho implementovat i pro PC.

Jakmile provedeme jednu ze změn, tak budeme celou situaci posuzovat znovu apod…

Pokud jste to dočetli až sem, tak to gratuluji 😉 Jo a najdete-li nějakou chybku, tak mi dejte vědět.

Battlefield 1 lze pořídít v českých e-shopech za cenu od Kč do (Zdroj: Heureka.cz) Porovnat ceny >>

Jeden komentář

Napsat komentář