Tick rate and the main thread: why game servers want clock speed

How a game server simulates the world in ticks, why most of that work runs on one thread, and what that means for choosing hardware.

Game servers18 min readUpdated

Healthy: each tick fits in 50 ms, then the server sleeps6 ticks in 300 ms: 20 TPStick 1tick 2tick 3tick 4tick 5tick 6sleepOverloaded: every tick takes 62 ms, and each starts later5 ticks where 6 were due: about 16 TPStick 1tick 212 ms latetick 324 ms latetick 436 ms latetick 548 ms late050100150200250300 msWork in a tickSleep until the next tickPast the 50 ms budgetWhen a tick is dueHealthyeach tick fits, then sleeps: 20 TPSOverloaded: 62 ms ticks5 ticks where 6 were due: about 16 TPS12 ms late48 ms late0100200300 msWork in a tickSleepOver the budgetWhen a tick is due

In short

  • A game server moves its world forward in fixed steps called ticks. Minecraft aims for 20 a second, which gives each tick 50 milliseconds; Source games default to a 15 millisecond step, about 66 ticks a second.
  • Everything the world does in a tick, from reading player input to moving mobs and sending updates, runs in a set order, and most of it runs on one main thread. A tick cannot start until the one before it has finished.
  • When a tick takes longer than its budget, the next one starts late. The server manages fewer ticks per second and the game itself slows down, which players feel as lag even on a perfect connection.
  • Watch milliseconds per tick, not only ticks per second. An average under 50 can hide single ticks of several hundred milliseconds, and catching those is what tick monitors and profilers are for.
  • Because the busy part is one thread, a faster core keeps a busy server smooth where more cores do not. Extra cores run the helpers; for Minecraft the documentation puts that at three or four.
On this page
  1. A world that moves in fixed steps
  2. The budget: one second divided by the tick rate
  3. What fills the 50 milliseconds
  4. Why it all runs on one thread
  5. When a tick runs long
  6. A worked example: the evening the tick hit 62 milliseconds
  7. Measuring tick health
  8. What it means for choosing a server
  9. Mistakes that cost ticks
  10. Questions
  11. Sources

Twelve players on a Minecraft server, and something is off. Mobs stutter, crops take forever, the day seems to drag, and yet the control panel says the processor is 18% busy and every player's ping is fine. Nobody is attacking the server, and nothing is wrong with the network.

The number that explains it is not on the control panel: 50 milliseconds. That is how long the server has to work out everything that happens in the world before the next step is due, and on most game servers that work happens on a single thread. That budget, and the single thread that spends it, explain most game server lag and why a faster core fixes it where more cores do not.

A world that moves in fixed steps

According to the Minecraft Wiki, almost every game runs as one large loop, and each pass round it is a tick.2A game server is that loop with nobody watching. It takes the players' input, advances the world by one step, tells the players what changed, and goes round again. It draws nothing; the simulation is the whole job.

The important word is fixed. A game could measure how long its last step took and advance the world by that much, but Glenn Fiedler's well-known article on game loops explains why that goes wrong: a physics simulation behaves differently depending on the step size it is fed, and with large or uneven steps springs explode, fast objects pass through walls and players fall through the floor.1 His answer is to advance the simulation only in steps of one fixed size, so real time is consumed in whole steps. A fixed step is also what makes exact reproducibility possible, where the same inputs give the same result on every run.1

On a server, a fixed step means a fixed rate. Minecraft runs at 20 ticks per second, one every 50 milliseconds, and an in-game day is exactly 24,000 ticks, which is 20 minutes of real time.2 Valve's Source engine simulates in 15 millisecond steps by default, about 66.7 ticks a second. Each tick, the server works through the commands players sent, steps the physics forward, applies the game's rules and updates every object; only then does it work out which clients are due a new snapshot of the world.6

When a tick's work is done early, the server waits. The spark profiler's documentation gives the example of a Minecraft tick that takes 15 milliseconds, after which the loop sleeps for 35 before starting the next; without that sleep the game would run faster than intended.7 The illustration at the top of this page shows both cases: ticks that finish early and sleep, and ticks that never get to. The healthy durations in it are invented.

The budget: one second divided by the tick rate

The time a server has for each tick is 1,000 milliseconds divided by the tick rate. At 20 ticks a second that is 1,000 ÷ 20 = 50 milliseconds. At Source's default it is 15 milliseconds by definition. Counter-Strike 2 runs at 64 ticks a second (Valve's list adds "with Sub-tick"), a rate Valve later fixed so servers cannot change it, which leaves 1,000 ÷ 64 = 15.6 milliseconds. Community servers for its predecessor commonly ran at 64 or 128, and at 128 a tick gets 7.8.6

Ticks per secondTime for one tick20 per secondMinecraft50 ms30 per secondLeft 4 Dead 233.3 ms60 per secondCounter-Strike 1.616.7 ms64 per secondCounter-Strike 215.6 ms66.7 per secondTF2, Source default15 ms128 per secondCS:GO, community7.8 ms02550 ms
The time one tick gets at tick rates real games use, drawn to scale. Each bar is 1,000 milliseconds divided by the rate. Data: rates from the Valve Developer Community and the Minecraft Wiki; the budgets are derived.

Everything that happens in the world has to fit inside that number, on every tick, on the server's hardware. Choosing a tick rate is therefore choosing how much work each step can afford. Valve states the trade directly: raise the tick rate and the simulation gets more precise, but server and client alike need more processor time and more bandwidth.6 Doubling the rate halves the time per tick and doubles the number of ticks, so a server that was comfortable at 64 has to do each step of the same world in half the time at 128.

Tick rate is not the update rate

Two other rates get mixed up with the tick rate. The update rate is how often the server sends a player a snapshot of the world. In Source the client asks for one with cl_updaterate, 20 a second by default, and the server never sends more snapshots than it simulates ticks. The command rate is how often a client sends its input, usually 30 packets a second, each carrying input sampled at the server's tick rate.6

None of these rates changes how long a tick may take. They change how often its result travels, and how long it takes to travel is a matter of distance and routing, which the guide to server location and latency covers.

What fills the 50 milliseconds

The Minecraft Wiki lists what the Java Edition server does in each pass of its loop, in order.2Condensed, a tick runs the scheduled block and fluid ticks (a redstone repeater changing state and water that needs to flow both ask for these), then ticks every chunk near a player, which is where mobs spawn and where random ticks make crops grow and leaves decay. Then come block events, every entity, the block entities such as hoppers, and finally the players' network traffic: queued packets sent and incoming ones handled. Every 6,000 ticks, which is five minutes at 20 ticks a second, the tick also autosaves the world. Then the loop waits for the next tick.2For a mob, being ticked means running its AI and working out a path.7

In this order, every ticknext tick dueScheduled ticksredstone, fluids4 msChunksspawning, random ticks6 msEntitiesmobs, AI, pathfinding13 msBlock entitieshoppers and the like5 msPlayer packetsinput in, updates out4 msSleepuntil the next tick18 ms02550 msThis tick: 32 ms of work, then 18 ms asleep
One tick laid out in the order the Java Edition server runs it. The phases run back to back on one thread, and whatever is left of the 50 milliseconds is spent asleep. Illustration: the order is Minecraft's, the durations are invented.

The durations in the drawing are made up. What drives the cost of a tick is less the number of players than what is loaded and running around them. The wiki's list of usual suspects is hoppers that keep checking for items above them, redstone that causes floods of block and light updates, large numbers of mobs and their AI, and a raised random tick speed.2 Ten players standing at spawn keep one patch of the world busy. Ten players spread across the map, each beside an automatic farm, keep ten patches busy, and the server ticks all of them on every tick.

That points to a setting worth knowing in server.properties. simulation-distance, 10 chunks by default, is the radius around each player within which living entities are updated at all.3 Lowering it shrinks every player's patch, and with it the work in every tick.

Why it all runs on one thread

A Minecraft server does use more than one thread, but the tick is not one of the things it spreads out. PaperMC's troubleshooting guide names the tick loop as a major source of load and notes that it runs on one thread,11 and spark's documentation says a slow tick delays the next one because ticks cannot run in parallel.7 The Minecraft Wiki's hardware page puts a number on the rest: the other work spreads onto extra cores, but rarely more than three of them.5

Everything in a tick reads and writes the same world. A mob's path depends on the blocks around it, a hopper's contents depend on what the hopper above it did a moment earlier, and a redstone circuit depends on the order its parts update. That order is part of the game's rules: the wiki documents that scheduled block ticks run by priority and then in the order they were scheduled, with particular priorities for repeaters and comparators.2 Spread that work across threads and you either lock the shared data, which costs time, or let the result depend on which thread got there first, which breaks the machines players build.

Even work that looks independent can refuse to go faster. Factorio's developers once tried updating trains, the electric network and belts in parallel, three parts of their game that barely interact. The parallel version was slower than the original, because threads writing to memory that shared the same cache kept invalidating each other's copies.16

It can be done, at a price. Folia, a fork of the Paper server, splits the loaded world into independent regions of neighbouring chunks, each with its own tick loop, and runs them in parallel on a pool of threads, so no single main thread is left.14 Regions that touch must merge into one,15 so the design pays off on servers where players naturally spread out, such as survival and skyblock, with a sizeable crowd. The README's author expects every existing plugin to need changes and suggests at least 16 cores.14 When everyone gathers in one town, the regions around them merge, and that town is one thread's work again. The Minecraft Wiki warns that projects like this are complex and prone to bugs.5

ThreadShare of the time it is busyServer threadruns every tick100%, no sleep leftNetwork I/Oplayers' packets12%Chunk workersload and generate18%Chunk disk I/Oread and save6%Plugin taskswork off the tick8%Whole machine8 vCPUs, averaged18%Looks idle. The game is lagging anyway.
A lagging server seen thread by thread. The server thread that runs every tick is busy all the time; the helpers that handle the network, load and save chunks and run plugin work are mostly idle, so the machine as a whole looks lightly loaded. Illustration: the percentages are invented, and 18% is their sum divided by 8 vCPUs.

The drawing shows a trap that catches many owners. PaperMC notes that on a machine with many cores, a server held back by its tick loop can show little CPU use compared with what the machine has.11 One thread running flat out on an 8 vCPU server is 100 ÷ 8 = 12.5% of the machine. The control panel sees an idle box; the players see lag.

When a tick runs long

A tick that overruns is not cut short. It finishes, and the next one starts late. spark's documentation describes it as everything shifting to the right: fewer ticks fit into each second, and the game becomes less responsive.7 Because the game counts time in ticks rather than seconds, the world itself slows down. The Minecraft Wiki notes that nearly everything in the game is timed in ticks, so when TPS falls it all takes longer.2 Crops, mob movement and the day cycle all run late together.

Fiedler's article names what happens when a loop tries too hard to catch up: the spiral of death. If simulating a stretch of game time takes longer than that stretch of real time, the loop falls behind, runs extra steps to catch up, and falls further behind.1 He offers two ways out. Leave headroom, so the simulation normally needs much less time than it has and can catch up after a spike, or cap the number of steps and let the game run slower while the load lasts.1 Minecraft does a version of the second: the first thing its loop does is reset the schedule if the server has fallen two seconds behind, rather than chase ticks it can never make up.2

If one tick runs long enough, the server assumes it has hung. The vanilla watchdog, set by max-tick-time, stops the server once a single tick has taken 60,000 milliseconds, with a log line that reads "A single server tick took 60.00 seconds (should be max 0.05)".3 Paper prints a thread dump after 10 seconds without a response, and its documentation says this is a warning of severe lag, not a bug or a crash. The top of that stack trace shows where the main thread was stuck.11

Slow ticks and spikes are different problems

A server can lag in two ways. When every tick is a little too slow, TPS sinks and stays down. When most ticks are fine and a few take hundreds of milliseconds, TPS hardly moves and players still see freezes. spark's example is a server that spends 20 milliseconds on most ticks and occasionally 300 on one, which averages out to a healthy-looking number.7 Spikes are usually caused by something players did, and they need their own tools to catch.9

A worked example: the evening the tick hit 62 milliseconds

Take a survival server that runs at 20 TPS through the afternoon with an average tick of 28 milliseconds. It sleeps for the other 22, which is 44% of every tick, well above the 20% below which spark's documentation says a server is working hard.7 In the evening twice as many players are online, spread out across the map, and two new mob farms are running. The average tick rises to 62 milliseconds. The numbers are invented; the arithmetic is not.

At 62 milliseconds a tick the server completes 1,000 ÷ 62 = 16.1 ticks a second instead of 20, which is the bottom row of the illustration at the top of the page. An in-game day of 24,000 ticks now takes 24,000 ÷ 16.1, about 1,490 seconds, or just under 25 minutes instead of 20. The autosave every 6,000 ticks comes round every 6 minutes 12 seconds instead of every 5.2 Everything in the world runs at about 81% speed.

The budget for one tick at 20 TPS
50ms
The evening tick in this example
62ms
What the server manages: 1,000 ÷ 62
16.1TPS
The length of an in-game day
24.8min

Now compare what each fix does to that 62 millisecond tick.

What you changeThe tickResult
Add four more vCPUsStill 62 ms: the tick is one thread's work, and the new cores go to helpers that were not the bottleneck16.1 TPS
A core that gets through the same work 25% faster62 ÷ 1.25 = 49.6 ms20 TPS, with 0.4 ms to spare
Less work: a lower simulation distance and fixed farms, saving 15 ms62 - 15 = 47 ms20 TPS, with 3 ms to spare
Both47 ÷ 1.25 = 37.6 ms20 TPS, with 12.4 ms (25%) to spare

Only the last row gets back to Fiedler's headroom.1 A server that just fits its budget on an ordinary evening has nothing left for the moment twenty players fight a raid in the same place. Aim for an average tick that leaves a clear margin, and treat the speed of one core and the amount of work in the world as the two levers you actually have.

The spike that TPS hides

Now a different second on the same server. Nineteen ticks take 30 milliseconds each and one takes 400. The server needs 19 × 30 + 400 = 970 milliseconds for all 20, so it still completes 20 ticks in the second and reports 20 TPS. The average tick is 970 ÷ 20 = 48.5 milliseconds, under the budget. Yet for 400 milliseconds, eight ticks' worth of time, nothing in the world moved. Only the maximum tick time, or a high percentile, gives it away.

Measuring tick health

Ticks per second (TPS) says whether the server kept up. Milliseconds per tick (MSPT) says how close it came, which makes it the more useful number: a server can only hold 20 TPS while each tick takes 50 milliseconds or less on average.28 spark reports MSPT as a minimum, a median, a 95th percentile and a maximum, and the last two are where spikes show up.8

ToolWhere it runsWhat it tells you
/tick queryVanilla Java Edition 1.20.3 and later, operators with permission level 3The target rate, the average time per tick and its percentiles; it says the game "can't keep up with the target tick rate" when it is lagging.4
F3 debug screen, "ms ticks"Single player, or the player hosting a gameThe MSPT of the server built into the game, not of a dedicated server.2
/tps and /msptPaperTPS over 1, 5 and 15 minutes; average, lowest and highest MSPT over 5, 10 and 60 seconds. Paper now points you to spark instead.12
/spark tps, /spark healthspark, bundled with Paper since 1.21TPS, MSPT with percentiles, and CPU, memory and disk use.1013
/spark tickmonitorsparkA message for every tick over a threshold you set.9
/spark profilersparkWhich code the ticks spent their time in, as a report you can share.13

For spikes, the order matters. Run the tick monitor first: with --threshold-tick 50 it reports every tick over 50 milliseconds, the point at which the server starts catching up or lagging. Once you know how long the bad ticks are, start the profiler with --only-ticks-over set a little below that, so it records only the slow ticks and the normal ones cannot average the spike away.9

spark tpsspark tickmonitor --threshold-tick 50spark profiler start --only-ticks-over 150 --timeout 600

In a profile, the time the server thread spends waiting for the next tick is its sleep. spark's rule of thumb: under 20% sleep, the server is working hard; under 5%, it is probably lagging already and has nothing in reserve.7

Seeing the main thread from Linux

Outside the game, top shows the same picture if you ask it for threads. The -H option lists every thread on its own line instead of adding them up per process, and -p limits the view to the server's process.17 On a server that is out of tick time, one line sits near 100% while the others idle, just as in the thread drawing above.

pgrep -f 'paper.*\.jar'48211top -H -p 48211

If MSPT is healthy and players still complain, the tick is not the problem. Look at the path between them and the server instead, and keep in mind that a flood aimed at a game server feels like lag from the player's side too; the guide to why game servers get DDoS attacks explains why they are a favourite target.

What it means for choosing a server

The people who maintain the server software give the same advice. PaperMC says that past a certain point more cores bring no benefit, so look for strong single-thread performance, with no fewer than four threads for the server.11 The Minecraft Wiki also asks for strong single-core performance, and notes that the server rarely keeps more than three cores busy.5

Single-thread performance is the clock speed multiplied by how much work a core gets done per clock, helped by how often it finds its data already in cache. How those fit together, and why a boost clock describes one core rather than all of them, is covered in vCPU vs CPU core. The consequence for a game server is simple: of two processors, the one that runs a single thread faster runs your tick faster, whatever their core counts.

The other thing a tick needs is not to wait. On a VPS your vCPUs are scheduled onto physical cores shared with other guests, and a vCPU that is ready to run can wait for a core while someone else's work finishes, which Linux reports as steal time (the guide to what a VPS is shows how). Every one of those waits lands inside some tick and comes out of its budget. Cores allocated to you remove the wait, which matters most on a server whose tick is already close to its limit.

Put together, sizing a game server goes in this order:

  • The main thread first. Pick for the fastest single core you can get, not the largest core count.
  • Then enough cores for the helpers. Networking, loading and saving chunks, plugins and the operating system need their own. For Minecraft that is the three or four the documentation above describes, and a second server on the same machine needs its own set.
  • Cores that do not wait. If the tick is near its budget at busy times, allocated cores protect it from other people's peaks.
  • Headroom for the busiest evening. Size for the raid, not the average, and keep MSPT well under the budget.

The Minecraft calculator suggests a plan for your player count, and the server calculator covers other games. FiveM and RedM are sized differently, so there is no rule of thumb for them here: use the FiveM calculator.

Mistakes that cost ticks

The beliefWhat actually happens
"More cores will fix the lag."Only if the helpers were short of cores. The tick runs on one thread and takes as long as that thread needs.
"TPS is 20, so the server is fine."TPS is an average over a second. A 400 ms freeze can hide inside a 20 TPS reading; check the maximum MSPT.
"CPU use is 18%, so the processor is not the problem."One thread flat out on 8 vCPUs is already 12.5%. Look per thread, or at MSPT.
"A higher tick rate will make it smoother."Each tick gets less time, and the server needs more processor time and bandwidth. Valve also warns that a game run at a tick rate it was not designed for may not work as intended.6
"Lag always means the network."If MSPT is over budget, the server is out of time, and no route or ping fixes that. If MSPT is fine, then look at the network.
"The player count sets the load."Players matter mostly through what they load and build: farms, redstone, crowds of mobs, and how far apart everyone is.

Whatever dashboard you check, put MSPT and its maximum on it, not total CPU use.

Questions

What is a good TPS for a Minecraft server?

Twenty, the rate the game is built around. TPS can only stay at 20 while the average tick takes 50 milliseconds or less, so watch milliseconds per tick as well: a server averaging 45 ms reads 20 TPS but has almost no room left for a busy moment.

What is the difference between TPS and MSPT?

TPS counts how many ticks the server completed in a second. MSPT is how long each tick took to compute. TPS tells you the server has already fallen behind; MSPT tells you how close it is, and its maximum shows the spikes an average hides.

Does a higher tick rate reduce lag?

It makes the simulation finer, not the connection faster. A higher tick rate gives every tick less time and needs more processor time and bandwidth on both server and client, and it does nothing about the time packets spend travelling between a player and the server.

Why is my game server lagging when CPU usage is low?

Because the work that decides lag runs on one thread. One thread busy all the time on an 8 vCPU server reads as 12.5% of the machine, so the total looks idle while every tick runs out of time. Look at MSPT, or at per-thread use with top -H.

Do more cores help a game server?

Up to a point. Networking, chunk loading, saving and plugins use other cores, and PaperMC suggests giving a Minecraft server at least 4 threads. Beyond that the tick itself runs on one thread, and only a faster core or less work per tick makes it shorter.

Sources

  1. Fix Your Timestep!Glenn Fiedler, Gaffer On Games
  2. TickMinecraft Wiki (archived copy, September 2026)
  3. server.propertiesMinecraft Wiki (archived copy, September 2026)
  4. /tickMinecraft Wiki (archived copy, September 2026)
  5. Server/RequirementsMinecraft Wiki (archived copy, May 2026)
  6. Source Multiplayer NetworkingValve Developer Community (archived copy, August 2026)
  7. The Tick Loopspark documentation
  8. TPS and MSPTspark documentation
  9. Finding the cause of lag spikesspark documentation
  10. Command Usagespark documentation
  11. Basic troubleshootingPaperMC documentation
  12. CommandsPaperMC documentation
  13. ProfilingPaperMC documentation
  14. Folia (README)PaperMC on GitHub
  15. Folia: OverviewPaperMC documentation
  16. Friday Facts #215: Multithreading issuesFactorio blog
  17. top(1)procps manual, via the Arch manual pages
  18. AMD EPYC 4584PXAMD

Put it to work on a server of your own.

Size a server for your workload with the calculator, or see which plan fits the job you have in mind.