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