Discord
RYJON - nowy polski serwer KitPvP na Minecraft 1.21.4, graj na ryjon.pl
Wiki - Serwery

Diagnostyka lagu serwera Minecraft

Diagnostyka lagu serwera Minecraft

Jak zidentyfikować przyczyny lagów i spadków wydajności na serwerze Minecraft - od podstaw TPS i MSPT, przez profilowanie Sparkiem, po naprawę najczęstszych problemow.

Czas czytania: ~13 min Poziom: Średniozaawansowany

Rodzaje lagu

Zanim zaczniemy diagnostykę, ważne jest rozróżnienie typów lagu. Każdy typ ma inne przyczyny i inne rozwiązania.

Typ lagu Objawy Przyczyna Diagnostyka
Lag serwerowy (TPS) Moby poruszają się wolno, bloki kopie się z opóźnieniem, rośliny rosną wolno Serwer nie nadąża z przetwarzaniem ticków Spark profiler, /tps
Lag sieciowy (ping) Teleportacje, rubber-banding, opozniony chat Wolne połączenie między graczem a serwerem Ping gracza, traceroute
Lag klienta (FPS) Niski FPS, szarpanie obrazu, zacinanie Slaby komputer gracza lub źle ustawienia F3 (debug screen), OptiFine/Sodium
Spiki (lag spikes) Okresowe zamrażanie na 1-3 sekundy Garbage Collection, autosave, generowanie chunkow Spark tickmonitor, logi GC

Ten poradnik skupia się na lagu serwerowym - to jedyny typ, który administrator serwera może zdiagnozować i naprawić. Lag sieciowy i klienta zależy od gracza. Więcej o optymalizacji serwera znajdziesz w osobnym poradniku.

TPS i MSPT - metryki wydajności

Dwie kluczowe metryki wydajności serwera Minecraft:

TPS (Ticks Per Second)

TPS to liczba tickow przetwarzanych przez serwer na sekunde. Idealny TPS wynosi 20.0 - co oznacza, ze serwer przetwarza 20 cykli logiki gry na sekundę (jeden tick co 50 milisekund).

TPS Stan Efekt dla graczy
20.0 Idealny Plynna rozgrywka, brak zauwazalnych opóźnień
18-19 Dobry Minimalne opóźnienia, większość graczy nie zauważy
15-17 Średni Zauważalne lagi - moby reagują wolniej, redstone opozniony
10-14 Zły Powazen lagi - gra jest niekomfortowa
Poniżej 10 Krytyczny Gra praktycznie niegrywalna

MSPT (Milliseconds Per Tick)

MSPT to czas (w milisekundach) potrzebny na przetworzenie jednego ticku. To dokladniejsza metryka niż TPS:

  • MSPT < 50 ms - TPS = 20.0, serwer ma zapas czasu
  • MSPT = 50 ms - TPS = 20.0, ale na granicy - brak marginesu
  • MSPT > 50 ms - TPS spada poniżej 20, serwer nie nadąża

MSPT jest ważniejszy niż TPS. Serwer może mieć TPS 20.0 z MSPT 48 ms - pozornie wszystko OK, ale jeden dodatkowy gracz lub ciezzki plugin może przepelnic bufor i spowodować spadek TPS. Monitoruj MSPT, nie tylko TPS.

Jak sprawdzić TPS i MSPT

/tps                    # podstawowy TPS (Spigot/Paper)
/spark tps              # dokładny TPS + MSPT + CPU (Spark)
/spark tickmonitor      # alerty gdy tick trwa dłużej niż 50ms

Spark Profiler

Spark to najważniejsze narzędzie do diagnostyki wydajności serwera Minecraft. Jest wbudowany w nowsze wersje Paper lub dostępny jako plugin. Stworzony przez autora LuckPerms, Spark oferuje:

  • Profilowanie CPU - które funkcje/pluginy zużywają najwięcej czasu procesora
  • Monitoring TPS/MSPT - dokładne pomiary w czasie rzeczywistym
  • Analiza pamięci - zrzuty pamięci (heap dump) do znajdowania wycieków
  • Tick monitor - powiadomienia o długich tickach
  • Interaktywne raporty - wizualizacja w przeglądarce z drzewkiem wywołań

Instalacja Spark

Na Paper 1.21+ Spark jest już wbudowany. Na starszych wersjach lub Spigot:

# Pobierz z https://spark.lucko.me/download
# Umieść w plugins/
# Zrestartuj serwer

Profilowanie CPU - krok po kroku

  1. Uruchom profiler: /spark profiler start
  2. Graj normalnie przez 5-10 minut (odtwórz typowe obciążenie serwera)
  3. Zatrzymaj profiler: /spark profiler stop
  4. Otwórz raport - Spark wygeneruje link do interaktywnego raportu w przeglądarce
  5. Analizuj wyniki - szukaj najgrubszych gałęzi w drzewku wywołań

Komendy Spark

Komenda Opis
/spark profiler start Rozpocznij profilowanie CPU
/spark profiler stop Zatrzymaj i wygeneruj raport
/spark tps Aktualny TPS, MSPT i CPU
/spark tickmonitor Alerty o długich tickach (ponad 50ms)
/spark health Ogólny raport zdrowia serwera
/spark heapdump Zrzut pamięci do analizy wycieków
/spark gc Statystyki Garbage Collectora
/spark profiler start - only-ticks-over 50 Profiluj tylko ticki trwające dłużej niż 50ms

Czytanie raportów Spark

Raport Spark wyświetla drzewko wywołań (call tree) - hierarchie funkcji z procentem czasu CPU, jaki każda z nich zuzyla. Oto jak go czytać:

Co szukać w drzewku

  1. Najgrubsze galezei - funkcje zuzywajace najwięcej % czasu to główni winowajcy
  2. Nazwy pluginów - szukaj nazw swoich pluginów w drzewku. Jeśli plugin zajmuje 40% czasu ticku - to problem
  3. Entity ticking - jeśli entityTick lub tickEntities dominuje, masz za dużo mobów
  4. Chunk loading/generation - jeśli chunkLoad lub chunkGenerate dominuje, potrzebujesz pre-generowania
  5. Scheduler - jeśli BukkitScheduler jest wysoko, ktorysi plugin uruchamia cieżki kod co tick

Typowe wyniki i ich interpretacja

Wpis w drzewku Interpretacja Rozwiazanie
ServerLevel.tick > entityTick (40%+) Za dużo entity (mobów, dropped itemow) Zmniejsz limity mobów, ogranicz farmy
Plugin XYZ > onTick (20%+) Plugin XYZ jest źle zoptymalizowany Zaktualizuj, wymień lub skonfiguruj plugin
ChunkProviderServer > generateChunk (30%+) Generowanie nowych chunkow obciarza serwer Pre-generuj chunki (Chunky), ustaw world border
MinecraftServer > autosave (spiki) Autosave powoduje spiki lagów Zmniejsz częstotliwość w paper-world-defaults.yml
RedstoneWire > update (15%+) Skomplikowane obwody redstone Ogranicz redstone, włącz optymalizacje redstone w Paper

Spark generuje również raport w formacie umożliwiającym udostępnienie na Discordzie lub forum - jeśli potrzebujesz pomocy, udostępnij link do raportu na społeczności PaperMC Discord.

Paper Timings

Timings to starszy system profilowania wbudowany w Paper. Jest mniej szczegółowy niż Spark, ale nadal przydatny:

/timings on          # włącz zbieranie danych
# Poczekaj 5-10 minut typowej gry
/timings report      # wygeneruj raport (link do strony z wynikami)

Raport Timings wyświetla tabele z czasem spedzonym na poszczególnych operacjach. Szukaj wpisów z wysokim "Total" i "Per Tick" - to główne źródła lagu.

W nowszych wersjach Paper (1.21+) Spark jest rekomendowany zamiast Timings. Timings mogą być nawet wyłaczone domyslnie.

Najczęstsze przyczyny lagow

1. Za dużo entity (mobów, dropped itemow)

Najczęstsza przyczyna spadku TPS. Każdy mob wymaga obliczeń AI, pathfindingu i kolizji. 1000 mobów potrafi zaatakować TPS nawet na mocnym serwerze.

Diagnostyka: /spark profiler - szukaj entityTick w drzewku.

Rozwiazanie: Zmniejsz limity w bukkit.yml, ogranicz farmy mobów, zmniejsz despawn range w paper-world-defaults.yml.

2. Generowanie nowych chunkow

Gdy gracz eksploruje nowe tereny, serwer musi wygenerować chunki od zera - teren, jaskinie, struktury, oświetlenie. To niezwykle obciazajace.

Diagnostyka: Lagi występują gdy gracze eksplorują, nie gdy siedzą w bazie.

Rozwiazanie: Pre-generuj chunki pluginem Chunky i ustaw world border. Więcej w poradniku optymalizacji.

3. Ciężkie pluginy

Źle napisane pluginy mogą wykonywać operacje na głównym wątku serwera (synchroniczne zapytania SQL, obciążające schedulery).

Diagnostyka: Spark profiler pokaże nazwę pluginu w drzewku z wysokim % czasu.

Rozwiazanie: Zaktualizuj, wymień na lżejsza alternatywę lub zoptymalizuj konfiguracje.

4. Redstone lag machines

Skomplikowane obwody redstone (szczególnie zegary i flying machines) mogą znacznie obciążyć serwer.

Diagnostyka: /spark profiler - szukaj RedstoneWire lub pistonBase.

Rozwiazanie: Włącz optymalizacje redstone w Paper, ogranicz obwody pluginem RedstoneLimiter.

5. Autosave i zapisy na dysk

Okresowy zapis świata na dysk może powodować spiki lagow, szczególnie na serwerach z dużymi światami i wolnym dyskiem (HDD).

Diagnostyka: Spiki co kilka minut, widoczne w /spark tickmonitor.

Rozwiazanie: Zmniejsz max-auto-save-chunks-per-tick w Paper, użyj dysku SSD/NVMe.

6. Za mało RAM

Gdy serwer używa więcej pamięci niż przydzielono, Garbage Collector pracuje intensywnie, powodując spiki lagow.

Diagnostyka: /spark gc pokazuje częstotliwość i czas GC. Częste, długie pauzy GC = za mało RAM.

Rozwiazanie: Zwiększ pamięć w parametrach JVM (-Xmx). Więcej poniżej.

Diagnostyka entities

Entity (moby, dropped itemy, stojaki na zbroje, ramki na itemy) to najczęstsza przyczyna lagu serwerowego. Oto jak je zdiagnozowac:

/spark profiler start - only-ticks-over 100
# Poczekaj na kilka lagujacych tickow
/spark profiler stop

Opcja --only-ticks-over 100 profiluje tylko ticki trwające dłużej niż 100 ms - pozwala to uchwycic dokładnie co powoduje spiki.

Przydatne komendy

Komenda Opis
/paper entity list Lista liczby entity per chunk (Paper)
/lagg killmobs Usuniecie mobów (plugin ClearLag)
/lagg clear Usuniecie dropped itemow (plugin ClearLag)
/spark profiler start - thread server Profiluj tylko główny watek serwera

Diagnostyka chunkow

Chunki to drugaie najczęstsza przyczyna lagow. Problemy z chunkami objawiaja się szczególnie gdy gracze eksplorują nowe tereny.

Sprawdzenie załadowanych chunkow

/spark health          # ogólne informacje o chunach
/paper world info      # statystyki per świat (Paper)

Jeśli liczba załadowanych chunkow jest bardzo wysoka (ponad 5000), zmniejsz view-distance i simulation-distance w server.properties.

RAM i Garbage Collection

Java używa Garbage Collectora (GC) do automatycznego zwalniania nieuzywanej pamieci. GC może powodować pauzy - krótkie okresy, gdy serwer zamraża się na czas czyszczenia pamieci.

Diagnostyka GC

/spark gc              # statystyki GC
/spark health          # zużycie pamięci

Jeśli GC wykonuje się częściej niż co minute lub pauzy trwają dłużej niż 100 ms - masz problem z pamiecia.

Optymalne flagi JVM

Użyj flag Aikar - zoptymalizowanych specjalnie dla serwerów Minecraft:

java -Xms4G -Xmx4G   -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

Kluczowe: -Xms i -Xmx powinny być takie same - zapobiega to dynamicznej zmianie rozmiaru sterty, co poprawia stabilność GC. Nie przydzielaj więcej niż 10-12 GB - zbyt dużo RAM prowadzi do długich pauz GC.

Ile RAM na ilu graczy?

Gracze Rekomendowany RAM Uwagi
1-10 2-4 GB Wystarczający do prostego serwera survival
10-30 4-6 GB Typowy serwer średniej wielkości
30-50 6-8 GB Duży serwer z wieloma pluginami
50-100 8-12 GB Profesjonalny serwer, rozważ optymalizacje
100+ 12+ GB Rozważ podział na wiele serwerów (Velocity)

Pamiętaj, ze RAM to nie jedyny czynnik. Procesor jednowątkowy (Minecraft głównie używa jednego rdzenia) i dysk SSD sa równie ważne.

Podsumowanie

Diagnostyka lagow to umiejętność, która każdy administrator serwera powinien opanowac. Spark profiler to Twoje główne narzędzie - naucz się czytać raporty i identyfikować problemy. Pamietaj: najpierw diagnozuj, potem naprawiaj. Ślepe zmiany w konfiguracji bez zrozumienia przyczyny problemu często pogarsza sytuacje.

Powiązane poradniki: