
Quick Fix: If your ATM10 server shows "Can't keep up!" warnings, do this immediately:
- Switch to Generational ZGC: Add -XX:+UseZGC -XX:+ZGenerational to Java flags (requires Java 21+)
- Disable watchdog: Set max-tick-time=-1 in server.properties
- Reduce RAM: If you allocated 32GB+, drop to 16-20GB (large heaps hurt performance)
- Pre-generate world: Use Chunky to pre-gen a 5,000-block radius before players join
These four changes solve 80% of ATM10 lag issues.
Why All The Mods 10 Destroys Servers
The "Kitchen Sink" Problem
ATM10 is a kitchen sink modpack--it includes 400+ mods covering every conceivable Minecraft feature:
| Mod Category | Example Mods | Performance Impact |
|---|---|---|
| Tech | Mekanism, Thermal, RFTools | High (complex tile entities) |
| Magic | Ars Nouveau, Botania, Occultism | Medium (particle effects, rituals) |
| World Gen | Biomes O' Plenty, Oh The Biomes We've Gone | Extreme (chunk generation lag) |
| Dimensions | Mining Dimension, Twilight Forest, Deep Dark | 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 generates 10x more CPU load than Vanilla Minecraft. With 10 players online, servers collapse.
The Infamous Error Message
[Server thread/WARN]: Can't keep up! Is the server overloaded?
Running 5283ms or 105 ticks behind
Translation: The server took 5.2 seconds to complete a game tick that 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 (Why 32GB Hurts)
Common Mistake
Reddit advice: "ATM10 needs 32GB RAM minimum!"
Reality: Allocating too much RAM causes lag, it doesn't fix it.
How Java Garbage Collection Works
Java Heap (allocated RAM):
┌────────────────────────────────────┐
│ Active Objects: ████░░░░░░░░░░░░ │ (4GB actually used)
│ Garbage: ░░░░▓▓▓▓▓▓▓▓░░░░░░░░░░ │ (28GB wasted space)
└────────────────────────────────────┘
32GB allocated
Garbage Collection Cycle:
1. GC scans entire 32GB heap
2. Takes 3-5 seconds to complete
3. Server FREEZES during scan
4. Players see: "Connection Lost - Timed Out"
Problem: The Garbage Collector (GC) has to scan 32GB to find 4GB of actual data. It's like searching a football stadium for your keys when they're in your pocket.
Optimal RAM Allocation for ATM10
| Player Count | Recommended RAM | Reasoning |
|---|---|---|
| 1-5 players | 8-10GB | Mods load, minimal world data |
| 6-15 players | 12-16GB | Multiple dimensions loaded |
| 16-30 players | 18-20GB | Heavy automation + exploration |
| 30+ players | 24GB max | Beyond this, use ZGC |
Rule: Allocate only what you need + 20% headroom. 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
Pause time: 500ms - 5,000ms (players disconnect)
Generational ZGC:
GC Cycle:
1. Scan heap WHILE game runs (concurrent)
2. Only pause for <1ms to swap memory pointers
3. Continue scanning in background
Pause time: <1ms (players don't notice)
Benchmark (ATM10 with 20GB RAM):
| GC Type | Average Pause Time | Max Pause Time | Player Experience |
|---|---|---|---|
| G1GC (default) | 850ms | 4,200ms | Frequent timeouts |
| Generational ZGC | 0.8ms | 12ms | Smooth gameplay |
How to Enable Generational ZGC
Step 1: Update to Java 21
ATM10 requires Java 21 minimum (ships with it):
# 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 Startup Flags
OLD FLAGS (Aikar's, designed for G1GC):
java -Xms16G -Xmx16G \
-XX:+UseG1GC \
-XX:+ParallelRefProcEnabled \
-XX:MaxGCPauseMillis=200 \
-jar forge-server.jar nogui
NEW FLAGS (Optimized for ZGC):
java -Xms16G -Xmx16G \
-XX:+UseZGC \
-XX:+ZGenerational \
-XX:ConcGCThreads=4 \
-XX:ParallelGCThreads=8 \
-XX:+AlwaysPreTouch \
-XX:+DisableExplicitGC \
-jar forge-server.jar nogui
Explanation:
-XX:+UseZGC: Enable Z Garbage Collector-XX:+ZGenerational: Use generational mode (separates young/old objects)-XX:ConcGCThreads=4: Background threads for GC (use 25% of CPU cores)-XX:ParallelGCThreads=8: Threads for pause-phase work (use 50% of cores)-XX:+AlwaysPreTouch: Initialize all RAM at startup (prevents mid-game allocation lag)
For servers with 24GB+ RAM:
java -Xms24G -Xmx24G \
-XX:+UseZGC \
-XX:+ZGenerational \
-XX:ConcGCThreads=6 \
-XX:ParallelGCThreads=12 \
-jar forge-server.jar nogui
Result: Your "Can't keep up" warnings will drop by 70-90%.
Server.properties Optimizations
Critical Settings
1. Disable Watchdog (Prevents False Crashes)
# Default (BAD for modded)
max-tick-time=60000
# Optimized
max-tick-time=-1
Why: ATM10's world generation can legitimately take 10+ seconds for a single tick (generating complex biomes). The watchdog thinks the server crashed and kills it. Disabling prevents false-positive shutdowns.
Warning: Only disable if you have other monitoring (e.g., external uptime checks). The watchdog exists to kill truly frozen servers.
2. Reduce Simulation Distance
# Default (causes lag in ATM10)
simulation-distance=10
# Optimized
simulation-distance=4
Impact:
- Distance 10: Server simulates 21x21 chunks = 441 chunks per player
- Distance 4: Server simulates 9x9 chunks = 81 chunks per player
Result: 81% reduction in active chunk processing. Players won't notice (mobs still spawn, farms still work within 4 chunks).
3. Reduce View Distance
# Default
view-distance=10
# Optimized
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).
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: ATM10 players typically use mods for mobs anyway (Alex's Mobs, etc.). Vanilla spawns are redundant.
Spigot.yml (For Mohist/Arclight Hybrid Servers)
If you're running ATM10 on a hybrid server (Forge + Bukkit plugins via Mohist/Arclight):
spigot.yml tweaks:
world-settings:
default:
mob-spawn-range: 4 # Match simulation-distance
entity-activation-range:
animals: 16
monsters: 24
raiders: 32
misc: 8
tick-inactive-villagers: false # Villagers far away don't think
merge-radius:
item: 4.0 # Dropped items merge if within 4 blocks
exp: 6.0
hopper-amount: 1 # Hoppers transfer 1 item/tick (instead of checking entire inventory)
Impact: 30-40% TPS improvement on servers with heavy entity counts.
Warning: Mohist/Arclight are experimental. Many ATM10 mods break with hybrid servers. Only use if you absolutely need Bukkit plugins (like CoreProtect for logging).
World Pre-Generation (The #1 Lag Fix)
Why Pre-Generation is Critical
Without pre-gen:
Player explores new area →
Server generates 20 chunks/second →
Each chunk: Calculate biome, place features, spawn structures →
CPU hits 100% →
TPS drops to 5 →
Everyone lags
With pre-gen:
Server pre-generates world during downtime (overnight) →
Player explores new area →
Server loads existing chunks from disk →
TPS stays at 20 →
Smooth gameplay
Benchmark:
- Pre-gen status: Player exploration = 2-5% CPU per player
- No pre-gen: Player exploration = 40-70% CPU per player
How to Pre-Generate with Chunky
Step 1: Install Chunky
Download Chunky mod (works on Forge):
# Place in server's /mods folder
wget https://cdn.modrinth.com/data/fALzjamp/versions/xxx/Chunky-Forge-1.21-x.x.x.jar \
-P ~/atm10-server/mods/
Step 2: Start Server and Configure
# Start server
java <your flags> -jar forge-server.jar nogui
# Wait for full boot (takes 5-10 minutes for ATM10)
In server console:
chunky world world
chunky shape square
chunky center 0 0
chunky radius 5000
chunky start
# Output:
# [Chunky] Task started for world. Radius: 5000 blocks
# [Chunky] Estimated time: 6 hours 23 minutes
Step 3: Monitor Progress
chunky progress
# Output:
# [Chunky] world | Elapsed: 45m 12s | ETA: 5h 38m
# [Chunky] Speed: 18.3 chunks/sec | 42% complete
Step 4: Pause When Players Join (Optional)
chunky pause
# Do your testing/gameplay
chunky continue
Recommended Radius:
| Player Count | Pre-Gen Radius | Approx. Time (Ryzen 7950X) | Disk Space |
|---|---|---|---|
| 1-5 players | 2,500 blocks | 1-2 hours | ~3GB |
| 6-15 players | 5,000 blocks | 6-8 hours | ~10GB |
| 16-30 players | 10,000 blocks | 20-30 hours | ~35GB |
| 30+ players | 15,000 blocks | 60-80 hours | ~75GB |
Pro Tip: Run pre-gen overnight before server launch. Once done, exploration lag disappears.
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: Use Create's own optimizations:
Edit serverconfig/create-server.toml:
[kinetics]
# Reduce tick rate for idle contraptions
idleTickRate = 40 # Default: 20 (tick every 2 seconds instead of every tick)
# Disable visual animations server-side (handled client-side)
serverAnimations = false
Result: 60% reduction in Create-related lag.
2. Refined Storage / Applied Energistics 2
Problem: Large storage networks recalculate every tick.
Solution - Refined Storage:
Edit refinedstorage.toml:
[controller]
# Increase update interval
updateInterval = 20 # Default: 10 (update every second instead of twice/second)
Solution - AE2:
In-game: Reduce autocrafting CPUs. Each CPU monitoring an auto-craft = tick overhead. Use Blocking Mode in interfaces instead of constant monitoring.
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, AT M10 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 drops idle TPS load by 40-70% on most ATM10 servers we host, 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.
Dimension-Specific Lag Fixes
ATM10 adds 10+ dimensions. Each dimension = separate world loading.
The Nether (Biggest Lag Source)
Problem: Nether's open caverns = massive empty space the server still tracks.
Solution: Limit Nether height in server.properties:
# This is a custom property (requires Paper/Purpur, not Forge)
# For Forge, use mods like "Height Limit" or "World Border"
Mod Alternative: Install World Border mod:
/worldborder set 5000 nether
# Limits Nether to 5k radius, prevents infinite exploration lag
Mining Dimension
Problem: Players strip-mine infinitely, generating millions of chunks.
Solution: Reset Mining Dimension weekly:
# Stop server
# Delete dimension folder
rm -rf world/mining_dimension
# 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 |
Result: Playable 15-18 TPS with occasional lag spikes.
Recommended (6-15 Players)
| Component | Specification | Cost (VPS) |
|---|---|---|
| CPU | Ryzen 7 7700X / 7800X3D | $60-80/month |
| RAM | 24GB | Included |
| Storage | 1TB NVMe | Included |
| Network | 1 Gbps | Included |
Result: Stable 20 TPS, rare lag during heavy exploration.
Ideal (16-30 Players)
| Component | Specification | Cost (Dedicated) |
|---|---|---|
| CPU | Ryzen 9 7950X / 9950X | $120-150/month |
| RAM | 64GB | Included |
| Storage | 2TB NVMe (RAID 1) | +$20/month |
| Network | 10 Gbps | Included |
Result: Locked 20 TPS, handles massive automation farms.
Why Ryzen over Intel for ATM10?
- Ryzen 7000/9000 series has higher single-core clock speeds (5.4-5.7 GHz boost)
- 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
# Install Spark mod
wget https://cdn.modrinth.com/data/spark/versions/xxx/spark-forge.jar \
-P ~/atm10-server/mods/
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:
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. Lag Goggles (Visual Lag Identification)
Shows lag in-game (highlights laggy blocks):
# Install LagGoggles
wget https://www.curseforge.com/minecraft/mc-mods/laggoggles/download/xxx \
-P ~/atm10-server/mods/
Usage:
- Press
Lin-game - Red/yellow blocks = laggy tile entities
- Fly around your base to find culprits
Example:
Lag Sources Found:
- Mekanism Digital Miner: 15ms/tick (DISABLE when not needed)
- Create Flywheel Array: 8ms/tick (reduce rotation speed)
- RFTools Builder (quarry): 12ms/tick (limit area)
Emergency Lag Response Plan
Your server is at 5 TPS right now. Here's the 5-minute fix:
Immediate Actions (Do in Order)
1. Check TPS
/tps
# Output: TPS from last 1m, 5m, 15m: 5.2, 8.1, 12.3
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:
# Kill all items on ground
/kill @e[type=item]
# Kill all hostile mobs
/kill @e[type=!player,type=!villager,type=!item_frame]
If "Mekanism" or "Create" is #1:
# Teleport to the chunk shown in Spark report
/tp @s <x> <y> <z>
# Break the offending machine (or use world edit to remove it)
4. Restart with ZGC
If you're still using G1GC, switch now:
# Update start script
nano start.sh
# Change to:
java -Xms16G -Xmx16G -XX:+UseZGC -XX:+ZGenerational -jar forge-server.jar nogui
5. Announce Restart
/say Server restarting in 60 seconds for lag fix
/stop
Result: TPS should recover to 15-18 immediately, 20 after pre-gen.
Long-Term Stability Strategy
Weekly Maintenance Checklist
Sunday 3 AM (Low Traffic):
# 1. Backup world
tar -czf backups/world-$(date +%Y%m%d).tar.gz world/
# 2. Clear entity buildup
# Start server, run:
/kill @e[type=item]
/kill @e[type=arrow]
# 3. Reset Mining Dimension
rm -rf world/mining_dimension
# 4. Check disk space
df -h
# If >80% full, delete old backups:
rm backups/world-2026012*.tar.gz
# 5. Restart server
/stop
./start.sh
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) | /kill @e[type=item] daily |
| 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 Ryzen 7950X tier |
Proven ATM10 Server Configs (Copy-Paste)
Startup Script (start.sh)
#!/bin/bash
# ATM10 Optimized Startup Script
# Hardware: 16GB+ RAM, Ryzen 7000+ or equivalent
java -Xms16G -Xmx16G \
-XX:+UseZGC \
-XX:+ZGenerational \
-XX:ConcGCThreads=4 \
-XX:ParallelGCThreads=8 \
-XX:+AlwaysPreTouch \
-XX:+DisableExplicitGC \
-XX:+UnlockExperimentalVMOptions \
-XX:G1MixedGCCountTarget=3 \
-XX:G1HeapRegionSize=32M \
-jar forge-server.jar nogui
Make executable:
chmod +x start.sh
./start.sh
server.properties (Optimized)
# Core Settings
server-port=25565
max-players=20
view-distance=8
simulation-distance=4
max-tick-time=-1
# 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
Mod Configs (serverconfig/)
create-server.toml:
[kinetics]
idleTickRate = 40
serverAnimations = false
maxBeltLength = 20
refinedstorage.toml:
[controller]
updateInterval = 20
ftbchunks-server.toml:
[general]
max_force_loaded_chunks = 4
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 | Expected Result |
|---|---|---|---|---|
| i5-12400 | CPU (low single-core) | Ryzen 7 7700X | $300 | +40% TPS |
| 8GB RAM | Memory (constant swapping) | 16GB | $60 | +200% TPS |
| SATA SSD | Disk I/O (chunk loading) | NVMe Gen3 | $80 | +30% TPS |
| Shared VPS | CPU steal time | Dedicated VPS | $50/mo | +100% TPS |
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 (biggest impact first):
- ✅ Enable Generational ZGC (30-50% TPS improvement)
- ✅ Pre-generate world with Chunky (40-60% reduction in lag spikes)
- ✅ Disable watchdog timeout (prevents false crashes)
- ✅ Reduce simulation/view distance (20-30% TPS improvement)
- ✅ Optimize Create/Mekanism configs (10-20% improvement if heavily used)
- ✅ Weekly entity cleanup (prevents long-term degradation)
- ✅ Upgrade hardware if still lagging (last resort)
Follow this guide step-by-step, and your ATM10 server will go from unplayable 5 TPS to smooth 20 TPS.
Need hosting optimized for heavy modpacks? Space-Node offers Ryzen 9000-series VPS with NVMe storage and ZGC pre-configured. Check our Minecraft Server Hosting Plans or read our Ryzen 7950X vs 9950X comparison.
Related Guides:
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.
