Matching Game Server Hardware to Player Count: CPU, RAM and Storage Decision Tables

Most over-provisioned game servers are bought to solve the wrong problem. A community that drops ticks at 90 players often upgrades from 8 to 16 cores, sees no change, and concludes the game is badly optimised. In practice the bottleneck was one thread at 4.1 GHz, or a save stall on a consumer NVMe, or 30 mods each holding their own object graph in a heap that was sized for vanilla. The tables below size hardware against the three axes that actually cap player count, with the decision rules spelled out so the first order is the right one.

Identify the Bottleneck Before You Buy

Run the node at your intended player count for a full session and read three signals. If tick rate falls while total CPU sits below 50%, you are single-thread bound and more cores will not help. If resident memory climbs toward the limit and the kernel starts reclaiming, you are capacity bound on RAM. If tick time spikes only during autosave windows, you are storage-latency bound. Each maps to a different purchase.

# Thread-level view: is one core pegged?
pidstat -t -p $(pgrep -f server.jar) 5 3

# Memory pressure and page reclaim
vmstat 5 10 | awk '{print $1,$2,$6,$7}'   # free, si, so

# Save-stall detection: watch write latency, not throughput
iostat -x 5 | egrep 'Device|nvme' | awk '{print $1,$2,$NF}'

Decision Table 1: Players to CPU

Player band Game class vCPU Min sustained clock What caps you first
1-10 Any 2-4 3.6 GHz Nothing, comfort build
11-32 Vanilla / light mods 4-6 4.0 GHz World tick
33-64 Modded survival 6-8 4.3 GHz Main thread + GC pauses
65-120 Modded / ARK / Rust 8-12 4.5 GHz Single thread, unavoidable
120+ Any single instance Shard, do not scale 4.5 GHz per node Architecture, not silicon

The clock column is the one to defend in negotiations. A 16-core 3.2 GHz EPYC loses to an 8-core 4.6 GHz part on tick rate for every Minecraft, Valheim, and ARK workload in the table, because the simulation loop is serial. Ask for the sustained all-core turbo figure, not the marketing boost number, and ask what happens under AVX-512 load — some Xeons drop to 2.4 GHz on heavy vector workloads, which includes parts of some survival servers’ pathfinding.

Decision Table 2: Players to RAM

Player band Vanilla Light mods (1-15) Heavy mods (15+) Headroom rule
1-10 4 GB 6 GB 8 GB +2 GB for OS
11-32 8 GB 12 GB 16-20 GB 20% free at peak
33-64 12 GB 20 GB 32 GB 20-25% free at peak
65-120 16-20 GB 32 GB 48-64 GB 25% free at peak
Extra instance +6 GB +12 GB +20 GB Per map, not per player

Per-player heuristics help sanity-check the table: budget roughly 0.4-0.6 GB per player for vanilla Minecraft and 1.5-2.5 GB for a 180-mod pack, because each mod retains its own entity and recipe graph regardless of population. For ARK the map itself dominates: a cluster instance holds the entire terrain and dino population resident even with three players online. That is why the last row is per map, not per player — five-map clusters need 30-100 GB before anyone connects.

One JVM detail that fools people: heap size is not the same as resident memory. Set -Xmx no higher than about 75% of node RAM and leave room for off-heap buffers, GC structures, and the page cache. Allocating the full node to -Xmx produces swap stalls under GC pressure, which look exactly like a CPU bottleneck.

Decision Table 3: Players to Storage

Band Media Min 4K random write Redundancy Failure symptom if undersized
1-10 SATA SSD 20k IOPS None acceptable Save hitch, 200-800 ms
11-32 NVMe 100k IOPS Weekly snapshot Autosave freezes
33-64 NVMe 200k IOPS RAID 1 World corruption on power loss
65-120 NVMe, PLP 400k IOPS RAID 1 or 10 Multi-second save stalls at scale
Any backup tier HDD N/A Offsite Restore window, not gameplay

Power-loss protection (PLP) on the drives matters more than raw throughput for survival servers. Without it, the drive’s write cache can be lost mid-save after a power event, and the result is a world file that loads with half its structures missing. For Rust and 7 Days to Die specifically, map save size grows with player-built structures — a fresh map is tens of megabytes, a month-old wiped-ready map is several hundred — so sequential throughput starts to matter by week three.

Combining the Axes Into One Purchase

Build the specification from the strictest axis, then check the other two are not further constrained. A 100-player modded Minecraft node needs 12 vCPU at 4.5 GHz, 64 GB, and 400k IOPS NVMe. Buying 24 slower cores with 128 GB and SATA SSD fails on all three counts while looking bigger on a spec sheet. The rule: pick CPU clock from Table 1, confirm RAM from Table 2, then confirm storage from Table 3, and reject any quote that trades clock for cores.

Validate Before You Commit to a Term

Tables are a starting point. Load test with real players on a real world, incrementing in steps of 20, and record MSPT or tick rate at each step. A shard sitting at 60% CPU with falling tick rate is already full; one at 90% CPU with flat tick rate is not. Run at least one six-hour session to catch memory growth from entity accumulation, and check whether the save window still completes in under 15% of your tick budget at peak population.

If you cannot run the test on a demo instance, ask the provider for a short-term test slot — most will give 24-48 hours on the tier above your target. That test is worth more than any benchmark chart. When you are ready to compare configurations, the dedicated server hosting options page lists clock speeds and storage classes side by side, and hosting reviews on bare metal and game nodes show which providers actually deliver the sustained turbo figure they advertise.

The Order of Spending

Rank upgrades by effect on the bottleneck: sustained single-thread clock first, then RAM headroom to the 25% mark, then NVMe with power-loss protection, then core count for auxiliary services. Only after all four are satisfied does sharding become cheaper than scaling up. Most communities spend in the reverse order and pay twice for the same lesson.

Leave a Reply