Minecraft Server World Generation Optimization: Pre-Generate Your World and Eliminate Chunk Lag
# Minecraft Server World Generation Optimization: Pre-Generate Your World and Eliminate Chunk Lag
One of the most overlooked causes of server lag is real-time world generation. Every time a player walks into an unexplored area, your server has to generate new chunks on the fly — calculating terrain, structures, biomes, ores, and more. On a busy server, this can tank your TPS instantly and make the experience miserable for everyone.
In this guide, you'll learn how to pre-generate your world, set smart world borders, and tune your chunk generation settings to keep your server running smoothly even as your player base grows.
---
Why World Generation Causes Lag
Minecraft's world generation is computationally expensive. When a player moves into ungenerated territory, the server must:
- Generate terrain using noise algorithms
- Place biome-specific features (trees, flowers, caves)
- Attempt to spawn structures (villages, strongholds, etc.)
- Populate the chunk with ores and mob spawns
- Light the chunk (one of the most CPU-intensive operations)
All of this happens synchronously on the main thread in vanilla and Spigot-based servers, which means it directly competes with your TPS. A single player exploring new land can drop a 20 TPS server down to 10 TPS or lower.
---
Step 1: Pre-Generate Your World with Chunky
The most effective solution is to pre-generate your world before players join. Chunky is the go-to plugin for this.
Installing and Using Chunky
- Download [Chunky](https://www.spigotmc.org/resources/chunky.81534/) and place it in your
/pluginsfolder. - Set a center point and radius for generation:
/chunky center 0 0
/chunky radius 5000
/chunky start
This pre-generates a 5,000-block radius around spawn (a 10,000 x 10,000 block square). For most survival servers, a 3,000–6,000 block radius is sufficient.
How Long Does Pre-Generation Take?
Expect roughly:
- 3,000 block radius → ~30–60 minutes on a modern server
- 5,000 block radius → ~2–4 hours
- 10,000 block radius → ~8–16+ hours
Run this during low-traffic hours or before launch. Chunky saves progress, so you can stop and resume safely.
---
Step 2: Enforce a World Border
Pre-generation only helps if players can't wander beyond the pre-generated area. Use Minecraft's built-in world border to prevent new chunk generation.
/worldborder center 0 0
/worldborder set 10000
This sets a 10,000 x 10,000 block playable area. Match this to your Chunky radius.
Alternatively, you can use the WorldBorder plugin for more control, including per-world borders on multi-world setups with Multiverse.
---
Step 3: Tune Paper's Chunk Generation Settings
If some on-demand generation is unavoidable, Paper provides powerful knobs to reduce its performance impact.
paper-world.yml (or config/paper-world-defaults.yml in newer Paper builds)
chunks:
auto-save-interval: 6000
delay-chunk-unloads-by: 10s
entity-per-chunk-save-limit:
experience_orb: 16
arrow: 16
snowball: 8
ender_pearl: 8
auto-save-interval: Set this to 6000 ticks (5 minutes) instead of the default. Frequent auto-saves cause I/O spikes.
delay-chunk-unloads-by: Keeping recently visited chunks loaded for 10 seconds reduces re-loading overhead when players move back and forth near chunk borders.
spigot.yml
world-settings:
default:
chunk-gc:
period-in-ticks: 600
max-bulk-chunks: 10
view-distance: 6
max-bulk-chunks: Limits how many chunks are sent to a client at once, reducing burst CPU usage.
view-distance: 6: Consider 6 as a baseline if you're struggling with performance. Paper's simulation-distance can be set independently — players can see far but mobs only simulate close by.
server.properties
view-distance=6
simulation-distance=4
Setting simulation-distance to 4 while keeping view-distance at 6–8 is one of the best performance wins available in modern Paper servers. Players see more terrain, but your server only simulates ticks within 4 chunks.
---
Step 4: Async Chunk Loading (Paper & Folia)
Paper has built-in async chunk loading and saving, which significantly reduces main-thread chunk I/O compared to vanilla or Spigot. Make sure you're running Paper 1.18+ at minimum to benefit from this.
If you're running a very high-population server (100+ players), consider Folia — PaperMC's fork that introduces regionized multithreading, allowing different chunks to tick on separate threads. Folia is still maturing and not all plugins are compatible, but it's the future of high-performance Minecraft servers.
---
Step 5: Optimize Chunk Sending with Paper Config
In config/paper-global.yml:
chunk-loading-basic:
player-max-chunk-load-rate: 100
player-max-send-rate: 75
player-max-chunk-load-rate: Caps how many chunks per second a single player can trigger loading. Default is -1 (unlimited), which lets aggressive clients hammer your server.
player-max-send-rate: Limits how fast the server sends chunk data to each player. Lowering this reduces burst network and CPU pressure when players teleport.
---
Monitoring Chunk Performance
You can use the /spark profiler to identify chunk-related lag:
/spark profiler --timeout 60
Look for ChunkProviderServer or ServerChunkCache in the flame graph — these indicate chunk generation or loading lag.
For ongoing monitoring, tools like PulseNode can alert you when your TPS drops correlate with player movement patterns, helping you identify if unexplored terrain is the root cause before it becomes a player-facing issue.
---
Quick Reference Checklist
- ✅ Pre-generate world with Chunky (3,000–6,000 block radius)
- ✅ Set a world border matching your pre-gen radius
- ✅ Set
simulation-distance=4inserver.properties - ✅ Set
view-distance=6or7 - ✅ Configure
player-max-chunk-load-rateinpaper-global.yml - ✅ Increase
auto-save-intervalto6000ticks - ✅ Run Paper (or Purpur/Pufferfish) for async chunk I/O
- ✅ Profile with
/sparkto verify improvements
---
Final Thoughts
World generation lag is 100% preventable with proper preparation. Pre-generating your world before opening to players is the single most impactful thing you can do for server performance, and it costs nothing but time.
Pair that with tuned Paper settings and a sensible simulation distance, and your server will handle exploration-heavy gameplay without breaking a sweat.
[Try PulseNode free](https://pulsenode.tech) to monitor your server's TPS and chunk performance in real time — and catch generation spikes before your players notice them.