Optimizing Paper Spigot: Hidden Settings That Will Boost Your TPS

Published on | Updated

Paper has dozens of performance options that most admins never open. These are the ones worth checking, with their current key names and defaults, what changing them costs you, and how to measure the effect with spark.

Minecraft server Paper is the performance-focused Minecraft server software, but many of its defaults stay close to vanilla on purpose. Some settings are worth a look on any busy server. They are not really hidden, they are documented in the PaperMC configuration reference, but most admins never open those files.

Everything below uses the key names and defaults from the current PaperMC docs. Change one thing at a time and measure, because every server's bottleneck is different.

config/paper-global.yml

chunk-system:
  io-threads: -1        # below zero means a single chunk IO thread
  worker-threads: -1    # -1 lets Paper decide (up to half the physical cores)

misc:
  max-joins-per-tick: 5   # default; lower it if mass joins after a restart cause spikes

packet-limiter:
  all-packets:
    action: KICK
    interval: 7.0
    max-packet-rate: 500.0   # packets per player per interval before the action kicks in

watchdog:
  early-warning-delay: 10000
  early-warning-every: 5000

These are the defaults, and on a hosted server they are usually right. Leave worker-threads on -1 so Paper sizes it from the physical cores; io-threads: -1 means one IO thread, which is fine for most servers. The packet limiter protects you against clients that flood the server with packets; lowering max-packet-rate too far will kick legitimate players.

config/paper-world-defaults.yml

These settings apply to every world, unless you override them per world:

entities:
  spawning:
    creative-arrow-despawn-rate: 20      # default: default (vanilla behaviour)
    non-player-arrow-despawn-rate: 20    # default: default (vanilla behaviour)

hopper:
  cooldown-when-full: true      # already the default, make sure it is still on
  disable-move-event: false
  ignore-occluding-blocks: false

misc:
  redstone-implementation: ALTERNATE_CURRENT   # default: VANILLA

The arrow settings make arrows fired by creative players and by skeletons and other mobs disappear after 20 ticks (one second) instead of lying around. Fewer arrow entities means less to tick, especially near skeleton farms.

redstone-implementation accepts VANILLA, EIGENCRAFT and ALTERNATE_CURRENT. The docs say the alternatives "can greatly reduce the lag caused by redstone dust by optimizing power calculations". They can also change how some contraptions behave, so test your players' builds before switching on a live server.

The Hopper Cooldown Setting

With cooldown-when-full: true, Paper applies "a short cooldown when the hopper is full" instead of letting it retry every tick. It is on by default in current Paper, so this is less a tip than a check: if you inherited an old config, make sure nobody turned it off.

disable-move-event: true is a bigger switch. It turns off the InventoryMoveItemEvent for hoppers completely, which saves work on servers with large sorting systems, but it breaks any plugin that listens to that event. Chest protection and shop plugins can rely on it to stop hoppers pulling items out of locked containers, so check your plugins first. ignore-occluding-blocks: true makes hoppers ignore containers inside solid blocks, which changes how some farms work.

Mob AI Range in spigot.yml

The activation ranges live in spigot.yml, not in the Paper files:

world-settings:
  default:
    entity-activation-range:
      animals: 32
      monsters: 32
      raiders: 64
      misc: 16
      water: 16
      villagers: 32
      flying-monsters: 32
      tick-inactive-villagers: true

These are the defaults. Entities farther from a player than their range are ticked much less often. Lowering animals or villagers saves CPU on servers with large farms, at the cost of mobs standing still until a player comes closer. Setting tick-inactive-villagers: false stops villagers outside the range from working, which players with trading halls and iron farms will notice.

Spawn Limits in bukkit.yml

spawn-limits:
  monsters: 70
  animals: 10
  water-animals: 5
  water-ambient: 20
  water-underground-creature: 5
  axolotls: 5
  ambient: 15

These are the defaults from the bukkit.yml reference. Lowering monsters to something like 50 means fewer hostile mobs to run AI for. Players will see a bit fewer mobs at night and mob farms will produce less, so tell them before you change it. The same limits can be set per world in paper-world-defaults.yml under entities.spawning.spawn-limits, where -1 means "use bukkit.yml".

Measuring Your Improvements

Paper has bundled spark since 1.21 (PaperMC docs). Before you change anything, take a baseline at a normal busy time:

/spark tps
/spark profiler start --timeout 600

Write down the median and 95th percentile tick time (MSPT) from /spark tps, the number of players online, and the profiler link. Then apply one change, restart, wait until a similar number of players is online, and measure again the same way. A change that lowers MSPT without upsetting your players is a keeper. A change that makes no difference is not worth the gameplay cost, so put it back.

The budget is 50 ms per tick. As long as your MSPT stays under it, the server holds 20 TPS.

Host your Paper server on Space-Node