Does the timekeeping series change how chrony disciplines the clock on an
idle guest, under a completely standard NTP setup (no PPS)? Four co-located
VMs run patched/baseline kernels in periodic/tickless tick modes, all
disciplined by chrony from Amazon Time Sync, and judged by an independent
referee: the ENA PHC (/dev/ptp0), sampled at 1 Hz.
| Host | Instance | Tick Mode | Kernel | Socket |
|---|---|---|---|---|
| E | i-0bbd4d706b525b2c6 | periodic (nohz=off, 1000Hz) | 7.3.0-rc1-timekeeping+ | host:1 |
| F | i-0a1209b28c3b15800 | periodic (nohz=off, 1000Hz) | 7.3.0-rc1-baseline+ | host:1 |
| G | i-051ba016b4648399a | NO_HZ_IDLE | 7.3.0-rc1-timekeeping+ | host:0 |
| H | i-061779927cc7e5b35 | NO_HZ_IDLE | 7.3.0-rc1-baseline+ | host:0 (to be confirmed — replacement instance, see below) |
cee9395acd80)./sys/kernel/debug/tk_sample
sampler exposing ntp_error, mult etc..config (only CONFIG_LOCALVERSION
differs): HZ=1000, NO_HZ_IDLE=y. Tick mode selected per host by
nohz=off on the command line. Deployed by kexec; the grub
default remains the stock Fedora kernel.7.233.99.247, DUB68), which is dual-socket: the two sockets (host:0 / host:1) have independent TSCs that differ by ~2.5 PPM. Patched-vs-baseline is therefore compared within a socket (shared TSC, shared NTP path); cross-socket frequency differences are a hardware artifact, not a kernel effect.server 169.254.169.123 prefer iburst (Amazon Time Sync) and
log tracking measurements statistics. Polling is fully adaptive —
the poll interval is a measured output, not a controlled input.PTP_SYS_OFFSET_EXTENDED), independent of
chrony's own beliefs. The PHC derives from the same AWS time infrastructure
as the NTP service, without the network path.i-061779927cc7e5b35) launched
into the slot vacated by the original H on the same droplet; its socket
placement will be confirmed from the frequency signature in the data.The earlier bare metal tests showed clear differences between patched and baseline kernels, but confounders (different crystals, different thermal environments, different network paths) made it hard to attribute differences purely to the kernel patches. By placing all 4 VMs on the same physical host, we eliminate:
Any remaining differences must come from the kernel's timekeeping code or the tick configuration.
CLOCK_REALTIME minus the ENA PHC at 1 Hz per host — ground truth for
how well each kernel's clock actually tracks, independent of chrony's
self-assessment. Second panel: exponentially-weighted RMS
(60-sample halflife) of the kernel's own ntp_error from the
tk_sample sampler. Third: PHC read bracket width (measurement
quality bound).
Allan deviation measures clock stability at different averaging timescales. Lower is better. A clock that's well-disciplined by NTP should show decreasing ADEV at longer timescales (the servo corrects drift). The slope indicates the dominant noise type (white noise = −½, flicker = 0, random walk = +½).
The "RMS Offset (chrony)" panel shows chrony's internally-tracked RMS which uses an exponentially-weighted history that predates our test window. The "RMS Offset (cumulative)" panel computes RMS directly from the offset samples collected during this test, giving a fairer comparison unaffected by each host's different convergence history.
Two collectors run on each host:
chronyc -c tracking every 30 s → ntp_quality.csv (chrony's self-view)phc_phase_log every 1 s → phc_phase.csv (PHC referee + adjtimex() readback + tk_sample kernel discipline state)enable_phc param is lost on kexec), ensure chrony log directive, start collectorschronyc -c tracking)| Column | Description |
|---|---|
| offset_ns | Current offset from NTP source (instantaneous error) |
| freq_ppm | Frequency correction applied by chrony |
| rms_offset_ns | RMS of recent offsets (jitter measure) |
| skew_ppm | Rate of frequency change (stability measure) |
| root_delay_ns | Round-trip delay to stratum-1 |
| root_disp_ns | Estimated maximum error from root |
| Column | Description |
|---|---|
| phc_offset_ns | CLOCK_REALTIME − PHC, tightest of 5 bracketed reads |
| bracket_ns | Width of the winning bracket (quality bound) |
| adj_freq_scaled, adj_offset, adj_status | adjtimex() readback |
| snap_err_ns | Extrapolated ntp_error deducted by the snapshot correction |
| ntp_error, mult, ntp_err_mult, ntp_err_frac | Timekeeper discipline state from tk_sample |
Data last fetched: —