{"id":1489,"date":"2026-10-25T22:58:34","date_gmt":"2026-10-25T22:58:34","guid":{"rendered":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/?p=1489"},"modified":"2026-10-25T22:58:34","modified_gmt":"2026-10-25T22:58:34","slug":"game-server-clock-sync-tick-drift-ntp","status":"publish","type":"post","link":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/","title":{"rendered":"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool"},"content":{"rendered":"<p class=\"wp-block-paragraph\">A game server keeps three different clocks and quietly assumes they agree. The monotonic clock drives the tick loop, the wall clock stamps logs and bans, and the NTP-disciplined system clock is what every external system believes. When they drift apart, the symptoms look unrelated: cooldowns that expire early, ban timestamps in the future, scheduled events that fire twice, and anti-cheat replays that fail to correlate against server logs.<\/p>\n<p class=\"wp-block-paragraph\">Drift is not a rare fault. A default Linux install with no time daemon can wander hundreds of milliseconds a day on a busy VM, and a hypervisor that pauses a guest for live migration can jump the clock forward by seconds at a time. This article explains where the skew comes from, how to measure offset properly, and how to choose a tolerance per game genre.<\/p>\n<h2 class=\"wp-block-heading\">Why game servers care about offset at all<\/h2>\n<p class=\"wp-block-paragraph\">Most gameplay timers are counters, not timestamps, so a 100-millisecond offset is invisible. Problems start when timestamps cross a system boundary: a matchmaking service checks a cooldown by comparing a stored epoch to its own clock, an admin tool auto-unbans at a specific time, a replay parser aligns client events against server events. Each of those is a comparison between two machines.<\/p>\n<p class=\"wp-block-paragraph\">The second class of problem is correlation. When a player appeals a ban, the only evidence is a log line with a timestamp. If the game server is 40 seconds ahead of the auth service, the timeline reconstructs incorrectly and the appeal becomes an argument rather than a check.<\/p>\n<h2 class=\"wp-block-heading\">Sources of drift on a game node<\/h2>\n<p class=\"wp-block-paragraph\">The oscillator is the first source: a typical commodity crystal is accurate to about 50 parts per million, which is roughly 4.3 seconds per day before any correction. Datacenter temperature changes make that worse, and a rack that runs hot in the afternoon will drift differently than one that does not.<\/p>\n<p class=\"wp-block-paragraph\">Virtualisation adds two more. Clock interrupts are tickless and may be coalesced, so a guest&#8217;s clock can lag under heavy steal time; and live migration, snapshots, and host suspend can step the clock discontinuously. A bare-metal node avoids most of this \u2014 but only if its own time daemon is actually running and reachable.<\/p>\n<h2 class=\"wp-block-heading\">Measuring offset with chronyc and ntpq<\/h2>\n<p class=\"wp-block-paragraph\">If the node runs chrony, <code>chronyc tracking<\/code> gives the current offset against the selected source, plus the estimated frequency error and the root delay of the path to the reference. A healthy node sits under one millisecond on a wired datacenter path; anything persistently above ten milliseconds deserves investigation.<\/p>\n<p class=\"wp-block-paragraph\">On systems still running classic ntpd, <code>ntpq -p<\/code> lists peers with an offset column in milliseconds. Check the reach register: a peer showing <code>377<\/code> is fully reachable, while anything less means recent packets were lost and the offset figure is stale rather than measured.<\/p>\n<pre class=\"wp-block-code\"><code># chrony: current offset and frequency error\n$ chronyc tracking\nReference ID    : 8A3C1B22 (ntp1.example.net)\nSystem time     : 0.000412 seconds fast of NTP time\nLast offset     : +0.000388 seconds\nRMS offset      : 0.000621 seconds\nFrequency       : 12.431 ppm slow\nRoot delay      : 0.002145 seconds\n\n# classic ntpd peers; reach 377 = fully reachable\n$ ntpq -p\n     remote           refid      st t when poll reach   delay   offset  jitter\n*ntp1.example.net  .GPS.        1 u   41   64  377    0.412   +0.388   0.221\n+ntp2.example.net  .PPS.        1 u   33   64  377    0.531   -0.204   0.310\n\n# independent drift measurement over 600 s (ppm = delta_ms \/ 600000 * 1000)\n$ o0=$(ntpdate -q pool.ntp.org | tail -1 | awk '{print $9}'); t0=$(date +%s)\n$ sleep 600\n$ o1=$(ntpdate -q pool.ntp.org | tail -1 | awk '{print $9}')\n$ awk -v a=$o0 -v b=$o1 -v dt=$(($(date +%s)-t0)) 'BEGIN{printf \"drift %.1f ppm\\n\",(b-a)\/dt*1e6}'\n\n# per-source frequency and skew\n$ chronyc sourcestats -v | head -12<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Trust the frequency estimate more than any single offset sample. A node showing 12 ppm slow will accumulate about one second of error per day if correction stops, which tells you how quickly it will matter if the daemon dies.<\/p>\n<h2 class=\"wp-block-heading\">Pick an NTP pool topology that does not fight you<\/h2>\n<p class=\"wp-block-paragraph\">Point the node at four sources from two different operators, or at your provider&#8217;s own time service plus two public sources. A single-source configuration cannot detect a falseticker, and a provider time service adds a very short network path, which lowers the noise floor that limits achievable accuracy.<\/p>\n<p class=\"wp-block-paragraph\">Prefer authenticated sources where available. NTP without authentication is spoofable, and on a game node a forged time packet can move ban-expiry logic. If you cannot authenticate, restrict the daemon to specific source addresses and alert on changes to the selected reference ID.<\/p>\n<h2 class=\"wp-block-heading\">Tick timers that should not depend on wall clock<\/h2>\n<p class=\"wp-block-paragraph\">Anything measured in elapsed time \u2014 cooldowns, spawn intervals, anti-cheat rate windows \u2014 should use the monotonic clock, which never steps backward. Engines that use a wall-clock delta for the tick loop will produce a burst of catch-up ticks the moment NTP corrects a large offset, which players experience as a one-second teleport.<\/p>\n<p class=\"wp-block-paragraph\">Use <code>CLOCK_MONOTONIC<\/code> or the language equivalent for every interval and reserve wall time for display, logging, and persistence. Where a persisted timestamp must be compared later, store the wall time plus the measured offset at write time so the comparison can be corrected retroactively.<\/p>\n<h2 class=\"wp-block-heading\">Acceptable offset by genre and tick rate<\/h2>\n<p class=\"wp-block-paragraph\">Tolerance is set by how much timestamp precision affects cross-system decisions, not by tick rate alone. A 128-tick shooter has very precise in-engine timing but almost no cross-system dependency on wall clock, while a management game with an auction house can tolerate a slow tick but not sloppy absolute time.<\/p>\n<p class=\"wp-block-paragraph\">Set alert thresholds three to five times above the tolerance so one noisy sample does not page anyone. Page on sustained offset over several minutes, or on a frequency error that implies fast drift, rather than on an instantaneous reading.<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<thead>\n<tr>\n<th>Genre \/ use case<\/th>\n<th>Tick rate<\/th>\n<th>Acceptable offset<\/th>\n<th>Alert above<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Competitive FPS<\/td>\n<td>64\u2013128 Hz<\/td>\n<td>&lt; 5 ms<\/td>\n<td>20 ms<\/td>\n<\/tr>\n<tr>\n<td>Battle royale \/ matchmaking<\/td>\n<td>20\u201330 Hz<\/td>\n<td>&lt; 10 ms<\/td>\n<td>30 ms<\/td>\n<\/tr>\n<tr>\n<td>Survival sandbox<\/td>\n<td>20 Hz<\/td>\n<td>&lt; 50 ms<\/td>\n<td>150 ms<\/td>\n<\/tr>\n<tr>\n<td>MMO with auction house<\/td>\n<td>10\u201320 Hz<\/td>\n<td>&lt; 20 ms<\/td>\n<td>60 ms<\/td>\n<\/tr>\n<tr>\n<td>Bans, appeals, audit logs<\/td>\n<td>n\/a<\/td>\n<td>&lt; 20 ms<\/td>\n<td>50 ms<\/td>\n<\/tr>\n<tr>\n<td>Async \/ management sim<\/td>\n<td>1\u20135 Hz<\/td>\n<td>&lt; 250 ms<\/td>\n<td>1 s<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2 class=\"wp-block-heading\">Monitoring drift as a metric, not a one-off check<\/h2>\n<p class=\"wp-block-paragraph\">Export offset, frequency error, and source count from every node into your metrics pipeline and graph them next to tick time. Drift correlates with hypervisor pressure: a node whose clock suddenly starts wandering is often a node whose host is oversubscribed or being migrated, which will affect tick stability in the same window.<\/p>\n<p class=\"wp-block-paragraph\">Keep a graph of offset-minus-offset-one-hour-ago; a step change of more than a few milliseconds identifies clock steps the daemon smoothed over and that other systems will see as a discontinuity. Review it after every host maintenance window, since that is when steps occur. For bare-metal hardware where clock discipline and tick stability both depend on uncontended cores, see the <a href=\"https:\/\/bestdedicatedwebhostingserver.com\/#providers\">game-ready configurations with measured clock and storage details<\/a> and the broader <a href=\"https:\/\/bestdedicatedwebhostingserver.com\/\">hardware notes for sustained game workloads<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A game server keeps three different clocks and quietly assumes they agree. The monotonic clock drives the tick loop, the wall clock stamps logs and bans, and the NTP-disciplined system&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1,"footnotes":""},"categories":[13,14],"tags":[],"class_list":["post-1489","post","type-post","status-publish","format-standard","hentry","category-game-server-setup","category-hardware-tuning"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool - Best Dedicated Web Hosting Server Blog<\/title>\n<meta name=\"description\" content=\"A game server keeps three different clocks and quietly assumes they agree. The monotonic clock drives the tick loop, the wall clock stamps logs and bans,\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool\" \/>\n<meta property=\"og:description\" content=\"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool\" \/>\n<meta property=\"og:url\" content=\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/\" \/>\n<meta property=\"og:site_name\" content=\"Best Dedicated Web Hosting Server Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-25T22:58:34+00:00\" \/>\n<meta name=\"author\" content=\"bestdedicatedwebhostingserver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bestdedicatedwebhostingserver\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"bestdedicatedwebhostingserver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/\",\"url\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/\",\"name\":\"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool - Best Dedicated Web Hosting Server Blog\",\"isPartOf\":{\"@id\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#website\"},\"datePublished\":\"2026-10-25T22:58:34+00:00\",\"author\":{\"@id\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#\/schema\/person\/6eb5f9ea35033fe8e67df44397e089b1\"},\"description\":\"A game server keeps three different clocks and quietly assumes they agree. The monotonic clock drives the tick loop, the wall clock stamps logs and bans,\",\"breadcrumb\":{\"@id\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#website\",\"url\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/\",\"name\":\"Best Dedicated Web Hosting Server Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#\/schema\/person\/6eb5f9ea35033fe8e67df44397e089b1\",\"name\":\"bestdedicatedwebhostingserver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/462a07aa37399bdb149e5f91dc3cd8906656bc4c7ed391a3b6f0199c5d2ab964?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/462a07aa37399bdb149e5f91dc3cd8906656bc4c7ed391a3b6f0199c5d2ab964?s=96&d=mm&r=g\",\"caption\":\"bestdedicatedwebhostingserver\"},\"sameAs\":[\"https:\/\/bestdedicatedwebhostingserver.com\/blog\",\"https:\/\/x.com\/bestdedicatedwebhostingserver\"],\"url\":\"https:\/\/bestdedicatedwebhostingserver.com\/blog\/author\/bestdedicatedwebhostingserver\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool - Best Dedicated Web Hosting Server Blog","description":"A game server keeps three different clocks and quietly assumes they agree. The monotonic clock drives the tick loop, the wall clock stamps logs and bans,","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/","og_locale":"en_US","og_type":"article","og_title":"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool","og_description":"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool","og_url":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/","og_site_name":"Best Dedicated Web Hosting Server Blog","article_published_time":"2026-10-25T22:58:34+00:00","author":"bestdedicatedwebhostingserver","twitter_card":"summary_large_image","twitter_creator":"@bestdedicatedwebhostingserver","twitter_misc":{"Written by":"bestdedicatedwebhostingserver","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/","url":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/","name":"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool - Best Dedicated Web Hosting Server Blog","isPartOf":{"@id":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#website"},"datePublished":"2026-10-25T22:58:34+00:00","author":{"@id":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#\/schema\/person\/6eb5f9ea35033fe8e67df44397e089b1"},"description":"A game server keeps three different clocks and quietly assumes they agree. The monotonic clock drives the tick loop, the wall clock stamps logs and bans,","breadcrumb":{"@id":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/game-server-clock-sync-tick-drift-ntp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Clock Drift on Game Servers: Why Tick Timers Skew and How to Measure Offset Against an NTP Pool"}]},{"@type":"WebSite","@id":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#website","url":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/","name":"Best Dedicated Web Hosting Server Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#\/schema\/person\/6eb5f9ea35033fe8e67df44397e089b1","name":"bestdedicatedwebhostingserver","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/462a07aa37399bdb149e5f91dc3cd8906656bc4c7ed391a3b6f0199c5d2ab964?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/462a07aa37399bdb149e5f91dc3cd8906656bc4c7ed391a3b6f0199c5d2ab964?s=96&d=mm&r=g","caption":"bestdedicatedwebhostingserver"},"sameAs":["https:\/\/bestdedicatedwebhostingserver.com\/blog","https:\/\/x.com\/bestdedicatedwebhostingserver"],"url":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/author\/bestdedicatedwebhostingserver\/"}]}},"_links":{"self":[{"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/posts\/1489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/comments?post=1489"}],"version-history":[{"count":1,"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/posts\/1489\/revisions"}],"predecessor-version":[{"id":1490,"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/posts\/1489\/revisions\/1490"}],"wp:attachment":[{"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/media?parent=1489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/categories?post=1489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bestdedicatedwebhostingserver.com\/blog\/wp-json\/wp\/v2\/tags?post=1489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}