Belirtiler: Sunucu normalde akıcı çalışıyor ama arada 2-5 saniyelik donmalar yaşanıyor, sonra devam ediyor. Oyuncular anlık "teleport" yaşıyor, mobiler sıçrıyor. Bu ani donmalar (lag spike) genellikle GC pause, chunk save veya backup kaynaklıdır.

Olası Nedenler

  • Stop-the-world GC pause - heap boyutu uygunsuz ya da GC flag'leri eksik
  • Chunk save spike - otomatik save sırasında tüm modifiye chunk'lar aynı anda diske yazılıyor
  • Backup aktif - tar/zip çalışırken disk IO doluyor, main thread yazmaya bekliyor
  • RAM swap - fiziksel RAM yetmediği için kernel disk'e swap yapıyor
  • Async olmayan plugin işlemi - main thread'de DB sorgusu veya HTTP isteği bloklama yapıyor
  • Entity / tile entity tick spike - çok fazla hopper veya beacon aynı tick'te işleniyor

Adım Adım Çözüm

1. Adım

Spark profiler ile spike anını yakalayın - sadece ağır tick'leri filtreleyin

bash
/spark profiler --only-ticks-over 50 --timeout 180

2. Adım

GC loglarını açın - pause sürelerini net görün

bash
# start script'e ekleyin:
-Xlog:gc*:file=logs/gc.log:time,uptime:filecount=5,filesize=10M

3. Adım

Heap'i Xms = Xmx olacak şekilde sabit tutun. Ayrıca MaxGCPauseMillis=200 hedef verin

bash
-Xms8G -Xmx8G -XX:+UseG1GC -XX:MaxGCPauseMillis=200

4. Adım

Aikar's Flags'i tam uygulayın. Yarım uygulama spike'ları bitirmez. Tüm setini kullanın

bash
# Aikar flags için referans:
# https://docs.papermc.io/paper/aikars-flags

5. Adım

Chunk save'i aralıklı hale getirin - tüm dünyayı aynı anda kaydetmeyin

bash
# config/paper-global.yml
chunk-saving:
  max-chunks-to-save-per-tick: 4

6. Adım

Backup scriptinizi düşük trafik saatine (03:00 gibi) alın. Canlı oyuncu varken tar çalıştırmak büyük spike yapar

bash
crontab -l | grep backup
# yeni saat örneği:
# 0 3 * * * /opt/scripts/mc-backup.sh

7. Adım

RAM swap kullanımını kontrol edin - swap > 0 ise sorun

bash
free -m
vmstat 1 5  # si/so kolonları 0 olmalı

8. Adım

Hopper zincirleri ve beacon gruplarını azaltın. Gerekirse LagAssist / FarmLimiter kurun

bash
# Spark profiler rapor > Entity tick bölümünde sorunlu chunk'ları bulun

9. Adım

Async olmayan plugin işlemlerini izleyin - Spark timings raporunda görünür. Plugini güncelleyin ya ConnectionPool eklenmesini talep edin

10. Adım

Sorun sürerse KEYDAL Spark Analyzer aracına profile raporunu yükleyin; ücretsiz otomatik analiz alırsınız: /oyun/araclar/spark