// Minecraft

Folia: wielowątkowy Minecraft i dlaczego (jeszcze) nie dla ciebie

Folia: wielowątkowy Minecraft i dlaczego (jeszcze) nie dla ciebie

Folia to eksperymentalny fork Papera, który dzieli wczytany świat na regiony i tickuje każdy region na osobnym wątku. Vanilla Minecraft i Paper przetwarzają cały tick świata na jednym wątku, dwadzieścia razy na sekundę, i właśnie dlatego taktowanie pojedynczego rdzenia waży więcej niż ich liczba. Folia psuje większość istniejących pluginów i daje zysk wyłącznie wtedy, gdy gracze siedzą daleko od siebie: dla praktycznie każdego serwera poniżej setek jednoczesnych graczy lepszym wyborem zostaje Paper.

Dlaczego Minecraft tickuje na jednym wątku?

Serwer Minecraft kręci pętlę, która dwadzieścia razy na sekundę aktualizuje cały świat: moby się ruszają, redstone przełącza, woda płynie, lejki przesuwają przedmioty, a chunki (kwadratowe fragmenty mapy) są wczytywane i zapisywane. Na jeden tick przypada więc mniej więcej pięćdziesiąt milisekund. Jeśli praca się w tym nie mieści, TPS (liczba ticków na sekundę) spada i wszystko robi się ciągnące: zegary się spóźniają, farmy dają mniej, lejki się wloką.

To, że dzieje się to na jednym wątku, wynika z budowy świata gry: wszystko zależy od wszystkiego, a kolejność ma znaczenie. Wagonik zasila lejek, ten lejek napełnia skrzynię, którą odczytuje komparator, a komparator przełącza redstone. Zrób to na dwóch wątkach naraz, a dostaniesz wyścigi: dwa wątki sięgające po ten sam przedmiot albo chunk zapisany w połowie, gdy jeszcze się zmienia. Na tym serwery kiedyś się wykładały.

Dlatego Paper nie zrównoleglił samego ticka, tylko pracę wokół niego: generowanie chunków, chunk-I/O i ruch sieciowy działają w dużej mierze obok głównego wątku. Razem z setkami łatek wydajnościowych nad Spigotem daje to stabilniejszy TPS, i to bez utraty choćby jednego pluginu.

Dlaczego taktowanie jest ważniejsze niż liczba rdzeni?

Ponieważ najcięższe zadanie, czyli tick świata, i tak ląduje na jednym rdzeniu i tam musi się zmieścić w pięćdziesięciu milisekundach. Procesor z większą liczbą rdzeni nie skróci tego jednego ticka ani o milisekundę; procesor szybszy w przeliczeniu na rdzeń owszem. Dodatkowe rdzenie nie są bezużyteczne, bo korzystają z nich chunk-I/O, sieć i garbage collector, ale TPS-u ci nie uratują.

Dlatego u nas obok linii budżetowej na AMD EPYC 7443P stoi również linia premium na AMD Ryzen 9 9950X. Dużo rdzeni sprawdza się przy kilku serwerach obok siebie; wyższe taktowanie wygrywa w chwili, gdy pojedynczy świat zaczyna się dusić. Więcej RAM-u tego nie rozwiąże: RAM decyduje o tym, ile zmieści się w pamięci, a nie jak szybko kończy się tick. Co faktycznie pomaga, opisaliśmy w tekście o optymalizacji serwera Minecraft i ograniczaniu lagów.

Co Folia robi inaczej?

Folia dzieli wczytany świat na regiony: grupy chunków leżących na tyle blisko siebie, że mogą na siebie wpływać. Każdy region dostaje własną pętlę ticków i działa na własnym wątku z puli wątków. Dwaj gracze budujący tysiące bloków od siebie siedzą w dwóch osobnych regionach, a te tickują naprawdę równocześnie na dwóch rdzeniach.

Regiony nie są przypisane na stałe: gdy dwaj gracze idą ku sobie, ich regiony zlewają się w jeden region na jednym wątku, a gdy się rozchodzą, znowu się dzielą. Traktuj Folię jak garść mini-serwerów w jednym procesie. Dopóki stoją osobno, skaluje się to razem z liczbą rdzeni; w chwili gdy się zleją, wracasz do jednego wątku.

Dlaczego Folia psuje większość pluginów?

Całe API Bukkita, Spigota i Papera zakłada, że istnieje dokładnie jeden główny wątek. Pluginy planują swoją pracę przez Bukkit.getScheduler().runTask(...) i mogą potem bezpiecznie ruszyć każdy blok, każdego gracza i każde entity. W Folii tego jednego głównego wątku już nie ma: są schedulery per region, per entity oraz globalny, a plugin może dotykać wyłącznie tego, co należy do jego własnego regionu.

To nie jest linijka w konfiguracji, którą się przestawia, tylko przepisywanie kodu w samym pluginie. Jeśli tego nie zrobiono, milszym scenariuszem jest błąd przy starcie. Gorszy jest ten, w którym plugin niby działa, a po cichu miesza dane: znikające claimy, duplikaty przedmiotów, logi, które się nie zgadzają. Zakładaj, że plugin nie działa, dopóki nie zobaczysz builda z jawnym wsparciem dla Folii. Stałe pozycje z naszego zestawienia najlepszych pluginów do Minecrafta, takie jak EssentialsX, LuckPerms i CoreProtect, napisano pod klasyczny model Papera.

Jeśli zamiast pluginów odpalasz modpacka, Folia i tak nie wchodzi w grę: All the Mods 10 działa na NeoForge, a to zupełnie inny tor niż fork Papera.

Dlaczego Folia pomaga tylko przy rozproszonych graczach?

Równoległe działanie ma sens tylko wtedy, gdy jest co dzielić. Jeśli wszyscy twoi gracze stoją przy spawnie, w lobby albo na tej samej walce z bossem, to jest jeden region, czyli jeden wątek. Folia robi wtedy to samo co Paper, z zarządzaniem regionami jako dodatkowym kosztem na wierzchu, i możesz wyjść na tym wolniej niż na starcie. Z grubsza:

  • Pasuje dobrze: duże serwery survival lub anarchy z ogromną mapą, gdzie gracze budują we własnym kącie i rzadko na siebie wpadają.
  • Pasuje słabo: minigry, KitPvP, lobby, SMP skupione wokół spawnu, serwery eventowe i wszystko, gdzie gracze wręcz ciągną do siebie.
  • Pasuje słabo: pojedyncze ciężkie źródło lagów, na przykład gigantyczna farma mobów. Siedzi ono w jednym regionie, czyli na jednym wątku, dokładnie tak jak na Paperze.

Paper, Purpur, Pufferfish czy Folia: co wybrać?

OprogramowaniePodstawaPluginyDo czego
PaperFork SpigotaPełna zgodność z Bukkitem i SpigotemDomyślny wybór dla praktycznie każdego serwera
PurpurFork PaperaPełna zgodność z PaperemDodatkowe opcje konfiguracji i opcjonalne funkcje, takie jak dosiadane moby i regulowane AI mobów
PufferfishFork PaperaPełna zgodność z PaperemCelem plasuje się pomiędzy Paperem a Purpurem
FoliaFork Papera, wielowątkowość oparta na regionachPsuje większość istniejących pluginówEksperymentalne, dla bardzo dużej liczby graczy, którzy siedzą rozproszeni

Trzy górne pozycje są wymienne: dziś zamieniasz Paper na Purpur, jutro wracasz z powrotem, i nie ruszasz nawet folderu z pluginami. Folia stoi osobno.

Co lepiej zrobić najpierw?

W zdecydowanej większości przypadków przyczyna lagów leży zupełnie gdzie indziej. Przejdź całą tę listę, zanim sięgniesz po eksperymentalne oprogramowanie.

  1. Zmierz to narzędziem spark. Odpal profil w godzinach szczytu i zobacz, na co schodzi tick. Zwykle winny jest plugin, nagromadzenie entities albo problem z chunkami, a nie brak wątków.
  2. Ustaw view-distance i simulation-distance realistycznie. Ten zasięg widzenia i symulacji ustawiasz w server.properties, a to najtańszy zysk, jaki istnieje, zwłaszcza gdy online jest dużo graczy naraz.
  3. Posprzątaj entities i przedmioty. ClearLagg albo limity w konfiguracji Papera dają często więcej niż upgrade sprzętu.
  4. Przytnij listę pluginów. Każdy plugin, który robi coś w każdym ticku, zjada budżet ticka, nawet jeśli nikt z niego nie korzysta.
  5. Rozbij serwer za proxy. Lobby, survival i minigry jako osobne procesy, każdy z własnym głównym wątkiem na własnym rdzeniu, a przed nimi BungeeCord albo Velocity.

Ten ostatni krok w praktyce robi to, co Folia dopiero obiecuje, i to z pluginami, które normalnie działają; jak taki układ wygląda, tłumaczymy w naszym wyjaśnieniu hostingu serwerów Minecraft. U nas proxy BungeeCord z 512 MB startuje od 2,16 zł miesięcznie, a za serwery pod nim płacisz według GB RAM-u: na linii budżetowej 4,75 zł za GB, przy większych pakietach nieco mniej, jak w hostingu Minecraft w MC-Node.

Kiedy Folia naprawdę ma sens?

Istnieje wyraźny profil, pod który Folia została zbudowana. Robi się ciekawie w momencie, gdy zgadzają się wszystkie te punkty.

  • Zbliżasz się do setek jednoczesnych graczy na jednym świecie, a podział na osobne serwery nie pasuje do koncepcji.
  • Ci gracze z natury rozpraszają się po dużej mapie, zamiast tłoczyć się wokół spawnu albo areny.
  • Twoja lista pluginów jest krótka albo napisana własnoręcznie, więc możesz dostosować kod do schedulerów Folii.
  • W zespole masz kogoś, kto pisze w Javie, bo trafisz na problemy, których nikt przed tobą nie rozwiązał.
  • Akceptujesz zmiany łamiące zgodność, mało dokumentacji i czasem czekanie na nową wersję Minecrafta.

Jeśli robisz ten krok, zrób go obok istniejącego serwera, a nie na nim: skopiuj świat na serwer testowy i trzymaj kopie zapasowe pod ręką. Jeśli TPS przy tych samych graczach nie jest lepszy niż na Paperze, to siedzieli po prostu zbyt blisko siebie i kupiłeś głównie złożoność. Dla większości serwerów odpowiedzią pozostaje Paper, z szybkim rdzeniem i uporządkowaną konfiguracją.

Najczęściej zadawane pytania

Czy EssentialsX, WorldGuard i CoreProtect działają na Folii? Tylko wtedy, gdy istnieje build z jawnym wsparciem dla Folii. API Bukkita zakłada jeden główny wątek, więc taki plugin musi zostać przepisany, a nie przekompilowany. Zakładaj, że nie działa: plugin, który po cichu pracuje dalej, potrafi uszkodzić dane.

Czy mój serwer z trzydziestoma graczami przyspieszy dzięki Folii? Nie. Przy trzydziestu graczach jesteś daleko poniżej skali, pod którą Folia powstała, a lag prawie zawsze siedzi w pluginie, w entities albo w twoim view-distance. Zmierz to narzędziem spark i zostań na Paperze lub Purpurze.

Ile rdzeni potrzeba do Folii? Dodatkowe rdzenie przy Folii się liczą, ale tylko do liczby regionów aktywnych w tym samym czasie. Jeśli wszyscy gracze siedzą razem, region jest jeden i Folia faktycznie używa jednego rdzenia, dokładnie tak jak Paper. Dużo rdzeni, jak w AMD EPYC 7443P, pomaga dopiero przy rozproszonej aktywności.

Czym różni się Purpur od Folii? Purpur to fork Papera z dodatkowymi opcjami konfiguracji i opcjonalnymi funkcjami, takimi jak dosiadane moby i regulowane AI mobów, który pozostaje w pełni zgodny z pluginami. Folia jest eksperymentalna, tickuje świat regionami na wielu wątkach i przy okazji psuje większość pluginów.

Czy Folia pomoże na lagi z dużej farmy mobów albo maszyny redstone? Nie, bo taka budowla stoi w jednym miejscu, a więc mieści się w jednym regionie, który tickuje na jednym wątku. Tu więcej da wyższe taktowanie, jak w AMD Ryzen 9 9950X, oraz przerobienie samej farmy.

Warto przeczytać

// WYPRÓBUJ SAM
Twój serwer online w 60 sekund
MC-Node →