
Quick Fix: If your ATM10 server shows "Can't keep up!" warnings, do this immediately:
- Switch to Generational ZGC: Swap the pack's G1 flags in
user_jvm_args.txtfor -XX:+UseZGC -XX:+ZGenerational (requires Java 21+), on a fast CPU with 4+ cores, which is when the ATM guides suggest ZGC - Keep the watchdog on: The official ATM10 start script writes max-tick-time=180000 into a new server.properties. Leave it there instead of setting it to -1
- Size the heap to your plan: The official server files ship with -Xms4G -Xmx8G. Raise -Xmx to fit your plan RAM (12GB for 1-5 players, 16GB for 5-15, 32GB for 15+), but keep it below the plan size, because Java needs memory on top of the heap
- Pre-generate world: Use NeoForge's built-in
/neoforge generatecommand before players join (the radius is in chunks, so a 5,000-block radius is about 313)
Start with these four, then work through the rest of this guide. Still picking a server? Our ATM10 server hosting plans are sized by player count.
Why All The Mods 10 Destroys Servers
The "Kitchen Sink" Problem
ATM10 is a kitchen sink modpack: it includes around 500 mods covering every conceivable Minecraft feature:
| Mod Category | Example Mods | Performance Impact |
|---|---|---|
| Tech | Mekanism, RFTools | High (complex tile entities) |
| Magic | Ars Nouveau, Occultism | Medium (particle effects, rituals) |
| World Gen | Oh The Biomes We've Gone | Extreme (chunk generation lag) |
| Dimensions | Allthemodium (Mining dimension), The Twilight Forest, Deeper and Darker | High (separate world loading) |
| Storage | Refined Storage, Applied Energistics 2 | Medium (network calculations) |
| Automation | Create, Integrated Dynamics | Extreme (thousands of rotating blocks) |
Result: A single player exploring new terrain puts far more load on the CPU than in Vanilla Minecraft, and it adds up fast with several players online.
The Infamous Error Message
[Server thread/WARN]: Can't keep up! Is the server overloaded?
Running 5283ms or 105 ticks behind
Translation: The server has fallen 5.2 seconds (105 ticks) behind, when each tick should take 50ms. The game is running in slow motion.
What players experience:
- Mobs teleporting (rubberbanding)
- Block break delay (hit block, waits 3 seconds to break)
- Chunk loading lag (falling through unloaded chunks)
- Crashes during world generation
The RAM Allocation Myth (More Is Not Always Better)
Common Mistake
Reddit advice: "ATM10 needs 32GB RAM minimum!"
Reality: More RAM only helps up to the point where the server has enough. Past that, lag comes from ticks taking longer than 50ms, and a bigger heap does not make a slow tick faster.
What the Pack Ships With
The official ATM10 server files set -Xms4G -Xmx8G in user_jvm_args.txt, together with G1 garbage collector flags. That heap stays at 8GB until you change it, even if your server has more RAM available.
Optimal RAM Allocation for ATM10
| Player Count | Plan RAM | Space-Node Plan |
|---|---|---|
| 1-5 players | 12GB | MC Special 1 |
| 5-15 players | 16GB | MC Special 3 |
| 15+ players | 32GB | MC Special 4 |
Rule: Pick the RAM for your player count, then raise -Xmx in user_jvm_args.txt to fit it. Keep the heap below your plan size, because Java needs memory on top of the heap. More is not better.
The Solution: Generational ZGC (Java 21+)
What is ZGC?
Z Garbage Collector is a modern GC designed for low-latency applications (like game servers).
Traditional G1GC (Java's default):
GC Cycle:
1. Stop ALL game threads (Stop-the-World pause)
2. Scan heap for garbage
3. Free memory
4. Resume game threads
Generational ZGC:
GC Cycle:
1. Scan heap WHILE game runs (concurrent)
2. Only pause for under 1ms to swap memory pointers
3. Continue scanning in background
Pause time: under 1ms (players don't notice)
How to Enable Generational ZGC
Step 1: Update to Java 21
ATM10 needs Java 21. The official start script stops if Java is missing or older than 21:
# Check Java version
java -version
# Should show:
# openjdk version "21.0.x"
If you see Java 17 or lower, download Adoptium Temurin JDK 21.
Step 2: Replace the G1 Flags in user_jvm_args.txt
ATM10 does not start from a single server jar. The official start script launches NeoForge like this, and every JVM flag comes from user_jvm_args.txt:
java @user_jvm_args.txt @libraries/net/neoforged/neoforge/21.1.251/unix_args.txt nogui
(21.1.251 is the NeoForge version ATM10 8.2 uses. The path changes when the pack moves to a newer NeoForge.)
OLD FLAGS (what ATM10 ships, Aikar-style G1GC):
-Xms4G
-Xmx8G
-XX:+UseG1GC
-XX:+ParallelRefProcEnabled
-XX:MaxGCPauseMillis=200
# ...followed by more G1 tuning flags
NEW FLAGS (ZGC, from the official ATM guides for Java 21):
-Xms8G
-Xmx12G
-XX:+UseZGC
-XX:+ZGenerational
-XX:SoftMaxHeapSize=10g
-XX:+DisableExplicitGC
-XX:+AlwaysPreTouch
-XX:+PerfDisableSharedMem
-XX:+UseDynamicNumberOfGCThreads
Explanation:
-XX:+UseZGC: Enable Z Garbage Collector-XX:+ZGenerational: Use generational mode (separates young/old objects)-XX:SoftMaxHeapSize=10g: ZGC tries to stay under this size and only grows past it, up to -Xmx, when it has to-XX:+UseDynamicNumberOfGCThreads: Lets Java decide how many GC threads to run instead of a fixed number-XX:+AlwaysPreTouch: Initialize all RAM at startup (prevents mid-game allocation lag)
The ATM guides suggest this ZGC set for fast CPUs with 4+ cores, with -Xms8G -Xmx12G. The heap has to stay below your plan size, so on a 12GB plan lower -Xmx (and SoftMaxHeapSize with it) instead of copying 12G as is. On a 16GB or 32GB plan, raise both to fit.
Result: ZGC helps with lag spikes caused by garbage collection pauses. If spark shows world generation or machines eating the tick, the fixes further down matter more.
Server.properties Optimizations
Critical Settings
1. Keep the Watchdog, but Give It Room (Prevents False Crashes)
# Vanilla default (too short for modded)
max-tick-time=60000
# What the official ATM10 start script writes (keep this)
max-tick-time=180000
Why: ATM10's world generation and big machine setups can stall a single tick for a long time. At the vanilla 60 seconds, the watchdog can kill a server that was only slow. The official ATM10 start script raises it to 180000 (3 minutes) when it creates server.properties, so keep that value.
Warning: Don't set max-tick-time=-1. That turns the watchdog off completely, and a truly frozen server then hangs until someone notices, instead of shutting down so it can be restarted.
2. Reduce Simulation Distance
# Vanilla default (causes lag in ATM10)
simulation-distance=10
# What the official ATM10 start script writes
simulation-distance=5
# Optimized for a busy server
simulation-distance=4
Impact:
- Distance 10: Server simulates 21x21 chunks = 441 chunks per player
- Distance 5: Server simulates 11x11 chunks = 121 chunks per player
- Distance 4: Server simulates 9x9 chunks = 81 chunks per player
Result: Going from the pack's 5 down to 4 cuts the simulated area per player by about a third. Players won't notice (mobs still spawn, farms still work within 4 chunks).
3. Keep View Distance at 8
# Vanilla default
view-distance=10
# What the official ATM10 start script writes (keep it)
view-distance=8
Why: View distance controls how far players can see. With ATM10's complex world generation, rendering 10 chunks in all directions overwhelms the server's chunk loading system. 8 chunks is still ~128 blocks (plenty for gameplay). The start script only writes this when it creates a new server.properties, so if yours came from somewhere else, set it yourself.
4. Disable Unnecessary Features
# These features are rarely used but consume resources
spawn-npcs=false
spawn-animals=false
spawn-monsters=true
# Only generate animals/NPCs in designated areas via mods
Note: Only turn spawn-animals off if your players already farm the animals they need.
World Pre-Generation (The #1 Lag Fix)
Why Pre-Generation is Critical
Without pre-gen:
Player explores new area →
Server generates new chunks on the spot →
Each chunk: Calculate biome, place features, spawn structures →
CPU maxes out →
TPS drops →
Everyone lags
With pre-gen:
Server pre-generates world during downtime (overnight) →
Player explores new area →
Server loads existing chunks from disk →
TPS holds steady →
Smooth gameplay
How to Pre-Generate with NeoForge's Built-in Command
ATM10 does not include a pregen mod like Chunky, but NeoForge has a pregenerator built in, so there is nothing to install. (Chunky commands only work if you add Chunky to the server yourself.)
Step 1: Start the Pregen
The full syntax is /neoforge generate start <x> <y> <z> <chunkRadius> [progressBar]. The radius counts chunks, not blocks, so divide your block radius by 16. For a 5,000-block radius around 0,0:
/neoforge generate start 0 64 0 313
chunkRadiuscan be 1 to 2500. It generates a square centered on the chunk that holds the position you give.progressBaris on by default and shows a boss bar to the player who ran the command. Addfalseat the end to hide it.- The command needs permission level 4, so run it from the server console or as a level 4 op.
- Only one pregen task can run at a time.
Step 2: Monitor Progress
/neoforge generate status
Step 3: Stop When Players Need the CPU (Optional)
/neoforge generate stop
There is no pause command, so stop the task and start it again later.
Other dimensions: The command only generates the dimension it runs in. From the console, pre-generate the Nether with:
/execute in minecraft:the_nether run neoforge generate start 0 64 0 100
Recommended Radius:
| Player Count | Pre-Gen Radius | chunkRadius |
|---|---|---|
| 1-5 players | 2,500 blocks | 156 |
| 6-15 players | 5,000 blocks | 313 |
| 16-30 players | 10,000 blocks | 625 |
| 30+ players | 15,000 blocks | 938 |
Pre-generated chunks take up disk space, so check your free storage before you pick a big radius.
Pro Tip: Run pre-gen overnight before server launch. Once it finishes, exploring inside that area no longer triggers new chunk generation.
Mod-Specific Optimizations
1. Create Mod (Rotating Blocks Killer)
Problem: Create's rotating blocks (water wheels, mechanical crafters) are calculated every tick. 50 windmills = 50x tick overhead.
Solution: Find the contraptions that cost the most with spark or Observable (both already ship with ATM10, see Monitoring below), then switch off or remove the ones that do not need to run all the time.
2. Refined Storage / Applied Energistics 2
Problem: Large storage networks recalculate every tick.
Solution: Check spark first so you know the network is really the cause. Then cut back on autocrafting setups and crafting CPUs you no longer use, instead of tearing down the whole network.
3. Chunk Loading (FTB Chunks)
Problem: Force-loaded chunks stay active even when no player is online, so the server keeps ticking entities, fluids and contraptions for empty bases.
Solution (recent FTB Chunks, ATM10 default):
- Open the map (
Mby default). - Click the Server Settings gear (purple/blue gear, top right).
- Scroll to Offline Forceloading Mode and set it to
Never.
This unloads all team and player force-loaded chunks the moment everyone logs off, which is usually what you want for a small ATM10 server. You can still cap how much each team is allowed to force-load with the Max Force Loaded Chunks setting in the same server menu, around 4-8 per player is plenty for normal farms.
If you want some chunks to stay loaded while everyone is offline (for example a long auto-craft or AE2 channel boot up), set Offline Forceloading Mode to If team has online members or Always only for the specific dimension you need, instead of leaving it on globally.
Why: Each permanently force-loaded chunk = tick overhead 24/7. Letting them unload when nobody is online takes that load off the server, with no real downside for casual play.
Note: On modern FTB Chunks the old Chicken Chunks mod is no longer needed. The Offline Forceloading toggle plus the per-team chunk cap covers the same use case without extra mods. Big thanks to Eric for flagging the outdated section, this is now updated.
4. Crash Utilities Item Clear (On by Default)
ATM10 ships Crash Utilities with Item Clear switched on. Every 5 minutes it counts the loaded item entities, and if there are more than 1000 it clears all of them, with chat warnings 20 and 5 seconds before.
That keeps dropped item piles from dragging the server down, but it can also wipe the output of a farm that dumps items on the ground. Change the timer or the limit, or turn it off, in config/crashutilities-server.toml (a copy in world/serverconfig/ overrides it for that world). Some older guides say Item Clear is off by default; in ATM10 it is on.
Dimension-Specific Lag Fixes
ATM10 adds several extra dimensions on top of the vanilla three. Each dimension = separate world loading.
The Nether
Problem: Players travel far in the Nether, and every new area there needs fresh chunk generation too.
Solution: Pre-generate the Nether as well. /neoforge generate only covers the dimension it runs in, so use the /execute in minecraft:the_nether line from the pre-generation section above.
Mining Dimension
Problem: Players strip-mine endlessly, generating huge numbers of new chunks.
Solution: Reset the Mining Dimension (from Allthemodium) weekly:
# Stop server and back up first
# Delete dimension folder
rm -rf world/dimensions/allthemodium/mining
# Restart server (dimension regenerates)
Add to weekly cron job. Players know it resets, so they don't build there.
Hardware Requirements Reality Check
Minimum Specs (1-5 Players)
| Component | Specification | Cost |
|---|---|---|
| CPU | Ryzen 5 7600X or Intel i5-13600K | $200-250 |
| RAM | 16GB DDR4/DDR5 | $60-80 |
| Storage | 500GB NVMe SSD | $40-60 |
| Network | 100 Mbps upload | ISP dependent |
Recommended (6-15 Players)
| Component | Specification | Cost (VPS) |
|---|---|---|
| CPU | Ryzen 7 7700X / 7800X3D | $60-80/month |
| RAM | 16GB+ | Included |
| Storage | 1TB NVMe | Included |
| Network | 1 Gbps | Included |
Ideal (16-30 Players)
| Component | Specification | Cost (Dedicated) |
|---|---|---|
| CPU | Ryzen 9 7950X / 9950X | $120-150/month |
| RAM | 32GB+ | Included |
| Storage | 2TB NVMe (RAID 1) | +$20/month |
| Network | 10 Gbps | Included |
Why Ryzen over Intel for ATM10?
- Ryzen 7000/9000 series chips have strong single-core performance
- Minecraft is single-threaded; the 7950X's individual cores are faster than Intel's E-cores
- Better price-to-performance for gaming workloads
Monitoring and Diagnostics
Essential Tools
1. Spark Profiler
Spark already ships with ATM10, so there is nothing to install.
Usage:
# In-game (OP required)
/spark profiler --timeout 180
# Wait 3 minutes (during lag spike ideally)
# Spark generates web report: https://spark.lucko.me/xxx
Reading the Report (simplified example):
Top Contributors to Tick Time:
1. World Tick (43%)
└─ Chunk Generation (38%) ← PRE-GEN NEEDED
2. Entity Tick (31%)
└─ Mekanism FluidTank (18%) ← Reduce Mekanism networks
3. Tile Entity Tick (22%)
└─ Create KineticNetwork (15%) ← Reduce Create contraptions
Action: Focus on the top 3 contributors. Ignore anything <5%.
2. Observable (Visual Lag Identification)
Observable also ships with ATM10 and shows lag in-game:
- Set a keybind for Observable in your Controls settings first (you need one to open it)
- Open it, click the profile TPS button and wait for the run to finish
- You get a list of the blocks and entities costing the most TPS, and laggy blocks light up from green to red in the world (red is worst)
- Fly around your base to find culprits
3. NeoForge's Built-in Tracking
NeoForge can also time block entities and entities without any extra mod. Starting a run needs permission level 2:
/neoforge track start blockentity 60
# Wait 60 seconds, then show the results:
/neoforge track blockentity
Swap blockentity for entity to time mobs and other entities instead.
Emergency Lag Response Plan
Your server is at 5 TPS right now. Here's the quick fix:
Immediate Actions (Do in Order)
1. Check TPS
/neoforge tps
# Output: one line per loaded dimension, then an Overall line,
# each shown as "X TPS (Y ms/tick)"
/forge tps from older Forge guides is not a NeoForge command, so use /neoforge tps on ATM10.
If <10 TPS, continue:
2. Identify Lag Source
/spark profiler --timeout 60
3. Quick Fixes Based on Spark Output
If "Chunk Generation" is #1:
# Emergency: Reduce view distance immediately
# Edit server.properties:
view-distance=4
simulation-distance=3
# Restart server
If "Entity Tick" is #1:
# See which entity types are piling up
/neoforge entity list
# Kill all items on ground
/kill @e[type=item]
# Kill one problem mob type (swap in the ID from the list)
/kill @e[type=minecraft:zombie]
If "Mekanism" or "Create" is #1:
# Teleport to the chunk shown in Spark report
/tp @s <x> <y> <z>
# Break the offending machine (or switch it off)
4. Restart with ZGC
If you're still using G1GC and your server has 4+ fast cores, switch now:
# Edit the JVM arguments file
nano user_jvm_args.txt
# Keep your -Xms/-Xmx lines and replace the G1 flags
# with the ZGC set from Step 2 above, starting with:
-XX:+UseZGC
-XX:+ZGenerational
5. Announce Restart
/say Server restarting in 60 seconds for lag fix
/stop
If you run the official start script, it starts the server again 10 seconds after it stops, unless ATM10_RESTART=false is set.
Then: Run /neoforge tps again to check the fix worked, and pre-generate the world once things are stable.
Long-Term Stability Strategy
Weekly Maintenance Checklist
Sunday 3 AM (Low Traffic):
# 1. Stop the server first
# (if the server runs under the official startserver.sh, it must have
# been started as ATM10_RESTART=false ./startserver.sh, or press Ctrl+C
# during the 10 second wait, or it starts again)
/stop
# 2. Backup world
tar -czf backups/world-$(date +%Y%m%d).tar.gz world/
# 3. Reset Mining Dimension
rm -rf world/dimensions/allthemodium/mining
# 4. Check disk space
df -h
# If >80% full, delete old backups:
rm backups/world-2026012*.tar.gz
# 5. Start server again
./startserver.sh
# 6. Clear entity buildup once the server is up:
/kill @e[type=item]
/kill @e[type=arrow]
Automate with Cron:
crontab -e
# Add:
0 3 * * 0 /home/minecraft/atm10/weekly-maintenance.sh
Performance Degradation Signs
Watch for these warnings:
| Symptom | Likely Cause | Fix |
|---|---|---|
| TPS slowly drops over days | Entity buildup (items, mobs) | /neoforge entity list, then kill what piles up |
| Sudden TPS spike down | Player hit new biome (generation lag) | Pre-gen more chunks |
| TPS fine, players lag | Network issue (not server) | Check player connection |
| TPS <15 always | Hardware insufficient | Upgrade to the Premium tier (Ryzen 9 9950X) |
ATM10 Server Configs (Copy-Paste)
JVM Arguments (user_jvm_args.txt)
# ATM10 with ZGC (Java 21), from the official ATM guides
# Keep -Xmx below your plan RAM: lower it (and SoftMaxHeapSize) on a 12GB plan, raise both on 16GB or 32GB
-Xms8G
-Xmx12G
-XX:+UseZGC
-XX:+ZGenerational
-XX:SoftMaxHeapSize=10g
-XX:+DisableExplicitGC
-XX:+AlwaysPreTouch
-XX:+PerfDisableSharedMem
-XX:+UseDynamicNumberOfGCThreads
Start it with the pack's own script:
chmod +x startserver.sh
./startserver.sh
server.properties (Optimized)
# Core Settings
server-port=25565
max-players=20
view-distance=8
simulation-distance=4
# max-tick-time, view-distance and allow-flight match the official start script
max-tick-time=180000
allow-flight=true
# World Settings
level-seed=
level-type=minecraft\:normal
spawn-protection=0
allow-nether=true
generate-structures=true
# Performance
spawn-npcs=false
spawn-animals=false
spawn-monsters=true
network-compression-threshold=256
When to Give Up and Upgrade Hardware
Signs Your Hardware Can't Handle ATM10
- You've done everything in this guide
- TPS still <15 with <10 players
- CPU at 100% constantly (check with
htop)
Solution: You need better hardware.
Upgrade Path
| Current | Bottleneck | Upgrade To | Cost |
|---|---|---|---|
| i5-12400 | CPU (low single-core) | Ryzen 7 7700X | $300 |
| 8GB RAM | Memory (constant swapping) | 16GB | $60 |
| SATA SSD | Disk I/O (chunk loading) | NVMe Gen3 | $80 |
| Shared VPS | CPU steal time | Dedicated VPS | $50/mo |
Best bang-for-buck: Upgrade CPU to Ryzen 7700X/7800X3D. ATM10 is CPU-bound above all else.
Conclusion: The ATM10 Optimization Hierarchy
Fix issues in this order:
- Enable Generational ZGC if your server has 4+ fast cores (otherwise keep the pack's G1 flags)
- Pre-generate the world with
/neoforge generate(fewer lag spikes while exploring) - Keep max-tick-time at 180000 (prevents false crashes without hiding real freezes)
- Reduce simulation/view distance
- Find heavy Create/Mekanism setups with spark and switch off what you do not need
- Weekly entity cleanup (prevents long-term degradation)
- Upgrade hardware if still lagging (last resort)
Work through this list in order and check /neoforge tps after each step, so you know which fix actually helped.
Need hosting for heavy modpacks? Our All The Mods 10 server hosting plans start at 12GB for 1 to 5 players, with 16GB and 32GB plans for bigger groups. Every plan runs on NVMe storage, and you set your own JVM arguments in the panel's Startup tab. Premium plans in the Netherlands, Germany, Poland and Canada run on a Ryzen 9 9950X with DDR5.
Related Guides:
- Cobblemon Server Optimization
- Folia vs Paper: Multithreading Guide
- Spark Profiler Tutorial
- ATM9 vs ATM10: modpack comparison
- ZGC vs G1GC garbage collector guide
ATM10 Requirements and JVM Guides
If you are still choosing RAM and CPU, read ATM10 server requirements. If your startup flags are the problem, use Minecraft ATM10 JVM arguments.
If your client is crashing outright rather than lagging, that is a different problem: see exit code -1073740791 and why "outdated video drivers" is often wrong.