Players report lag minutes after it starts. By the time the first complaint lands in Discord, the damage is already done — the raid wiped, the match was lost, the reviews are written. The teams that avoid this are not running better hardware; they are watching the right numbers and acting on them before the symptoms reach a human.
This guide covers the metrics that actually predict game server lag, the thresholds that matter, and how to wire up alerting that fires on leading indicators instead of outages.
Why CPU Percentage Is a Useless Metric
A server at 30% CPU can be lagging badly if that 30% is one saturated core running the main simulation thread. An average across all cores hides exactly the failure mode you care about. Likewise, memory percentage tells you nothing about whether the JVM is spending its time in garbage collection.
Game servers are latency-sensitive, single-thread-bound workloads. You need per-thread and per-event metrics, not host averages.
The Metrics That Actually Predict Lag
| Metric | What it predicts | Warning threshold | Critical |
|---|---|---|---|
| Tick time (mean) | General simulation health | 70% of tick budget | >100% of budget |
| Tick time (p99) | The spikes players actually feel | 2x mean | 3x mean |
| Per-core saturation | Single-thread ceiling | 80% on main thread core | 95% sustained |
| GC pause time | Periodic freezes | >50 ms | >200 ms |
| Disk p99 latency | Chunk load and save stalls | >10 ms | >30 ms |
| Network jitter | Rubber-banding | >5 ms | >15 ms |
| Packet loss | Disconnects and desync | >0.1% | >1% |
| Player count | Load context for everything above | Baseline +30% | Capacity limit |
If you only track three of these, track tick time p99, GC pause time, and disk p99 latency. Those three catch the vast majority of lag incidents before players notice anything.
Leading vs Lagging Indicators
An outage alert is a lagging indicator — it tells you the bad thing already happened. You want alerts that fire while there is still time to act.
- Lagging: server offline, players disconnected, error rate spike, support ticket volume.
- Leading: tick time p99 trending up over 15 minutes, GC pause frequency increasing, disk p99 drifting upward, entity count growing without a matching player increase.
Leading indicators give you minutes. Minutes are enough to pre-generate chunks, kick a memory leak, restart a service during a lull, or warn players before a match starts rather than after it ends.
Setting Thresholds Without Crying Wolf
Static thresholds fail because they do not account for your baseline. A tick time of 35 ms is fine on a 20 Hz server and catastrophic on a 128 Hz one. Build thresholds relative to your own measured baseline instead.
- Measure your normal p99 tick time during a typical peak for two weeks.
- Set warning at baseline x 1.5 and critical at baseline x 2.5.
- Add a duration requirement — a 10-second spike is noise, a 5-minute drift is a trend.
- Alert on the combination, not the single metric: tick up AND GC up means memory; tick up AND disk up means I/O.
That last point is where telemetry becomes diagnostic. Correlated metrics tell you what to fix; isolated metrics just tell you something is wrong.
What to Instrument on the Server Itself
| Source | Example data | Tooling |
|---|---|---|
| Game engine | Tick time, entity count, chunk loads | Built-in stats endpoint or plugin |
| JVM / runtime | Heap usage, GC pauses, thread states | JMX, runtime-specific exporters |
| Host OS | Per-core CPU, load, steal time | Standard system metrics |
| Disk | IOPS, queue depth, p99 latency | OS-level device stats |
| Network | Packets/sec, loss, jitter, retransmits | Interface counters, synthetic probes |
| Player-side | Reported ping, FPS, disconnect reasons | Client policy or survey |
The player-side row matters more than it looks. Server-side tick time can be perfect while player-reported ping climbs because of an upstream routing change. Blaming your hardware for a network problem wastes hours; the correlation test is whether all players in one region report issues while local players are fine.
A Minimal Dashboard You Can Build Today
- Row 1 — health: tick time mean and p99, players online, uptime.
- Row 2 — resource: per-core saturation, RAM used, GC pause time.
- Row 3 — storage: disk p99 latency, queue depth, free space.
- Row 4 — network: packets/sec, loss, jitter, retransmits.
- Row 5 — trends: all of the above over 7 and 30 days to spot slow drift.
The 30-day view is what catches the slow problems: memory leaks, growing world size, an entity count that has crept up 40% since last month. Those never trip a threshold in a single day, but they are exactly the things that turn into an outage three weeks later.
When Telemetry Says “Buy More Hardware”
Telemetry also tells you when tuning is done. If per-core saturation on the main thread sits above 90% at peak with no optimisation left to make, the answer is a faster core, not a longer config session. If disk p99 stays high after confirming you are on NVMe, the answer is a mirrored array or a faster drive. If steal time is non-zero, the answer is leaving virtualized hosting entirely.
That last signal is the clearest one there is: steal time means another tenant is using your CPU. No amount of tuning fixes it. It is the point to compare dedicated server configs and move to bare metal where the cores are yours.
Bottom Line
Track tick time p99, GC pauses, and disk latency as your first three metrics. Alert on trends with duration, not on single spikes. Correlate metrics to diagnose instead of guessing. And when the numbers say you are hardware-bound, believe them — players will notice within minutes of the first spike whether or not you were watching.
Ready to move? Use our dedicated server hosting partner to size a bare metal box for your player count.



Leave a Reply
You must be logged in to post a comment.