A practical, tiered configuration for a survival multiplayer server on Paper or Purpur. Pick one tier for the whole server, apply it, then re-profile with spark and adjust. These are strong starting points, not sacred numbers. Every server is different, so the loop is always: set a tier, watch MSPT and TPS at peak, nudge from there.

The tiers only differ on settings that trade vanilla behaviour for performance:

  • Full-Vanilla. Every farm, redstone circuit and mob behaves exactly as vanilla. Only optimisations a player could never detect.
  • Kinda-Vanilla. The widely accepted trade-offs. Almost nobody notices. A few very technical contraptions might.
  • Semi-Vanilla. Aggressive. Real savings, but some AFK-range farms, item sorters and distance-sensitive builds will behave differently. Only pick this if raw TPS matters more than edge-case builds.

A note on key paths: the standard Paper, Spigot and Bukkit keys below are stable. Villager lobotomize is a Purpur feature and lives in purpur.yml, so on stock Paper skip that row and lean on the Paper villager tick-rates instead. Each generated config file is self-documenting, so confirm the exact path in your own files before relying on it, as key names do move between builds. Paths below are accurate as of Paper and Purpur for Minecraft 1.21.x.

Free wins: apply these in every tier

These change nothing a player can see. There is no reason not to run all of them.

paper-world-defaults.yml

  • max-auto-save-chunks-per-tick: 8 (raise toward 20 if you run 20 or more players).
  • prevent-moving-into-unloaded-chunks: true.
  • delay-chunk-unloads-by: 10s.
  • treasure-maps.find-already-discovered.loot-tables: true and treasure-maps.find-already-discovered.villager-trade: true. Stops a map request hanging the server while it hunts an ungenerated structure.
  • non-player-arrow-despawn-rate: 20 and creative-arrow-despawn-rate: 20. Skeleton and creative arrows you cannot pick up despawn after a second.
  • entity-per-chunk-save-limit: cap each projectile type around 8 to 10 so a stray arrow machine cannot bloat a chunk.
  • anti-xray.enabled: true if you want it. It costs a little CPU but is cheaper than any anti-xray plugin.

server.properties

  • network-compression-threshold: 256 (set to -1 only if players connect over a LAN or the same machine).
  • sync-chunk-writes: false. Stops each chunk save blocking on a synchronous disk write. This is the usual recommendation on Paper; leave it on only if your storage is unreliable and you have no backups.

The tiered settings

Each row shows Full-Vanilla / Kinda-Vanilla / Semi-Vanilla, then what actually changes.

View and tick distance (server.properties)

Key Full Kinda Semi What changes
view-distance 10 8 7 How far players see. Purely visual, and the single biggest lever on chunk load.
simulation-distance 8 6 4 How far chunks tick. Below 8 can affect farms that rely on distant chunks ticking, so drop it knowingly.

Keep view-distance higher than simulation-distance. You can send players a wide view while ticking a smaller area.

Mob spawning (bukkit.yml, paper-world)

Run per-player-mob-spawns: true (paper-world) in every tier. It gives each player a fair, singleplayer-like share of the mob cap, and it is what makes lower caps safe.

Key Full Kinda Semi What changes
spawn-limits.monsters 30 20 12 Fewer hostile mobs loaded. Lower values thin mob-farm rates and general danger.
spawn-limits.animals 10 8 5 Fewer passive animals.
ticks-per.monster-spawns 1 2 4 Time between spawn attempts. Higher saves CPU, slightly slows spawns.
mob-spawn-range (spigot.yml) 6 4 3 Chunks from a player mobs spawn in. Keep at or below simulation-distance.

Entity activation

Activation range is a hard cutoff: an entity outside it stops ticking until a player comes closer. It is the main lever for distant mob cost on Paper, so the tiers lean on it.

Key (spigot.yml) Full Kinda Semi What changes
entity-activation-range.animals 32 24 16 Lower stops distant animals ticking. Semi breaks some AFK-range animal farms.
entity-activation-range.monsters 32 24 24 Monsters need a little range to stay responsive.
entity-activation-range.villagers 32 24 16 Affects village and iron farms at range.
entity-activation-range.misc 16 12 8 Item frames, paintings, boats.
entity-activation-range.water 16 12 8 Fish and squid.

Villagers

Throttling villager sensors is invisible to players (just less frequent checks), so every tier does it. Kinda and Semi add Purpur's lobotomize on top. On stock Paper, use the tick-rates alone.

Key Full Kinda Semi What changes
tick-rates.behavior.villager.acquirepoi (paper-world) 120 120 120 The heaviest villager behaviour.
tick-rates.behavior.villager.validatenearbypoi 60 60 60 POI validation frequency.
tick-rates.sensor.villager.secondarypoisensor 80 80 80 The competitor and secondary POI scan, often the villager hotspot in a profile.
tick-rates.sensor.villager.nearestbedsensor 80 80 80 Bed search frequency.
mobs.villager.lobotomize.enabled (purpur.yml, under world-settings.default) false true true Skips the brain for villagers that cannot reach a job site or bed. Kills the POI-scan lag in a penned trading hall. Full-Vanilla leaves it off and relies on confining villagers instead, which is a build choice, not a mechanic change.

Whichever tier you run, the durable fix for a trading hall is still to bound the villager count and pen them so they cannot path. Config raises the ceiling. It does not remove the cost of an unbounded, dense population.

Items, redstone and explosions (paper-world, spigot.yml)

Key Full Kinda Semi What changes
merge-radius.item (spigot) 2.5 3.0 4.0 Items merge over a wider area. Too high and drops appear to teleport, and some farms miscount.
merge-radius.exp (spigot) 3.0 4.0 6.0 Same idea for XP orbs.
alt-item-despawn-rate.enabled (paper) false true true Junk drops (dirt, sand, cobble, leaves) despawn faster. Barely noticeable.
redstone-implementation (paper) VANILLA ALTERNATE_CURRENT ALTERNATE_CURRENT Faster redstone. Only very technical circuits see minor timing differences.
optimize-explosions (paper) false true true Faster explosion maths, very slight damage inaccuracy.
nerf-spawner-mobs (spigot) false true true Spawner mobs get no AI until pushed. Most grinders still work on water streams, a few AI-dependent ones do not.

Hoppers are deliberately left at vanilla in all three tiers. Raising hopper-transfer or hopper-check (spigot.yml) does save time, but it breaks item sorters and redstone clocks, which almost every SMP relies on. Not worth it here.

Armour stands (paper-world)

Key Full Kinda Semi What changes
armor-stands.do-collision-entity-lookups false false false Removes armour-stand collision checks. Safe, and a real win if a build has many stands.
armor-stands.tick true false false Off stops gravity and water pushing on stands. Breaks the rare contraption that relies on stand physics.

What breaks at each tier, in one place

  • Full-Vanilla: nothing. If a player finds a difference, it is a bug, not a setting.
  • Kinda-Vanilla: very technical redstone timing may drift (alternate-current), spawner grinders that need mob AI change (nerf-spawner-mobs), and armour-stand physics contraptions stop. Lobotomize makes penned villagers that cannot reach a job site or bed stop thinking, which is the point, but it also affects any build that relies on those villagers moving.
  • Semi-Vanilla: the above, plus AFK-range farms may underperform (lower activation range), and mob-farm rates drop (lower caps). Item sorters are still fine because hoppers stay vanilla.

After you apply a tier

  1. Restart, let the server settle, and get players on it.
  2. Run a spark profiler over a busy period, not an idle one. The averaged tree lies when the load is spiky, so drag-select the worst window.
  3. Read MSPT, not vibes. If a tick sits well under 50ms with headroom, you are done. If not, expand processPacketsAndTick and find the real cost before you change more settings.
  4. Change one thing at a time. Cargo-culting a whole config makes it impossible to know what helped.