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.