Minecraft Server Hopper & Container Optimization: Stop Hoppers from Destroying Your TPS
# Minecraft Server Hopper & Container Optimization: Stop Hoppers from Destroying Your TPS
If you've ever profiled a heavily loaded Minecraft server and wondered why TPS is tanking without any obvious cause, hoppers are frequently the culprit. A single hopper checks for items to move every 8 game ticks by default — and a base with a few hundred hoppers in an automated farm can easily consume 10–20% of your server's total tick budget. This guide explains exactly what's happening under the hood and how to fix it.
Why Hoppers Are So Expensive
Every hopper on the server executes logic during the tile entity phase of the tick loop. This includes:
- Checking the inventory above for items to pull
- Scanning item entities in its collection area (a 1×1×1 block space above the hopper)
- Pushing items into the container below or in the direction it faces
- Cooldown tracking to throttle transfer speed
The problem compounds when players build large sorting systems, storage arrays, or item farms. A mid-sized survival server might have 5,000–20,000 hoppers loaded at once across all player bases. With default settings, each one ticks every 8 game ticks — that's 2.5 times per second per hopper. Multiply that by 10,000 hoppers and you're looking at 25,000 hopper tick operations per second, all on the main thread.
This is why hopper lag rarely shows up as a single massive spike — it's a slow, creeping drain that keeps your TPS persistently below 20.
Key Configuration Settings
bukkit.yml — Hopper Tick Rate
The most impactful setting is in bukkit.yml:
ticks-per:
hopper-transfer: 8
hopper-check: 1
hopper-transfercontrols how many ticks between each item transfer attempt. The default is8. Increasing this to16or even24significantly reduces hopper overhead with minimal gameplay impact on farms — items just move slightly slower.hopper-checkcontrols how often hoppers check for nearby item entities on the ground. Increasing this to8or16reduces entity scanning cost considerably. Most players won't notice items take a fraction of a second longer to get sucked in.
Recommended values for busy servers:
ticks-per:
hopper-transfer: 16
hopper-check: 8
paper-world.yml — Hopper-Specific Optimizations
Paper adds several hopper optimizations in paper-world.yml (per-world configuration in newer Paper versions):
hopper:
cooldown-when-full: true
disable-move-event: false
ignore-occluding-blocks: true
cooldown-when-full— When set totrue, a hopper that tries to push items into a full container will enter a cooldown instead of retrying every tick. This is a massive win for full storage arrays and should always be enabled.disable-move-event— Setting this totruedisables theInventoryMoveItemEventfor hoppers. This breaks plugins that listen to hopper movements (like some shop or log plugins), but if you don't use any, it can cut hopper CPU cost by 30–50%. Check your plugin list before enabling.ignore-occluding-blocks— Allows hoppers to collect items through certain blocks, which reduces the need for complicated farm designs and is enabled by default in recent Paper builds.
spigot.yml — Hopper and Container Merging
world-settings:
default:
hopper-amount: 1
hopper-can-load-chunks: false
hopper-can-load-chunks— Keep thisfalse. Iftrue, hoppers can force-load chunks, which is a serious performance issue when players build hopper lines near chunk borders.hopper-amount— Controls items transferred per hopper operation. Increasing this (e.g., to3or8) means fewer operations are needed to transfer the same amount of items, reducing total tick time. This is a great trade-off for servers where item throughput matters but tick cost is high.
Purpur and Pufferfish Extras
If you're running Purpur, check purpur.yml for:
world-settings:
default:
hopper:
cooldown-when-full: true
ignore-occluding-blocks: true
Pufferfish includes async hopper optimizations that offload some container scanning away from the main thread. If you're on a high-player-count server and haven't tried Pufferfish (or its fork Purpur-based builds), it's worth evaluating.
Practical Strategies to Reduce Hopper Count
Configuration alone won't save you if players build irresponsible farms. Consider these server-side approaches:
1. Per-Player or Per-Chunk Hopper Limits
Plugins like ClearLag, HopperLimiter, or custom Paper plugins can cap the number of hoppers per chunk or per player. A reasonable limit for survival servers is 64 hoppers per chunk.
2. Educate Your Players
Many players don't know that hopper pipes are expensive. Sharing a simple guide encouraging the use of:
- Dropper chains (cheaper than hoppers for bulk movement)
- Mod-based alternatives on modded servers (pipes, conveyor belts)
- Condensed sorters using fewer hoppers through clever filter designs
...can make a meaningful difference on community servers.
3. WorldGuard Region Flags
Use WorldGuard to restrict hopper placement in certain zones — particularly near spawn or in public areas where uncontrolled farms could appear.
How to Diagnose Hopper Lag
Use spark to identify hopper-related lag:
/spark profiler --thread *
Look for HopperBlockEntity or TileEntityHopper in the profiler output. If it's consuming more than 5% of tick time, your hopper settings need attention.
Tools like [PulseNode](https://pulsenode.tech) can surface these patterns automatically — tracking TPS trends over time and flagging when tile entity overhead starts creeping up, so you catch the problem before players notice lag.
Recommended Config Summary
| File | Setting | Default | Recommended |
|------|---------|---------|-------------|
| bukkit.yml | hopper-transfer | 8 | 16 |
| bukkit.yml | hopper-check | 1 | 8 |
| paper-world.yml | cooldown-when-full | true | true |
| paper-world.yml | disable-move-event | false | true* |
| spigot.yml | hopper-amount | 1 | 3–8 |
| spigot.yml | hopper-can-load-chunks | false | false |
*Only if no plugins rely on InventoryMoveItemEvent
Final Thoughts
Hoppers are deceptively expensive because their cost is distributed and invisible until you profile deeply. The combination of increasing transfer tick intervals, enabling full-container cooldowns, disabling unnecessary inventory move events, and setting reasonable hopper limits can recover 5–15% of your total server tick budget — without any noticeable gameplay impact for most players.
Start with bukkit.yml and paper-world.yml changes, profile with spark before and after, and iterate from there. Small incremental wins on tile entity performance add up quickly on busy servers.
---
Want to know when hopper lag is building up before it ruins your players' experience? [PulseNode](https://pulsenode.tech) monitors your server's TPS, memory, and performance trends in real time — so you can spot creeping tile entity overhead the moment it starts, not after your players start complaining.