0. Recommended Chrony Setup for Validator Nodes
Accurate system time is important for blockchain validator nodes. Clock drift can cause timestamp-related issues, missed blocks, rejected blocks, or unstable node behavior.
This guide shows a simple Chrony setup using:
Cloudflare as a fixed NTP source
pool.ntp.orgas a rotating public NTP poolstricter startup clock correction
RTC synchronization
conservative clock frequency update handling
0. Disable other time synchronization services
Before enabling Chrony, make sure other NTP/time-sync daemons are stopped and disabled.
Running multiple time synchronization services at the same time can cause confusing behavior because more than one daemon may try to discipline the system clock.
Common conflicting services:
ntp
ntpd
ntpsec
openntpd
systemd-timesyncdCheck what is active:
Stop and disable common alternatives, if someone from the list is active:
1. Install Chrony
Install Chrony using your distribution package manager.
Ubuntu/Debian
Default config path is usually:
Default service name is usually:
RHEL/CentOS/Rocky/Alma/Amazon Linux/Fedora
On older systems:
Default config path is usually:
Default service name is usually:
2. Find your active Chrony config path
Before editing, check which config file your running daemon actually uses.
If you see:
edit:
If you see:
edit:
If there is no -f flag, use your distro default:
You can also inspect the systemd unit:
For the rest of this guide, replace /etc/chrony/chrony.conf with /etc/chrony.conf if your distro uses the RHEL-like layout.
3. Configure Chrony
Edit the active Chrony config file.
Ubuntu/Debian example:
RHEL-like example:
Use this config:
4. Restart Chrony
Use the service name for your distribution.
Ubuntu/Debian:
RHEL-like systems:
5. Validate the configuration
Use the same config path your daemon uses.
Ubuntu/Debian example:
RHEL-like example:
A healthy result looks similar to:
This means Chrony parsed the config and checked time successfully.
If you see errors like this, fix the config before restarting the service:
6. Check synchronization status
Healthy output should include:
Example healthy output:
Also check:
Healthy output should include:
RTC in local TZ: no means the hardware clock is using UTC, which matches the rtconutc setting.
7. Check NTP sources
Example healthy output:
Source state meaning:
It is normal for only one source to be selected. Pool sources can still be available as fallback even if they are not currently selected.
8. [Advanced] - config explanation
server time.cloudflare.com iburst minpoll 6 maxpoll 8
Uses Cloudflare as a fixed NTP provider. iburst speeds up initial sync. minpoll 6 means minimum poll interval is 2^6 = 64 seconds. maxpoll 8 means maximum poll interval is 2^8 = 256 seconds.
Note: cloudflare allow to everyone to use it -https://blog.cloudflare.com/secure-time/
Provides a predictable primary time source without being too aggressive with polling.
pool pool.ntp.org iburst minpoll 6 maxpoll 8
Uses the public NTP pool. Chrony can resolve multiple servers based of your location from this pool and replace bad or unreachable ones.
Provides fallback and source diversity.
maxupdateskew 100
Makes Chrony more conservative about accepting unstable clock frequency estimates. The unit is ppm, or parts per million. 1 ppm ≈ 0.0864 seconds/day, 100 ppm ≈ 8.64 seconds/day, 1000 ppm ≈ 86.4 seconds/day.
Helps avoid learning bad drift corrections from noisy or unstable NTP measurements. This does not mean the clock is currently 8.64 seconds wrong; it means Chrony rejects frequency corrections if their estimated uncertainty is too high.
makestep 1 3
Allows Chrony to step the clock if the offset is larger than 1 second, but only during the first 3 updates after startup.
Corrects large startup drift quickly while avoiding unexpected large time jumps during normal long-running operation.
rtconutc
Documents that the hardware RTC is expected to use UTC. RTC means real-time clock: the machine’s hardware clock, usually used mainly at boot.
Keeps RTC handling predictable. A correct timedatectl output should show RTC in local TZ: no.
rtcsync
Enables RTC synchronization. Chrony normally synchronizes the Linux system clock using NTP. With rtcsync, Chrony tells Linux to periodically copy the synchronized system clock into the RTC.
Keeps the hardware clock synced from the corrected system clock. This helps the machine start closer to correct time after reboot and helps tools like timedatectl report synchronization state correctly.
leapsectz right/UTC
Uses the right/UTC timezone data for leap second information.
Provides leap second data if available on the system. Validate with sudo chronyd -Q -f /etc/chrony/chrony.conf. If validation fails because of right/UTC, remove the line or install the required timezone data.
9. [Advanced] Prometheus node exporter checks
If you monitor nodes with Node-exporter -> Prometheus stack, useful time metrics include:
This indicates whether the kernel considers the system clock synchronized:
Recommended alert for alert manager:
10. [Advanced] Grafana dashboard with NTP related graphs
Want to see NTP metrics as a dashboard on Grafana like on the screenshot below?

Please use Node Exporter full from one of the links:
11. [Advanced] Ansible role
If you are Ansible fan, you can use ansible-role-chrony:
Last updated
Was this helpful?