Intermediate7 minUpdated: 2026-09-13

Paper & Purpur Server Optimization: Fixing TPS Drops and Lag

Comprehensive guide to configuring chunk, entity, and mob tick limits to maintain a solid 20 TPS.

Verified against

Minecraft
1.20.x – 1.21.x
Engine
Paper / Purpur
Java
17 / 21
Last checked
2026-09-13

Before you start

  • A running Paper or Purpur server (it must have booted at least once)
  • Access to the panel console or in-game operator permission
  • Write access to the config/ folder in the file manager
On This Page
All Guides
Reading progress

As player counts grow or automated mob farms expand, TPS (Ticks Per Second) can drop below 20, leading to delayed block breaks, rubberbanding, and server lag.

Minecraft Server Worlds and Optimization Architecture
World size, chunk generation, and entity density directly govern TPS stability.
Clodo
clodo.net / panelLIVE

Minecraft Purpur/Paper Cluster

System Normal

Clodo Minecraft Panel Optimization Overview

Purpur engine, Aikar JVM arguments, and NVMe caching are active by default on the Clodo control panel.

Live TPS & MSPT
Panelde görünür
CPU / RAM usage
Anlık grafik
Engine & version
Panelden değiştirilir
Console & file manager
Tarayıcıdan
Clodo Panel Automations1-CLICK READY
Paper / Purpur / Fabric / ForgePanelden seçilir
Aikar G1GC startup flagsHazır gelir
Modrinth plugin installTek tık
server.properties editingDosya yöneticisi
SettingWhich load it reducesTrade-off
view-distanceChunks loaded and sent per playerPlayers see less far
simulation-distanceEntity, redstone and growth tickingDistant farms stall
despawn-rangesMonsters kept in memoryMob farms slow down
mob-spawn-range / limitsSpawned mobs, hence entity tick costFewer natural spawns
network-compression-thresholdCPU spent compressing tiny packetsSlightly more bandwidth
sync-chunk-writesMain thread waiting on diskHigher risk on hard shutdown

Diagnosing bottlenecks with the Spark profiler#

Before tweaking configs randomly, you must diagnose which plugin, entity, or chunk causes lag using Spark.

Minecraft Oyun İçi / Konsol
/spark profiler start --timeout 180
# 3 dakika sonra profil linki otomatik oluşturulur
/spark health --memory
Apply to your service

Install the Spark profiler

Downloads Spark from Modrinth into your plugins (or mods) folder. The version is picked to match your engine and Minecraft version.

  • A compatible Spark build is downloaded from Modrinth
  • After a restart, /spark profiler and /spark health become available

The server must be restarted for this change to take effect.

If you have a Clodo service you can apply these steps without touching a terminal. You always see the diff before anything is written.

Critical optimization parameters#

The settings below in your server's root config files govern most of the CPU cost. Change them one at a time and measure with /spark health; changing everything at once tells you nothing about which one helped.

config/paper-world-defaults.yml
entities:
  spawning:
    despawn-ranges:
      monster:
        soft: 28
        hard: 96
    ticks-per-spawn:
      monster: 8
      animal: 400
chunks:
  auto-save-interval: 6000 # 5 dakika
  max-auto-save-chunks-per-tick: 8
Config File & ParameterDefaultRecommended ValuePerformance Impact
paper-world-defaults.yml > despawn-ranges.monster.hard12896 (or 72)Despawns distant mobs quickly, slashing entity overhead by 35%.
paper-world-defaults.yml > ticks-per-spawn.monster18Attempts mob spawning every 8 ticks rather than every tick.
paper-world-defaults.yml > auto-save-interval600012000 (10 min)Eliminates disk I/O lag spikes caused by overly frequent world flushes.
spigot.yml > entity-tracking-range.players4836Minimizes network packet processing across clients.

server.properties: the quickest win#

Before touching any YAML file, review two values in server.properties. view-distance controls how many chunks the server loads and streams per player; simulation-distance controls how many chunks actually tick. The default 10/10 can double MSPT on its own once you pass roughly 20 players.

server.properties
# Oyuncunun gordugu mesafe (chunk). 10 -> 8 gorsel olarak zor fark edilir.
view-distance=8
# Gercekten tick alan mesafe. Her zaman view-distance'tan kucuk veya esit olmali.
simulation-distance=6
# Bu esigin altindaki paketler sikistirilmaz; kucuk paketlerde CPU tasarrufu.
network-compression-threshold=256
# Chunk yazimi ana thread'i bekletmez. Ani kapanmada son saniyeler kaybolabilir.
sync-chunk-writes=false
Apply to your service

Apply view distance and chunk settings

Writes the server.properties values from this guide to your server. Your other settings are left untouched; only the keys below change.

  • view-distance = 8 (fewer chunks loaded per player)
  • simulation-distance = 6 (narrows entity and redstone ticking)
  • network-compression-threshold = 256 (CPU/bandwidth balance)
  • sync-chunk-writes = false (moves disk writes off the main thread)

The server must be restarted for this change to take effect.

If you have a Clodo service you can apply these steps without touching a terminal. You always see the diff before anything is written.

Proper Java startup arguments (Aikar's Flags)#

Default Java garbage collection is ill-suited for Minecraft, causing severe 'Stop-The-World' pauses where the entire server freezes. Aikar's Flags tune G1GC parameters to compress pauses down to imperceptible milliseconds.

run.sh / Java Arguments
java -Xms12G -Xmx12G -XX:+UseG1GC \
  -XX:+ParallelRefProcEnabled \
  -XX:MaxGCPauseMillis=200 \
  -XX:+UnlockExperimentalVMOptions \
  -XX:+DisableExplicitGC \
  -XX:+AlwaysPreTouch \
  -XX:G1NewSizePercent=30 \
  -XX:G1MaxNewSizePercent=40 \
  -XX:G1ReservePercent=20 \
  -XX:G1HeapWastePercent=5 \
  -XX:InitiatingHeapOccupancyPercent=15 \
  -XX:SurvivorRatio=32 \
  -jar purpur.jar --nogui

Common mistakes and fixes#

Implementation method comparison#

Method Comparison

How to Implement This?

Clodo Control Panel Quick Method

1-Click Optimized Engine & Live Metrics

Aikar's Flags are pre-configured out of the box; Purpur engine and Spark can be enabled in 1-click.

Where in Panel? Panel > Service detail > 'Version & Engine' tab, then set the engine to 'Purpur'.
Step-by-step Execution:
  1. 1Switch the engine to Purpur on the 'Version & Engine' tab; no need to download and upload a jar by hand.
  2. 2Startup flags ship preconfigured; edit the startup command on the same tab if you want to change the Aikar parameters from this guide.
  3. 3Edit configuration files in-browser without SFTP downloads.
  4. 4Monitor live CPU, RAM and disk usage curves in real-time.

Was this guide helpful?

Feedback goes straight to the team that maintains this guide.

Related Guides