Optymalizacja serwera Minecraft

Optymalizacja serwera Minecraft
Na naszym blogu już opowiadaliśmy, jak stworzyć własny serwer Minecraft, jednak od tego czasu minęło 5 lat i wiele się zmieniło. Dzielimy się z wami aktualnymi sposobami tworzenia i optymalizacji części serwerowej tej popularnej gry.

W ciągu swojej 9-letniej historii (licząc od daty wydania) Minecraft zdobył ogromną liczbę fanów i krytyków zarówno wśród zwykłych graczy, jak i geeków. Prosta koncepcja świata z klocków przekształciła się z zwykłej rozrywki w uniwersalne środowisko do komunikacji i tworzenia różnych obiektów z rzeczywistego świata.

Oprócz budowania, gra daje możliwość tworzenia schematów logicznych, które pozwalają na realizację pełnoprawnych algorytmów wewnątrz Minecraft. Na YouTube jest wiele imponujących filmów, na których ludzie, wkładając ogromny wysiłek i czas, stworzyli kopię jakiegoś urządzenia elektronicznego lub zbudowali szczegółową kopię istniejących i fikcyjnych obiektów architektonicznych. Wszystko ogranicza się jedynie do wyobraźni gracza i możliwości świata gry.

Odtwarzaj wideo

Ale nie będziemy dalej mówić o tym, co dokładnie gracze tworzą, a przyjrzymy się części serwerowej aplikacji i omówimy problemy (czasami dość skomplikowane), które mogą się pojawić podczas pracy pod obciążeniem. Od razu zaznaczamy, że mowa będzie tylko o edycji Java.

Rodzaje serwerów

Najprostszym wariantem jest serwer wbudowany w klienta gry. Stworzyliśmy świat, kliknęliśmy jeden przycisk i oto serwer stał się dostępny w sieci lokalnej. Taki wariant nie wytrzyma żadnego poważnego obciążenia, dlatego nawet go nie rozważymy.

Vanilla

Firma Mojang Studios udostępnia serwerową część gry jako aplikację Java za darmo na oficjalnej stronie. Pozwala to stworzyć własny serwerze dedykowanym i osobisty świat, udostępniając go do podłączenia z każdej części planety. Dla tych, którzy robią to po raz pierwszy, istnieje wspaniały tutorial, dostępny w odpowiedniej Wiki gry.

Ten sposób ma jedną poważną wadę, a mianowicie brak możliwości łatwego podłączania wtyczek, które rozszerzają funkcjonalność serwera i pozwalają nie tylko automatyzować wiele procesów, ale także optymalizować wydajność. Ponadto, oficjalny serwer ma dość dużą pamięć RAM zużywaną na każdego podłączonego gracza.

Bukkit

Serwerowe oprogramowanie stworzone przez entuzjastów na bazie wersji Vanilla Bukkit znacznie rozszerzało możliwości gry dzięki wsparciu dla wtyczek i modyfikacji. Pozwoliło to nie tylko na dodawanie nowych bloków do rozgrywki, ale także na wykonywanie różnych manipulacji, które były niedostępne dla oprogramowania Vanilla. Co ciekawe, to oprogramowanie wymagało znacznie mniej pamięci.

Instalacja Bukkit nie stanowi większego problemu, odpowiednia instrukcja jest dostępna na stronie GamePedia. Ale to nie ma sensu, ponieważ od 2014 roku zespół Bukkit uległ rozkładowi, a programiści projektu zostali pracownikami Mojang Studios, a repozytorium projekt został porzucony. Tak więc, Bukkit jest de facto martwy, a warto zwrócić uwagę na dwa następne projekty.

SpigotMC

Aby ułatwić życie programistom wtyczek, istniała potrzeba API, które pozwoli na interakcję ze światem gry. Tę potrzebę zaspokoili twórcy Spigot, bazując na jądrze Bukkit i przerabiając je, aby osiągnąć lepszą niezawodność i wydajność. Niemniej jednak, repozytorium Git projekt został zablokowany w związku z Ustawą o prawach autorskich w erze cyfrowej (DMCA), i nie można pobrać stamtąd źródeł.

Obecnie SpigotMC jest aktywnie rozwijany i wykorzystywany. Wspiera wszystkie wtyczki stworzone dla Bukkit, jednak nie jest z nim wstecznie kompatybilny. Aby obejść zakaz DMCA Takedown, stworzono elegancki sposób o nazwie BuildTools. To narzędzie eliminuje potrzebę dystrybucji skompilowanej aplikacji i pozwala użytkownikom na kompilację Spigot, CraftBukkit i Bukkit z kodu źródłowego. Wszystko to czyni zakaz DMCA bezsensownym.

PaperMC

Wydawałoby się, że wszystko jest w porządku, a Spigot stał się świetnym wyborem. Ale niektórzy entuzjaści uznali, że to za mało i stworzyli swój własny fork Spigota "na sterydach". Na Część 2: laboratoria kluczowym atucie zapisano, że „jest absurdalnie szybki”. Rozwinięte społeczność pozwala na szybkie rozwiązywanie pojawiających się problemów, a rozszerzone API umożliwia tworzenie interesujących wtyczek. Uruchomienie PaperMC można zrealizować jedną prostą komendą, przedstawioną w dokumentacji.

Z kompatybilnością w PaperMC jest wszystko w porządku, więc napisane wtyczki pod SpigotMC łatwo zadziają także na PaperMC, ale bez oficjalnego wsparcia. Wsteczna kompatybilność ze SpigotMC również jest obecna. Teraz, gdy wymieniliśmy różne sposoby tworzenia serwerów, przejdźmy do problemów wydajności, które mogą się pojawić.

Problemy i rozwiązania

Najważniejsze, co należy zrozumieć, to to, że wszystko, co dotyczy przetwarzania świata gry, będzie obsługiwane tylko na jednym rdzeniu fizycznego serwera. Tak więc, jeśli masz świetny serwer z dziesięcioma rdzeniami obliczeniowymi, obciążone będzie tylko jedno. Pozostałe będą w rzeczywistości bezczynne. Taka jest architektura aplikacji, i nic z tym nie zrobisz. Przy wyborze serwera należy zwrócić uwagę nie na liczbę rdzeni, lecz na częstotliwość taktowania. Im wyższa, tym lepsza wydajność.

Jeśli chodzi o pytanie o ilość pamięci RAM, należy uwzględnić następujące wskaźniki:

  • planowana liczba graczy;
  • planowana liczba światów na serwerze;
  • rozmiar każdego świata.

Należy pamiętać, że aplikacji Java zawsze potrzebny jest zapas pamięci RAM. Jeśli przewidujesz zużycie pamięci na poziomie 8 gigabajtów, to w rzeczywistości powinieneś mieć 12. Liczby są orientacyjne, ale zasada się nie zmienia.

Aby uruchomić część serwerową, zaleca się skorzystanie z flag wymienionych w artykule Tuning the JVM – G1GC Garbage Collector Flags for Minecraft. Ta "czarna magia" pozwala serwerowi prawidłowo skonfigurować "zbieracza śmieci" i optymalizuje wykorzystanie pamięci RAM. Nie należy przydzielać więcej pamięci, niż serwer faktycznie zużywa przy szczytowym obciążeniu graczy.

Generacja mapy bloków

„Czy naprawdę uważasz, że Księżyc istnieje tylko wtedy, gdy na niego patrzysz?” (Albert Einstein)

Nowy serwer. Gdy gracz po raz pierwszy pomyślnie się połączy, postać gracza pojawi się w ogólnej strefie spawnu. To jedyne miejsce, gdzie świat gry jest wstępnie generowany przez serwer. W tym samym momencie klient sprawdza ustawienia, a kluczowym parametrem jest zasięg renderowania. Mierzy się go w chunkach (obszar mapy 16×16 i wysokości 256 bloków). Ile chunków zostanie określonych, tyle zostanie zażądane od serwera.

Na serwerze przechowywana jest globalna mapa świata, a jeśli w punkcie spawnu postaci gracza nie ma jeszcze wygenerowanych bloków, serwer dynamicznie je generuje i zapisuje. To nie tylko wymaga dużych zasobów obliczeniowych, ale także nieustannie zwiększa rozmiar mapy świata. Na jednym z najstarszych anarchicznych serwerów 2b2t (2builders2tools) rozmiar mapy przekroczył już 8 TB, a granica świata przebiega na poziomie 30 milionów bloków. Z tym serwerem związane są tysiące historii i zasługuje na osobny artykuł w serii artykułów.

Generowanie świata wokół jednego gracza nie stanowi problemu. Generowanie świata wokół setki graczy spowoduje niewielkie spowolnienia serwera przez krótki czas, po czym obciążenie spadnie. Generowanie świata na zasięg renderowania klienta wokół tysiąca graczy może już 'zrujnować' serwer i wyrzucić wszystkich klientów z powodu przekroczenia limitu czasu.

W oprogramowaniu serwera istnieje taki parametr jak TPS (Ticks per Server — takty na sekundę). Standardowo 1 takt trwa 50 ms. (1 sekunda rzeczywistego świata odpowiada 20 taktom świata gry). Jeśli czas przetwarzania jednego taktu wzrośnie do 60 sekund — aplikacja serwera zostanie zamknięta, wyrzucając wszystkich graczy.

Rozwiązaniem jest ograniczenie świata do określonych współrzędnych i wykonanie wstępnej generacji bloków. Dzięki temu nie ma potrzeby dynamicznej generacji w trakcie gry, a serwer wystarczy, aby przeczytał już istniejącą mapę. Oba problemy rozwiązuje jeden plugin WorldBorder.

Najłatwiej jest ustawić granicę świata w postaci okręgu względem punktu spawnu (chociaż można ustawić ją w dowolnym kształcie) przy użyciu jednego polecenia:

/wb set <радиус в блоках> spawn

Jeśli postać gracza spróbuje przekroczyć granicę, zostanie odesłana o kilka bloków wstecz. Jeśli zrobi to kilka razy w ograniczonym czasie, naruszyciel zostanie przymusowo teleportowany do punktu respawnu. Wstępna generacja świata wykonuje się jeszcze prościej, poleceniem:

/wb fill

Ponieważ działanie to może potencjalnie wpłynąć na graczy znajdujących się na serwerze, nie zapomnij potwierdzić jego wykonania:

/wb confirm

Łącznie na wygenerowanie świata o promieniu 5000 bloków (~40 miliardów bloków) potrzeba około 2 godzin na procesorze Intel® Xeon® Gold 6240. Dlatego, jeśli chcesz uruchomić pre-generację większej mapy, miej na uwadze, że proces ten zajmie sporo czasu, a TPS serwera będzie poważnie obniżone. Ponadto pamiętaj, że nawet promień 5000 bloków wymaga około 2 GB miejsca na dysku.

Mimo że ostateczna wersja wtyczki została opracowana dla Minecrafta wersji 1.14, doświadczalnie stwierdzono, że działa świetnie także w późniejszych wersjach. Pełna lista komend z wyjaśnieniami jest dostępna na forum wtyczki.

Bloki problematyczne

Rodzajów bloków w Minecraft jest wiele. Chcielibyśmy jednak zwrócić uwagę czytelników na taki blok jak TNT. Jak wskazuje nazwa, blok ten jest materiałem wybuchowym. (uwaga redakcji — to przedmiot wirtualnego świata i nie ma nic wspólnego z prawdziwymi materiałami wybuchowymi). Jego cechą jest to, że w momencie aktywacji zaczyna na niego działać siła grawitacji. Zmusza to serwer do obliczenia wszystkich współrzędnych, jeśli w tym momencie blok zaczyna opadać.

Jeśli jest kilka bloków TNT, detonacja jednego bloku wywołuje detonację i włączenie grawitacji sąsiednich bloków, rozrzucając je na wszystkie strony. Cała ta piękna mechanika po stronie serwera wygląda jak wiele operacji obliczających trajektorię każdego z bloków oraz interakcje z sąsiednimi blokami. Zadanie to jest niezwykle zasobożerne, co każdy może łatwo sprawdzić. Wygeneruj i zdetonuj sześcian z bloków TNT o wymiarach co najmniej 30x30x30. A jeśli myślałeś, że masz dobry, mocny komputer gamingowy, to się bardzo myliłeś 😉

/fill ~ ~ ~ ~30 ~30 ~30 minecraft:tnt

Optymalizacja serwera Minecraft
Podobny „eksperyment” na serwerze z procesorem Intel® Xeon® Gold 6240 doprowadził do poważnego spadku TPS i obciążenia CPU na poziomie 80% przez cały czas detonacji bloków. A zatem, jeśli którykolwiek z graczy zdoła coś podobnego wykonać, problem z wydajnością dotknie wszystkich graczy znajdujących się na serwerze.

Jeszcze bardziej surowa wersja — Kryształy Krańca. Jeśli TNT rzeczywiście wybucha sekwencyjnie, Kryształy Krańca detonują wszystkie jednocześnie, co w teorii może całkowicie zatrzymać działanie aplikacji serwerowej.

Uniknąć tego scenariusza można tylko całkowicie zakazując używania tych bloków w świecie gry. Na przykład, za pomocą wtyczki WorldGuard. Zauważ, że sama wtyczka nie działa bez innej wtyczki WorldEdit. Więc najpierw instalujesz WorldEdit, a potem WorldGuard.

Podsumowanie

Zarządzanie serwerem gry to niełatwe zadanie. Trudności i spadki wydajności będą czekać na każdym kroku, szczególnie gdy nie bierze się pod uwagę samej mechaniki rozgrywki. Nie da się przewidzieć wszystkiego, ponieważ gracze czasami są bardzo pomysłowi w próbach zmuszenia serwera do wykonania czegoś, do czego nie był przeznaczony. Tylko rozsądna równowaga między ryzykiem a narzuconymi ograniczeniami pozwoli serwerowi pracować w trybie ciągłym i nie obniżać swojej wydajności do krytycznych wartości.

Na kwarantannie niektórzy z naszych pracowników stęsknili się za ulubionymi biurami i postanowili odtworzyć je w Minecraft. Ty również masz szansę do nas zajrzeć, nie ryzykując własnym zdrowiem i nie tracąc czasu na podróż.

W tym celu zapraszamy wszystkich chętnych na nasz serwer minecraft.selectel.ru (wersja klienta 1.15.2), gdzie odtworzono centra danych Kwiatowa-1 i Kwiatowa-2. Nie zapomnij zgodzić się na pobranie dodatkowych zasobów, są one konieczne do poprawnego wyświetlenia niektórych lokalizacji.

Czekają na Ciebie questy, kody promocyjne, „pisanki” i miłe rozmowy.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster