Optymalizacja serwera Minecraft: paper.yml, spigot.yml i bukkit.yml od podstaw
Większość poradników o optymalizacji serwera Minecraft każe wkleić pięćdziesiąt linijek do paper.yml. Problem w tym, że ten plik nie istnieje od wersji 1.19, bo Paper rozbił go na dwa osobne pliki w katalogu config. Poniżej rozkładamy, które parametry w server.properties, spigot.yml, bukkit.yml i plikach Paper faktycznie zmieniają wydajność, ile dokładnie wpisać i jakim kosztem, bo każda z tych zmian coś zabiera w zamian.
Krótka odpowiedź: sześć zmian, które dają najwięcej
Jeśli masz zmienić tylko kilka rzeczy, zmień te. Odpowiadają za zdecydowaną większość realnego zysku na typowym serwerze z pluginami, a ich skutki uboczne są przewidywalne.
| Parametr | Plik | Domyślnie | Zalecane | Co zyskujesz |
|---|---|---|---|---|
view-distance | server.properties | 10 | 6 do 8 | Największy pojedynczy zysk. Mniej chunków do wysłania i utrzymania w pamięci. |
simulation-distance | server.properties | 10 | 4 do 6 | Mniej tykających mobów i mechanizmów. Zwykle mocniej odciąża CPU niż view-distance. |
max-entity-collisions | paper-world-defaults.yml | 8 | 2 | Ratunek dla serwerów z farmami i zbitymi stadami mobów. |
redstone-implementation | paper-world-defaults.yml | VANILLA | ALTERNATE_CURRENT | Dużo szybsza redstone bez zmiany zachowania w większości układów. |
mob-spawn-range | spigot.yml | 8 | 4 do 6 | Moby spawnują się bliżej gracza, więc mniej z nich despawnuje bez sensu. |
hopper.disable-move-event | paper-world-defaults.yml | false | true | Zdejmuje z CPU ogromną liczbę zdarzeń lejów. Tylko gdy żaden plugin ich nie nasłuchuje. |
Jedna zmiana na raz
Zanim cokolwiek zmienisz, zmierz, co faktycznie boli
Optymalizacja bez pomiaru to zgadywanie. Serwer może się dławić od jednego źle napisanego pluginu, a Ty przez tydzień będziesz obniżać zasięg widzenia i zastanawiać się, dlaczego nic nie pomaga. Trzy narzędzia mówią niemal wszystko.
- 1
/tps, czyli czy serwer w ogóle nadąża20 TPS to stan zdrowy i jednocześnie maksimum, wyżej nie będzie. Spadek do 18 jest już odczuwalny, a poniżej 15 gra zaczyna się zacinać przy każdym uderzeniu i otwarciu skrzynki. Paper pokazuje trzy liczby: średnią z minuty, pięciu i piętnastu minut. - 2
/mspt, czyli ile milisekund zajmuje jeden tikTo ważniejsza liczba niż TPS. Serwer ma na tik 50 ms. Jeśli mieścisz się w 30 ms, masz zapas. Przy 45 ms TPS jeszcze pokazuje 20, ale jesteś pół kroku od spadku, i właśnie z tego powodu serwer zaczyna lagować dopiero wtedy, gdy dojdzie dwóch graczy. - 3
spark, czyli co konkretnie zjada te milisekundy
Paper wycofał stary mechanizm Timings na rzecz sparka i to on jest dziś właściwym narzędziem. Odpal/spark profiler startw godzinach szczytu, daj mu kilka minut, zatrzymaj i otwórz raport. Dostajesz drzewo wywołań z nazwami pluginów i procentem czasu. Bez tego naprawiasz po omacku.
Najczęstszy wynik takiego pomiaru
Gdzie naprawdę leżą te pliki (i dlaczego paper.yml zniknął)
Od Minecrafta 1.19 Paper nie używa już jednego pliku paper.yml, bo jego zawartość została rozdzielona na config/paper-global.yml z ustawieniami całego serwera i config/paper-world-defaults.yml z ustawieniami świata. Migracja jest automatyczna przy pierwszym starcie, ale każdy poradnik pisany przed tą zmianą wysyła Cię w nieistniejące miejsce.
| Plik | Za co odpowiada | Czy nadal aktualny |
|---|---|---|
server.properties | Ustawienia samej gry od Mojanga: zasięgi, limity, sieć. | Tak, i to tu leżą dwa najważniejsze parametry. |
bukkit.yml | Limity spawnu mobów i częstotliwość prób spawnowania. | Tak, zmieniany rzadko, ale bywa potrzebny. |
spigot.yml | Zasięgi śledzenia encji, scalanie itemów, leje, despawn pocisków. | Tak. |
paper.yml | Dawny jedyny plik konfiguracyjny Paper. | Nie. Nie istnieje od 1.19, nie szukaj go. |
config/paper-global.yml | Rzeczy globalne: redstone, wątki IO, autosave graczy, limity pakietów. | Tak, to jedna z dwóch części po rozbiciu paper.yml. |
config/paper-world-defaults.yml | Kolizje, despawn mobów, tick-rates, optymalizacja eksplozji, leje. | Tak, druga część i najbogatsza w realne optymalizacje. |
Ustawienia per świat
paper-world-defaults.yml to wartości domyślne dla wszystkich światów. Jeśli chcesz inne ustawienia tylko dla świata world_nether, tworzysz paper-world.yml w katalogu tego świata i nadpisujesz w nim wybrane klucze. To samo w spigot.yml robi sekcja world-settings z nazwą świata obok default.server.properties: dwa parametry ważniejsze niż cała reszta razem
Jeśli masz zmienić dokładnie jedną rzecz w całym serwerze, zmniejsz simulation-distance. To on decyduje, jak daleko od gracza serwer liczy moby, wzrost roślin, redstone i mechanizmy, czyli bezpośrednio ile pracy wykonuje procesor w każdym tiku.
view-distance=7
simulation-distance=5
entity-broadcast-range-percentage=75
network-compression-threshold=256
sync-chunk-writes=false
max-tick-time=60000view-distanceto promień w chunkach, jaki serwer wysyła klientowi. Zejście z 10 na 7 to spadek liczby chunków na gracza o niemal połowę. Gracze zauważają to głównie w widokach na duże odległości, więc na serwerze survivalowym 7 jest praktycznie niewyczuwalne, a na serwerze z mapą pod budowanie panoram już tak.simulation-distanceto promień, w którym cokolwiek się dzieje. Wartość 5 oznacza, że farma oddalona o sześć chunków od gracza staje. Dla większości serwerów to zaleta, ale dla serwera technicznego z farmami na AFK jest to poważna zmiana mechaniki, którą trzeba ogłosić.entity-broadcast-range-percentageskaluje dystans, z którego klient dostaje informacje o encjach. 75 procent zmniejsza ruch sieciowy i pracę po stronie klienta, co pomaga zwłaszcza na serwerach z tłumem na spawnie.sync-chunk-writes=falsepozwala zapisywać chunki asynchronicznie i zdejmuje zauważalne zacięcia przy autosave. Ryzyko utraty paru sekund świata przy twardym ubiciu procesu jest realne, ale akceptowalne przy poprawnych kopiach zapasowych.network-compression-thresholdzostaw na 256, chyba że serwer stoi za proxy na tej samej maszynie. Wtedy-1wyłącza kompresję i oszczędza CPU, bo ruch nie opuszcza localhosta. Przy połączeniach przez internet wyłączenie kompresji znacząco zwiększy transfer.
max-tick-time=-1 to nie optymalizacja
-1 wyłącza watchdoga, czyli mechanizm, który ubija zawieszony serwer. Nie przyspiesza niczego, a sprawia tylko tyle, że zamiast czystego crasha z pełnym stack trace dostajesz serwer wiszący godzinami bez śladu, co go zablokowało. Zostaw domyślne 60000.spigot.yml: zasięgi encji, scalanie itemów i leje
W spigot.yml najwięcej daje skrócenie zasięgów śledzenia encji i agresywniejsze scalanie wyrzuconych itemów, bo oba zmniejszają liczbę obiektów, o których serwer musi pamiętać i które musi rozsyłać do klientów. Wszystko poniżej wpisujesz w sekcji world-settings: default:.
entity-tracking-range:
players: 48
animals: 32
monsters: 32
misc: 24
other: 48
display: 128
merge-radius:
item: 3.5
exp: 6.0
mob-spawn-range: 5
item-despawn-rate: 4000
arrow-despawn-rate: 600
hopper-transfer: 8
hopper-check: 8
hopper-amount: 3
nerf-spawner-mobs: true
save-user-cache-on-stop-only: true| Zmiana | Zysk | Koszt dla gracza |
|---|---|---|
entity-tracking-range | Domyślnie to 128 dla graczy i 96 dla mobów, więc zejście do 48 i 32 wycina naprawdę dużo pakietów i encji na gracza. | Zwierzęta i moby pojawiają się na ekranie nieco później, z bliższej odległości. |
merge-radius | Domyślnie 0.5 dla itemów i wyłączone dla expa, więc 3.5 i 6.0 scala stosy, które inaczej leżą setkami. | Przy wysokich wartościach itemy skaczą do siebie po wykopaniu, co część graczy zauważa. |
mob-spawn-range | Moby spawnują się w zasięgu gracza, więc nie giną od razu po spawnie. | Mniejsza różnorodność spawnu w oddali, co odczują serwery z farmami mobów. |
item-despawn-rate | Porzucone przedmioty znikają szybciej, mniej encji na stałe. | 4000 tików to około 3 minuty zamiast 5. Gracz, który zginął i nie zdążył wrócić, traci ekwipunek. |
nerf-spawner-mobs | Moby ze spawnerów nie mają AI, więc nie liczą ścieżek. | Farmy oparte na spawnerach i przepychaniu mobów wodą przestają działać. |
hopper-check | Leje sprawdzają otoczenie rzadziej, co mocno odciąża duże sortownie. | Transport itemów jest wyraźnie wolniejszy. Z hopper-amount: 3 bilansuje się to prawie do zera. |
max-tick-time: strata czasu na Paper
max-tick-time z kluczami tile i entity bywa w starych poradnikach polecana jako sposób na lagi. Na Paper nie zrobi nic, bo silnik wyłącza te opcje własnymi patchami i nadal są w pliku tylko ze względu na zgodność. Na czystym Spigocie działają, ale każą serwerowi porzucać w połowie tykanie mechanizmów i encji, więc TPS wygląda lepiej wyłącznie dlatego, że serwer przestaje wykonywać pracę. W obu przypadkach zostaw je w spokoju.bukkit.yml: limity spawnu, czyli ile mobów może żyć naraz
bukkit.yml zmienia się rzadko, ale gdy na serwerze żyje kilkaset mobów na gracza, obniżenie spawn-limits daje więcej niż dowolna inna zmiana. Limity są liczone per gracz, więc na serwerze z trzydziestoma osobami mnożą się bardzo szybko.
spawn-limits:
monsters: 50
animals: 8
water-animals: 3
water-ambient: 10
ambient: 1
ticks-per:
monster-spawns: 2
animal-spawns: 400
water-spawns: 400
ambient-spawns: 400
autosave: 6000
chunk-gc:
period-in-ticks: 400monsters: 50zamiast domyślnych 70 to mniej potworów do tykania i mniej kolizji. Na serwerze survivalowym gracze tego nie zauważą, bo limit i tak rzadko jest osiągany z dala od jaskiń.ambient: 1to nietoperze. Nie wnoszą nic poza dźwiękiem i pracą dla serwera.monster-spawns: 2oznacza próbę spawnu co dwa tiki zamiast co tik. To połowa pracy spawnera przy niemal niezmienionej liczbie mobów, bo limit populacji i tak jest wąskim gardłem.autosave: 6000przenosi zapis świata na raz na pięć minut. Rzadszy zapis to rzadsze zacięcia, ale też więcej do stracenia przy awarii, więc ma sens tylko razem z działającymi kopiami zapasowymi.
paper-world-defaults.yml: tu leży najwięcej realnych zysków
Ten plik zawiera optymalizacje, których Spigot nie ma w ogóle, i z tego powodu samo przejście z Spigota na Paper jest największą optymalizacją, jaką możesz zrobić. Poniżej ustawienia, które dają wymierny efekt bez psucia mechaniki.
chunks:
max-auto-save-chunks-per-tick: 8
delay-chunk-unloads-by: 10s
prevent-moving-into-unloaded-chunks: true
collisions:
max-entity-collisions: 2
entities:
armor-stands:
tick: false
behavior:
disable-chest-cat-detection: true
experience-merge-max-value: 16
spawning:
despawn-ranges:
monster:
soft:
horizontal: 28
vertical: 28
hard:
horizontal: 96
vertical: 96
per-player-mob-spawns: true
alt-item-despawn-rate:
enabled: true
environment:
optimize-explosions: true
treasure-maps:
find-already-discovered:
loot-tables: true
hopper:
disable-move-event: true
ignore-occluding-blocks: true
misc:
redstone-implementation: ALTERNATE_CURRENT
tick-rates:
mob-spawner: 2
sensor:
villager:
secondarypoisensor: 80
behavior:
villager:
validatenearbypoi: 120despawn-ranges ma cztery poziomy, nie dwa
soft: 32 i hard: 128 jako zwykłe liczby. Paper oczekuje dziś pod soft i hard osobnych kluczy horizontal i vertical, a domyślną wartością każdego z nich jest słowo default, nie liczba. Wpisanie tam samej liczby zostanie zignorowane.| Ustawienie | Co robi | Na co uważać |
|---|---|---|
max-entity-collisions: 2 | Ogranicza, ile kolizji encja przelicza na tik. Przy zbitych stadach mobów lub farmie to różnica rzędu wielkości. | Moby wchodzą w siebie, a farmy wypychające moby ciasnotą mogą przestać działać. |
hopper.disable-move-event | Przestaje wywoływać zdarzenie dla każdego przesunięcia itemu w leju. Na serwerze z sortownią to ogromna oszczędność. | Pluginy pilnujące przepływu itemów (ochrona skrzyń, logi, custom crafting) przestaną widzieć te zdarzenia. Sprawdź przed włączeniem. |
despawn-ranges | Moby dalej niż 96 bloków od gracza znikają natychmiast, bliżej niż 28 nie znikają nigdy. | Farmy liczące na moby gromadzące się daleko od gracza stracą wydajność. |
optimize-explosions | Tańszy algorytm obliczania obrażeń od wybuchu. | Minimalne różnice w obrażeniach na skraju wybuchu. Dla serwera PvP z creeperami warto przetestować. |
armor-stands.tick: false | Stojaki na zbroję przestają być tykane. Serwery z dekoracjami i hologramami mają ich tysiące. | Stojaki przestają reagować na grawitację i wodę. Jeśli używasz ich jako elementu mechaniki, zostaw włączone. |
alt-item-despawn-rate | Pozwala ustawić krótszy czas znikania dla śmieci w rodzaju cobblestone i dirt, nie ruszając wartościowych itemów. | Wymaga uzupełnienia listy itemów w pliku. Samo włączenie bez listy niczego nie zmienia. |
tick-rates (wieśniacy) | Wieśniacy przeliczają swoje punkty zainteresowania rzadziej. Przy dużej wiosce to jeden z najcięższych elementów tiku. | Wieśniacy wolniej odnajdują łóżka i stanowiska pracy po zmianach w wiosce. |
Redstone: jedna zmiana, która bywa warta więcej niż reszta pliku
Klucz misc.redstone-implementation siedzi w paper-world-defaults.yml, a nie w pliku globalnym, i to pomyłka, którą powtarza połowa poradników. Domyślnie stoi na VANILLA, a do wyboru są jeszcze EIGENCRAFT i ALTERNATE_CURRENT. Ten ostatni to przepisany od zera algorytm, który aktualizuje tylko to, co faktycznie się zmieniło, więc w układach z dużą ilością pyłu bywa wielokrotnie szybszy od waniliowego.
Kiedy nie włączać ALTERNATE_CURRENT
VANILLA. Jeśli po zmianie ktoś zgłosi zepsuty mechanizm, to pierwsze miejsce, w które trzeba zajrzeć.paper-global.yml: kilka drobiazgów na koniec
Plik globalny ma niewiele do zaoferowania pod kątem wydajności, bo większość przełączników siedzi w konfiguracji świata. Te trzy warto jednak znać.
misc:
region-file-cache-size: 256
player-auto-save:
rate: -1
max-per-tick: -1
chunk-system:
io-threads: -1Wartość -1 w player-auto-save oznacza, że serwer bierze częstotliwość z ticks-per.autosave w bukkit.yml i sam dobiera rozsądny limit zapisów na tik, więc jeśli ustawiłeś tam 6000, nie musisz ruszać już niczego więcej. io-threads poniżej zera oznacza jeden wątek na operacje dyskowe, co dla małego i średniego serwera jest w zupełności wystarczające.
Flagi JVM: to nie konfiguracja serwera, ale liczy się równie mocno
Najlepiej przetestowany zestaw flag dla serwerów Minecraft to tak zwane flagi Aikara, czyli konfiguracja garbage collectora G1, która zamienia rzadkie długie przestoje na częste i krótkie. Efektu nie zobaczysz w średnim TPS, tylko w zniknięciu regularnych sekundowych zacięć.
java -Xms8G -Xmx8G \
-XX:+UseG1GC -XX:+ParallelRefProcEnabled \
-XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions \
-XX:+DisableExplicitGC -XX:+AlwaysPreTouch \
-XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 \
-XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 \
-XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 \
-XX:InitiatingHeapOccupancyPercent=15 \
-XX:G1MixedGCLiveThresholdPercent=90 \
-XX:G1RSetUpdatingPauseTimePercent=5 \
-XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem \
-XX:MaxTenuringThreshold=1 \
-jar paper.jar nogui-Xmsrówne-Xmxto celowa decyzja, nie oszczędność pamięci. Sterta, która nie rośnie, nie wymusza kosztownych zmian rozmiaru w trakcie gry.- Powyżej 12 GB pamięci zestaw się zmienia:
G1NewSizePercent=40,G1MaxNewSizePercent=50,G1HeapRegionSize=16M,G1ReservePercent=15iInitiatingHeapOccupancyPercent=20. - Nie przydzielaj serwerowi całej dostępnej pamięci. JVM potrzebuje miejsca poza stertą na metaspace, wątki i bufory sieciowe, więc zostaw około 1 do 2 GB zapasu. Inaczej proces zostanie ubity przez system zanim zobaczysz błąd z Javy.
- Nie doklejaj flag z kilku poradników do siebie. Zestawy bywają sprzeczne, a
-XX:+UseZGCobok-XX:+UseG1GCto najszybszy sposób, by serwer nie wstał.
W panelu hostingowym zwykle nie musisz tego robić
-Xmx najczęściej nie da się nawet przekroczyć powyżej wykupionego pakietu. Ta sekcja przydaje się głównie przy własnym VPS albo gdy panel pozwala podać własną linię startu.Gotowe zestawy dla trzech typów serwera
Różne serwery mają różne wąskie gardła, więc jeden uniwersalny zestaw nie istnieje. Poniżej punkty wyjścia, od których warto zacząć i które potem dociąga się pomiarami.
| Parametr | Survival ze znajomymi (do 10) | Publiczny z pluginami (20 do 60) | Modpack (do 15) |
|---|---|---|---|
view-distance | 8 | 6 | 6 |
simulation-distance | 6 | 4 | 4 |
spawn-limits: monsters | 70 | 40 | 30 |
max-entity-collisions | 4 | 2 | 2 |
mob-spawn-range | 6 | 4 | 4 |
nerf-spawner-mobs | false | true | true |
hopper.disable-move-event | true | zależnie od pluginów | false, bo mody często tego potrzebują |
redstone-implementation | ALTERNATE_CURRENT | ALTERNATE_CURRENT | VANILLA |
Modpacki to inna liga
Pięć rzeczy, które wyglądają jak optymalizacja, a nią nie są
- Dosypanie RAM-u do serwera, który nie ma problemu z RAM-em. Lagi z komunikatem
Can't keep upto problem z procesorem i jednym wątkiem. Więcej pamięci nie przyspieszy liczenia tiku, a zbyt duża sterta wydłuża przestoje garbage collectora. - Kopiowanie cudzego configa w całości. Pliki z poradników odnoszą się do starszych wersji i zawierają klucze, których Twój build już nie zna. Paper zignoruje nieznane klucze po cichu, więc będziesz przekonany, że coś ustawiłeś.
- Wyłączanie watchdoga. Maskuje problem zamiast go rozwiązać i zabiera Ci jedyny log, z którego dałoby się coś wyczytać.
- Wyłączanie wszystkiego, co da się wyłączyć. Serwer z wyłączonym AI mobów, zerowym despawnem i obciętym tickiem encji ma świetne TPS i nie nadaje się do gry. Optymalizacja to szukanie najlepszego stosunku zysku do odebranej graczom mechaniki.
- Trzymanie dziesięciu pluginów robiących to samo. Każdy plugin nasłuchuje zdarzeń. Trzy pluginy pilnujące terenu to trzykrotna praca przy każdym postawionym bloku, a to jedno z najczęstszych zdarzeń na serwerze.
Najczęstsze pytania
Czy paper.yml jeszcze istnieje?
Nie. Od Minecrafta 1.19 Paper używa config/paper-global.yml i config/paper-world-defaults.yml. Stary paper.yml jest migrowany automatycznie przy pierwszym uruchomieniu nowszego builda i przestaje być odczytywany.
Co obniżyć pierwsze, view-distance czy simulation-distance?
Najpierw simulation-distance. Odpowiada za faktyczne liczenie mobów i mechanizmów, więc daje większy zysk na procesorze, a gracze zauważają go mniej niż skrócenie zasięgu widzenia. Zasięg widzenia obniżaj dopiero w drugiej kolejności.
Czy te ustawienia działają na Purpurze i Pufferfish?
Tak, bo oba są pochodnymi Paper i dziedziczą całą jego konfigurację. Dodatkowo mają własne pliki, odpowiednio purpur.yml i pufferfish.yml, z kolejnymi opcjami, w tym agresywniejszymi optymalizacjami AI mobów.
Po ilu minutach widać efekt zmiany?
TPS i MSPT reagują od razu po restarcie, ale wiarygodny pomiar wymaga normalnego ruchu, więc najlepiej porównać /mspt w tej samej godzinie szczytu przed i po. Zmiany dotyczące chunków i despawnu mobów widać dopiero po kilkudziesięciu minutach, gdy świat się przewietrzy.
Czy zmniejszenie view-distance obniży ping graczy?
Nie obniży samego pingu, bo ten zależy od odległości do serwera i jakości łącza. Zmniejszy natomiast ilość danych wysyłanych do klienta, co pomaga graczom na słabszym łączu i usuwa zacięcia przy wchodzeniu w nowy teren.
Czy mogę edytować te pliki przy włączonym serwerze?
Możesz je zapisać, ale serwer odczytuje konfigurację przy starcie, więc zmiany zadziałają po restarcie. Dodatkowo serwer nadpisuje część plików przy zatrzymaniu, więc edycja na żywo może zostać po prostu skasowana. Bezpieczniej zatrzymać serwer, zmienić plik i wystartować.
Optymalizacja ma sens tylko na sensownym procesorze
Pakiety na procesorach AMD Ryzen z wysokim taktowaniem, czyli tam, gdzie liczy się pojedynczy wątek tykający Twój świat. Pliki konfiguracyjne edytujesz wprost w panelu albo przez SFTP, a kopię zapasową robisz jednym kliknięciem przed każdą zmianą.


