Optymalizacja serwera Minecraft

Optymalizacja serwera Minecraft
Na naszym blogu już to mamy powiedział, jak stworzyć własny serwer Minecraft, ale od tego czasu minęło 5 lat i wiele się zmieniło. Dzielimy się z Wami aktualnymi sposobami tworzenia i optymalizacji części serwerowej tak popularnej gry.

W ciągu swojej 9-letniej historii (licząc od daty premiery) Minecraft zdobył niesamowitą liczbę fanów i hejterów zarówno wśród zwykłych graczy, jak i maniaków. Prosta koncepcja świata z klocków ewoluowała od prostej formy rozrywki do uniwersalnego medium służącego do komunikowania się i tworzenia różnorodnych obiektów ze świata rzeczywistego.

Oprócz konstrukcji gra posiada możliwość tworzenia logika, które pozwalają na wdrożenie pełnoprawnych algorytmów wewnątrz Minecrafta. YouTube jest pełen imponujących filmów, na których ludzie, wkładając ogromny wysiłek i poświęcając dużo czasu, stworzyli kopię tego czy innego urządzenia elektronicznego lub zbudowali szczegółową kopię istniejący и powieściowy konstrukcje architektoniczne. Wszystko ogranicza jedynie wyobraźnia gracza i możliwości uniwersum gry.


Ale nie mówmy dalej o tym, co dokładnie tworzą gracze, ale spójrzmy na część serwerową aplikacji i podkreślmy problemy (czasami bardzo złożone), które mogą pojawić się podczas pracy pod obciążeniem. Zarezerwujmy od razu, że będziemy mówić tylko o wersji Java Edition.

Rodzaje serwerów

Najprostszą opcją jest serwer wbudowany w klienta gry. Stworzyliśmy świat, wcisnęliśmy jeden przycisk i serwer stał się dostępny poprzez sieć lokalną. Ta opcja nie jest w stanie wytrzymać żadnego poważnego obciążenia, dlatego nawet jej nie rozważymy.

Wanilia

Mojang Studios bezpłatnie dystrybuuje część serwerową gry w postaci aplikacji Java na oficjalnej stronie internetowej. Dzięki temu możesz stworzyć swój własny serwer dedykowany i osobisty świat, dzięki czemu można go połączyć z dowolnego miejsca na świecie. Dla tych, którzy robią to po raz pierwszy, jest świetna instruktaż, dostępne na odpowiedniej Wiki o grach.

Takie podejście ma jedną poważną wadę, a mianowicie brak gotowych możliwości podłączenia wtyczek rozszerzających funkcjonalność serwera i pozwalających nie tylko zautomatyzować wiele procesów, ale także zoptymalizować wydajność. Ponadto oficjalny serwer ma dość duże zużycie pamięci RAM dla każdego podłączonego gracza.

bukkit

Aplikacja serwerowa stworzona przez pasjonatów w oparciu o wersję Vanilla bukkit znacznie rozszerzył możliwości gry poprzez obsługę wtyczek i modów (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 zwykłego oprogramowania. Co ciekawe, aplikacja ta wymagała znacznie mniej pamięci.

Instalacja Bukkita nie jest trudna, odpowiednie instrukcje znajdują się w zasobie GamePedia. Ale to nie ma sensu, ponieważ od 2014 roku zespół Bukkit się rozwiązał, twórcy projektu zostali pracownikami Mojang Studios i magazyn opuszczony. Tym samym Bukkit jest właściwie martwy i warto zwrócić uwagę na dwa kolejne projekty.

SpigotMC

Aby ułatwić życie twórcom wtyczek, potrzebne było API umożliwiające interakcję ze światem gry. To jest dokładnie problem, który rozwiązali twórcy. Czop, biorąc rdzeń Bukkit i przerabiając go, aby osiągnąć lepszą niezawodność i wydajność. Niemniej jednak, Repozytorium Gita projekt został zablokowany ze względu na ustawę Digital Millennium Copyright Act (DMCA) i nie da się stamtąd pobrać kodu źródłowego.

Obecnie SpigotMC jest aktywnie rozwijany i wykorzystywany. Obsługuje wszystkie wtyczki stworzone dla Bukkit, ale nie jest z nim kompatybilny wstecz. Aby obejść usunięcie DMCA, wynaleziono elegancką metodę zwaną BuildTools. Narzędzie to eliminuje potrzebę rozpowszechniania skompilowanej aplikacji i pozwala użytkownikom kompilować Spigot, CraftBukkit i Bukkit z kodu źródłowego. Wszystko to sprawia, że ​​zakaz DMCA jest bezużyteczny.

PapierMC

Wszystko wydawało się fajne, a Spigot stał się świetną opcją. Niektórym entuzjastom to jednak nie wystarczyło i stworzyli własny widelec Spigot „na sterydach”. NA strona projektu kluczową zaletą jest to, że „jest głupio szybki”. Rozwinięty wspólnota pozwala na szybkie rozwiązywanie pojawiających się problemów, a rozbudowane API umożliwia tworzenie ciekawych wtyczek. Możesz uruchomić PaperMC za pomocą jednego prostego polecenia podanego w dokumentacja.

PaperMC ma doskonałą kompatybilność, więc wtyczki napisane dla SpigotMC mogą z łatwością działać na PaperMC, ale bez oficjalnego wsparcia. Obecna jest także kompatybilność wsteczna ze SpigotMC. Teraz, gdy wymieniliśmy różne opcje tworzenia serwera, przejdźmy do problemów z wydajnością, które mogą się pojawić.

Problemy i rozwiązania

Najważniejszą rzeczą, którą musisz zrozumieć, jest to, że wszystko, co jest związane z przetwarzaniem świata gry, będzie przetwarzane tylko na jednym rdzeniu obliczeniowym serwera fizycznego. Jeśli więc nagle będziesz miał doskonały serwer z kilkunastu rdzeniami obliczeniowymi, to załadowany zostanie tylko jeden. Wszystkie inne będą praktycznie bezczynne. Taka jest architektura aplikacji i nic nie możesz z tym zrobić. Wybierając więc serwer, należy zwrócić uwagę nie na liczbę rdzeni, ale na częstotliwość taktowania. Im jest ona wyższa, tym lepsza będzie wydajność.

Jeśli chodzi o kwestię pojemności pamięci RAM, powinniśmy wyjść z następujących wskaźników:

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

Należy pamiętać, że aplikacja Java zawsze potrzebuje rezerwy pamięci RAM. Jeśli spodziewasz się zużycia pamięci na poziomie 8 gigabajtów, tak naprawdę musisz mieć 12. Liczby są względne, ale istota się nie zmienia.

Aby uruchomić część serwerową, zalecamy użycie flag określonych w artykule Strojenie flag JVM – G1GC do zbierania śmieci dla Minecrafta. Ta „czarna magia” pozwala serwerowi poprawnie skonfigurować „odśmiecacz” i zoptymalizować wykorzystanie pamięci RAM. Nie należy przydzielać więcej pamięci, niż serwer faktycznie zużywa w czasie szczytowego napływu graczy.

Generowanie mapy blokowej

„Czy naprawdę myślisz, że księżyc istnieje tylko wtedy, gdy na niego patrzysz?” (Alberta Einsteina)

Całkowicie nowy serwer. Gdy tylko gracz pomyślnie połączy się po raz pierwszy, postać z gry pojawi się w ogólnym punkcie gromadzenia (spawn). Jest to jedyne miejsce, w którym świat gry jest wstępnie generowany przez serwer. W tym samym momencie część klienta przegląda ustawienia, a kluczowym parametrem jest odległość rysowania. Jest ona mierzona w kawałkach (obszar mapy ma wymiary 16×16 i wysokość 256 bloków).Ile wskazanych fragmentów oznacza dokładnie, ile będzie żądanych z serwera.

Serwer przechowuje globalną mapę świata i jeśli w momencie pojawienia się postaci w grze nie ma na niej jeszcze wygenerowanych bloków, to serwer dynamicznie je generuje i przechowuje. Nie tylko wymaga to dużych zasobów obliczeniowych, ale także stale zwiększa rozmiar mapy świata. Na jednym z najstarszych serwerów anarchistycznych 2b2t (2builders2tools) Rozmiar mapy przekroczył już 8 Tb, a granica świata wynosi około 30 milionów bloków. Z tym serwerem wiążą się tysiące historii i zasługuje on na osobny artykuł w tej serii.

Wygenerowanie świata wokół jednego gracza nie stanowi problemu. Generowanie świata wokół setek graczy spowoduje niewielkie spowolnienie serwera na krótki czas, po czym obciążenie spadnie. Generowanie świata na odległość renderowania klienta dla około tysiąca graczy już jest w stanie „upuścić” serwer i wyrzucić z niego wszystkich klientów z powodu przekroczenia limitu czasu.

W oprogramowaniu serwera jest taka wartość jak TPS (Tick na serwer - tick na sekundę). Zwykle 1 cykl zegara wynosi 50 ms. (1 sekunda świata rzeczywistego równa się 20 znacznikom świata gry). Jeśli przetwarzanie jednego ticka 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. W ten sposób eliminujemy potrzebę dynamicznego generowania podczas gry, a serwer będzie musiał jedynie czytać istniejącą mapę. Obydwa problemy można rozwiązać za pomocą jednej wtyczki Granica Świata.

Najłatwiej jest ustawić granicę świata w postaci okręgu względem punktu odrodzenia (chociaż można nadać mu dowolny kształt) za pomocą jednego polecenia:

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

Jeśli postać gracza spróbuje przekroczyć granicę, zostanie odepchnięta o kilka przecznic. Jeśli zrobi się to kilka razy w określonym czasie, sprawca zostanie przymusowo teleportowany do punktu odrodzenia. Pregenerację świata wykonuje się jeszcze prościej za pomocą polecenia:

/wb fill

Ponieważ ta akcja może potencjalnie wpłynąć na graczy na serwerze, pamiętaj o potwierdzeniu:

/wb confirm

W sumie wygenerowanie świata o promieniu 5000 bloków (~40 miliardów bloków) na procesorze Intel® Xeon® Gold 2 zajęło około 6240 godzin. Dlatego też, jeśli chcesz wstępnie wygenerować większą mapę, pamiętaj, że proces ten zajmie przyzwoitą ilość czasu, a TPS serwera zostanie poważnie zmniejszony. Pamiętaj też, że nawet promień 5000 bloków będzie wymagał około 2 GB miejsca na dysku.

Pomimo tego, że najnowsza wersja wtyczki została opracowana dla wersji Minecraft 1.14, eksperymentalnie stwierdzono, że na kolejnych wersjach działa ona świetnie. Dostępna jest pełna lista poleceń wraz z objaśnieniami na forum wtyczek.

Bloki problemowe

W Minecrafcie istnieje ogromna różnorodność bloków. Chcielibyśmy jednak zwrócić uwagę czytelników na taki blok jak TNT. Jak sama nazwa wskazuje, blok ten jest materiałem wybuchowym (przypis redaktora - jest to przedmiot gry ze świata wirtualnego i przedmiot ten nie ma nic wspólnego z prawdziwymi materiałami wybuchowymi). Jego osobliwość polega na tym, ż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 zacznie spadać.

Jeżeli bloków TNT jest kilka, to detonacja jednego bloku powoduje detonację i aktywację grawitacji w blokach sąsiednich, rozrzucając je we wszystkich kierunkach. Cała ta piękna mechanika po stronie serwera wygląda jak mnóstwo operacji obliczania trajektorii każdego bloku, a także interakcji z sąsiednimi blokami. Zadanie wymaga dużych zasobów, co każdy może łatwo sprawdzić. Wygeneruj i zdetonuj kostkę z bloków TNT o wymiarach co najmniej 30x30x30. A jeśli myślałeś, że masz dobry, mocny komputer do gier, bardzo się 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 80% obciążenia procesora przez cały czas detonacji bloku. Dlatego też, jeśli któremukolwiek graczowi uda się to zrobić, problem z wydajnością będzie dotyczył wszystkich graczy na serwerze.

Jeszcze trudniejsza opcja – Kryształy krawędziowe. Jeśli mimo to TNT eksploduje sekwencyjnie, wówczas Kryształy Krawędziowe eksplodują wszystkie w tym samym czasie, co teoretycznie może całkowicie zatrzymać działanie aplikacji serwerowej.

Tego scenariusza można uniknąć jedynie poprzez całkowity zakaz używania tych klocków w świecie gry. Na przykład za pomocą wtyczki ŚwiatGuard. Należy pamiętać, że ta wtyczka sama w sobie nie działa bez innej wtyczki worldedit. Więc najpierw zainstaluj WorldEdit, a potem WorldGuard.

wniosek

Prawidłowe zarządzanie serwerem gier nie jest łatwym zadaniem. Trudności i obniżona wydajność będą na ciebie czekać na każdym kroku, szczególnie jeśli nie weźmiesz pod uwagę samej mechaniki rozgrywki. Nie da się wszystkiego przewidzieć, ponieważ gracze potrafią czasami wykazać się dużą kreatywnością, próbując zmusić serwer do zrobienia czegoś, do czego nie był przeznaczony. Tylko rozsądna równowaga pomiędzy ryzykiem a ustalonymi ograniczeniami umożliwi ciągłą pracę serwera i nie obniży jego wydajności do wartości krytycznych.

Podczas kwarantanny niektórzy z naszych pracowników tęsknili za swoimi ulubionymi biurami i postanowili odtworzyć je w Minecraft. Ty również masz szansę przyjechać do nas, nie narażając zdrowia i nie marnując czasu w drodze.

W tym celu zapraszamy wszystkich na nasz serwer Minecraft.selectel.ru (wersja klienta 1.15.2), w której odtworzono centra danych Tsvetochnaya-1 i Tsvetochnaya-2. Nie zapomnij wyrazić zgody na pobranie dodatkowych zasobów, są one niezbędne do prawidłowego wyświetlania niektórych lokalizacji.

Czekają na Ciebie zadania, kody promocyjne, pisanki i przyjemna komunikacja.

Źródło: www.habr.com

Dodaj komentarz