For the complete documentation index, see llms.txt. This page is also available as Markdown.

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.org as a rotating public NTP pool

  • stricter startup clock correction

  • RTC synchronization

  • conservative clock frequency update handling

Please don't be scared by lots of NTP related terms, all of them are described in the 8. [Advanced] - config explanation

If you are Ansible user go straight to the 11. [Advanced] Ansible role, it has all steps below automated

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-timesyncd

Check 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

Directive
Meaning
Why it is used

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:

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?