All posts

Ryzen 9000 vs EPYC vs Xeon for game servers

Minecraft's tick budget is 50 ms, on one server thread. A Ryzen 9 9950X bases at 4.3 GHz and an EPYC 9555P at 3.2, and the MSPT cells are blank.

Written by NodeRings Inc.

NodeRings Inc. writes these notes. The company runs the marketplace and the agent that stays on the provider’s side of the hypervisor.

A Minecraft server is trying to finish a tick in 50 ms. Spark's TPS page calls 20 ticks a second the lag-free line, and 50 ms is the whole budget for one of them. The tick loop page draws that work as a queue on the server thread: the next tick starts when this one finishes. Extra cores can keep the machine busy with other jobs. The queue still runs on the server thread.

A Ryzen 9 9950X and an EPYC 9555P are both chips a host can print on a plan, and AMD's own pages give them different jobs. The 9950X is a Ryzen 9000 desktop part, Zen 5, 16 cores and 32 threads, a 4.3 GHz base and a boost up to 5.7 GHz. The 9555P is an EPYC 9005 server part, 64 cores and 128 threads, a 3.2 GHz base, an all-core boost of 4.2 GHz, and a max boost up to 4.4 GHz. Xeon is the third word on the same shopping list, and it is a family. A row that says Xeon still needs the SKU.

The MSPT column is empty on purpose. Filling it means one Paper world, at 0 bots and at 10, on three rented parts, with lscpu naming the chip. Those rentals were left unbought. This machine is a KVM guest. A tick test here would be a nested result, and nested results stay out of that column.

PartCores / threadsBase clockMSPT at 10 bots
Ryzen 9 9950X16 / 324.3 GHzblank
EPYC 9555P64 / 1283.2 GHzblank
Xeon, whichever SKU the listing namesthe catalog rowthat row's baseblank
This guest, i7-1185G7E under KVM8 / 8the model string says 2.80 GHzblank
Base-clock bars for a Ryzen 9 9950X at 4.3 GHz and an EPYC 9555P at 3.2 GHz, with the Xeon row left blank
Published base clocks. AMD also lists a boost, up to 5.7 GHz on the 9950X and up to 4.4 GHz on the 9555P. The Xeon row stays blank until a listing names the SKU. A tick time would be an MSPT, and that column is blank.

Why the tick is one thread

Spark's profile view calls the queue the server thread. Its healthy example spends 15 ms doing the tick and sleeps the other 35, so the next tick still starts on the 50 ms mark. When the server is healthy, waitForNextTick() is most of that thread. The same page treats a sleep share under 20% as a server working hard, and a sleep share under 5% as a server with the spare time gone. When a tick runs long, the next one waits, and the ticks per second fall. Median MSPT and the 95th percentile are the two summaries /spark tps adds on top of the minimum and the maximum. Those readings come from a profile. This guest has none.

The same shape is already written down for two other games on this site. The Satisfactory dedicated server page asks for a single-thread rating of 2000 or higher, says the process uses several cores and still favors single-core speed, and names kvm64 as a CPU model that fails in a VM. The ARK Survival Ascended manual recommends 4 logical cores per instance and keeps gameplay on one thread, with physics as the exception. A second map is a second process, and each of those processes still has one gameplay thread.

A Paper guest started with qemu -smp 2 shows the other half of the shopping mistake. The 2 in that command is a count of vCPUs. The post measured a heap. The command carried that count, and the chip name was absent.

What 8 vCPU is counting

Dedicated CPU plans pin physical cores to the VM. On a host with SMT, one physical core presents two threads, and an 8 vCPU dedicated plan is 4 of those cores, both threads included. The page's picture is an EPYC 9654: 96 physical cores, 192 threads with SMT on, and a DC-CPU-8C plan pins 4 cores. The catalog lists that 9654 at a 2.4 GHz base. Ninety-six cores and a 2.4 GHz base are the same part. A tick that lives on one thread feels the clock. The other cores are capacity for everyone else's server on that box, or for the rest of your process, depending on who the cores are pinned to.

A shared plan is the other product. Its vCPUs are scheduled across host cores the provider may sell more than once. The dedicated page is where that split is written. A stopped dedicated VM still holds the cores it pinned. Deleting the VM is what gives them back. For a tick-bound game, the useful dedicated plan is the one whose tag is the SKU, with the core count written beside it.

Four physical cores with two threads each, labeled as an 8 vCPU dedicated plan, and one thread marked as the server thread
How an 8 vCPU dedicated plan maps onto an SMT host, from the dedicated CPU docs. One of those threads is the server thread Spark profiles. This drawing is that SMT case. lscpu on this guest reports one thread per core.

Game-compute plans in that catalog are exact SKUs. The templates it names include DC-GS-9950X. The 9950X row is game compute, base 4.3 GHz, and it is absent from the general server-grade columns. The 9555P row is the reverse: server grade, base 3.2 GHz, and absent from the game-compute column. High-frequency plans use that base clock. Boost is a different number, and the catalog says the high-frequency test ignores it.

The two lines lscpu printed

lscpu on this guest is the check a buyer can run after the VM exists. The model line and the BIOS line disagree, and the hypervisor line says why.

Model name:                              11th Gen Intel(R) Core(TM) i7-1185G7E @ 2.80GHz
BIOS Model name:                         pc-q35-8.1  CPU @ 2.0GHz
BIOS Vendor ID:                          QEMU
Hypervisor vendor:                       KVM
Virtualization type:                     full
CPU(s):                                  8
Thread(s) per core:                      1
Core(s) per socket:                      8
Socket(s):                               1
lscpu on a KVM guest: model name i7-1185G7E at 2.80 GHz, BIOS model pc-q35-8.1 at 2.0 GHz, eight CPUs, one thread per core
One guest, two names. The model string is an i7-1185G7E at 2.80 GHz. The BIOS string is a QEMU machine type at 2.0 GHz. The hypervisor vendor is KVM.

Eight CPUs and one thread per core means the guest presents eight cores. The catalog page says laptop and mobile parts are left out of the table, and the i7-1185G7E string is absent from the model list on that page. A plan tag that repeated this model line would be naming a guest identity, plus a QEMU BIOS string that is a machine type. The Ryzen, the EPYC, and the Xeon are still unnamed.

What hosts print on the plan page

The catalog page lists 778 models, and the Xeon entries are separate rows. An Intel Xeon 6325P is listed at a 3.5 GHz base, a 6349P at 3.6, and a 6315P with the base cell left empty.

Shockbyte's hardware page currently prints "Up to AMD EPYC 4465P @ Max 5.40 GHz". The catalog lists that 4465P at a 3.4 GHz base. Max and base are the two clocks from the previous section, now sitting on a public plan page. An AMD case study about the same company names a Ryzen 7700, then EPYC 4464P and 4545P, then a 64-core 9555P, and it quotes them calling single-thread performance the indicator they watch for games. Those are names from two pages, a fleet story. A tick time on one world is the blank MSPT column, and the benchmark scores in that case study stay off this page.

A CPU catalog tag should be the part, the way DC-GS-9950X already is. A filter that only says 8 vCPU, or only says Xeon, still hides the SKU the MSPT column is waiting on.

Which CPU should a game server use?

The one named on the plan, with a clock the tick can use. A 9950X is 16 cores at a 4.3 GHz base. A 9555P is 64 cores at a 3.2 GHz base. The MSPT that would rank them on one world is blank here.

What does MSPT mean?

Milliseconds per tick. Spark treats 50 ms as the budget for 20 ticks a second. Median and 95th percentile sit next to the minimum and the maximum in /spark tps.

How do I check the CPU after I buy?

Run lscpu. Read Model name, BIOS Model name, and Hypervisor vendor. On this guest those three lines are an i7-1185G7E, a QEMU machine type, and KVM.

Why is the Xeon row empty?

Xeon is a family in the catalog, one SKU per row, and the base clocks differ. A listing that stops at the word Xeon still owes you the SKU.