Vérification : l’état de chrony en une commande#

Pourquoi#

La batterie de non-régression (chapitre Vérification finale) valide un changement ; les graphes Munin (chapitre Munin) montrent les tendances sur la durée. Entre les deux, l’exploitation quotidienne a besoin d’un geste simple : une photographie complète de l’état du service, en une seule commande, lisible en quelques secondes.

chronyc sait enchaîner plusieurs rapports en une seule invocation (option -m), et quatre d’entre eux suffisent à couvrir tout le service : la discipline de l’horloge (tracking), la charge servie (serverstats), l’état des sources (sources -v) et leurs statistiques (sourcestats -v).

Comment#

chronyc -m tracking serverstats 'sources -v' 'sourcestats -v'

-m traite chaque argument comme une commande distincte ; les guillemets protègent celles qui embarquent une option ('sources -v').

Sortie réelle de ce serveur :

Reference ID    : 50505330 (PPS0)
Stratum         : 1
Ref time (UTC)  : Sun Jul 19 23:58:28 2026
System time     : 0.000000117 seconds fast of NTP time
Last offset     : +0.000000430 seconds
RMS offset      : 0.000000751 seconds
Frequency       : 0.015 ppm fast
Residual freq   : +0.016 ppm
Skew            : 0.151 ppm
Root delay      : 0.000000001 seconds
Root dispersion : 0.000005789 seconds
Update interval : 4.0 seconds
Leap status     : Normal
NTP packets received       : 27085049
NTP packets dropped        : 1954441
Command packets received   : 1185
Command packets dropped    : 0
Client log records dropped : 1731901
NTS-KE connections accepted: 70
NTS-KE connections dropped : 0
Authenticated NTP packets  : 314
Interleaved NTP packets    : 443
NTP timestamps held        : 1744
NTP timestamp span         : 16025
NTP daemon RX timestamps   : 0
NTP daemon TX timestamps   : 25129144
NTP kernel RX timestamps   : 3493864
NTP kernel TX timestamps   : 59
NTP hardware RX timestamps : 21635723
NTP hardware TX timestamps : 384

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not combined,
| /             'x' = may be in error, '~' = too variable, '?' = unusable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
#* PPS0                          0   2   377     3   +148ns[ +553ns] +/-  696ns
#? GPS                           0   4   377    19  -2621us[-2621us] +/-  248us
^- 145.238.80.80                 1   9   377    81   -553us[ -552us] +/- 1605us
^- 2001:638:610:cecf::7b         1   9   377   135   -154us[ -153us] +/- 9813us
^- 139.143.5.30                  1   8   377   247   -535us[ -537us] +/- 5244us
^- 193.11.166.8                  1  10   377   531   -533us[ -535us] +/-   18ms
^- 129.6.15.25                   1   9   377   129   -529us[ -529us] +/-   44ms
^- 185.142.225.68                1  10   377  1101   +969us[ +923us] +/- 8319us
                             .- Number of sample points in measurement set.
                            /    .- Number of residual runs with same sign.
                           |    /    .- Length of measurement set (time).
                           |   |    /      .- Est. clock freq error (ppm).
                           |   |   |      /           .- Est. error in freq.
                           |   |   |     |           /         .- Est. offset.
                           |   |   |     |          |          |   On the -.
                           |   |   |     |          |          |   samples. \
                           |   |   |     |          |          |             |
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
PPS0                        6   3    22     +0.016      0.146    +40ns   277ns
GPS                        45  24   703     +1.883      1.989  -3307us   720us
145.238.80.80               8   5   60m     -0.019      0.141    -58us    75us
2001:638:610:cecf::7b       8   5   60m     -0.001      0.072   -164us    40us
139.143.5.30                7   4   30m     -0.013      0.139    -71us    34us
193.11.166.8                7   5  103m     +0.014      0.068   -483us    56us
129.6.15.25                12   7   68m     -0.028      0.051   -205us    48us
185.142.225.68              9   5  129m     +0.068      0.236  +1169us   344us

Bloc 1 : tracking, la discipline de l’horloge#

ChampLecture
Reference ID (PPS0)la référence active est bien le PPS, pas une source de secours (chapitre Chrony)
Stratum : 1le serveur annonce le niveau directement relié à une référence physique (chapitre Vue d’ensemble)
Ref timel’instant de la dernière correction appliquée
System timel’écart instantané entre l’horloge système et NTP (ici ≈ 0,1 µs)
Last offsetla dernière correction appliquée par la boucle
RMS offsetla métrique de précision : écart type de l’erreur, ici ≈ 0,75 µs, autour de la microseconde visée par ce projet
Frequencyla correction totale appliquée au quartz (0,015 ppm) ; une valeur aussi faible signifie que la compensation thermique absorbe déjà la part prévisible de la dérive (chapitre Chrony, tempcomp)
Residual freql’erreur de fréquence restante après toutes les corrections : proche de zéro sur un système sain
Skewl’incertitude sur la fréquence estimée ; 0,151 ppm ici, la valeur retombe sous ~0,05 ppm en régime établi (elle remonte transitoirement après un redémarrage)
Root delay / Root dispersiondélai et incertitude cumulés vers la référence : quasi nuls, la référence est locale
Update interval : 4.0 sle rythme des corrections, cohérent avec poll 2 (2² = 4 s) du refclock PPS
Leap status : Normalaucune seconde intercalaire pendante (chapitre Secondes intercalaires)

Bloc 2 : serverstats, le service rendu#

ChampLecture
NTP packets received / dropped27 millions de requêtes servies, ~7 % rejetées : le ratelimit applicatif au travail (chapitre Chrony)
Command packetsles requêtes chronyc locales, aucune rejetée
Client log records droppedla table de suivi des clients (clientloglimit) sature et recycle ses entrées : attendu sur un serveur public très sollicité
NTS-KE connections accepted70 négociations NTS abouties (chapitre NTS) ; dropped 0 : la limite ntsratelimit n’a pas eu à sévir
Authenticated NTP packetsles requêtes NTP effectivement protégées par NTS
Interleaved NTP packets, timestamps held/spanle support serveur du mode interleaved (xleave) : ces timestamps sont conservés (~1 700, sur ~4,5 h) pour les clients qui le demandent
NTP daemon TX timestamps≈ 25 millions : les réponses servies sont horodatées en espace utilisateur, car l’horodatage matériel TX est bloqué par le bug du pilote macb (kernel TX 59, hardware TX 384, chapitre PHC)
NTP kernel/hardware RX timestamps86 % des requêtes traitées reçoivent un timestamp matériel (21,6 M sur 25,1 M), le chiffre attendu avec le réglage -R 1 de phc2sys (chapitre PHC) ; le reste retombe sur le kernel

Bloc 3 : sources -v, l’état des sources#

La grille de lecture détaillée (légende, symboles #*, #?, ^-, Reach octal) est au chapitre Chrony. Les trois vérifications de ce bloc : le PPS est sélectionné (#*, ±696 ns d’incertitude estimée), le GPS en #? avec un offset de quelques millisecondes est normal (rôle de désambiguïsation, noselect), et les six sources réseau ont toutes Reach 377 (8 réponses sur 8).

Bloc 4 : sourcestats -v, les statistiques par source#

ColonneSignification
NPnombre de points de mesure retenus dans la fenêtre statistique
NRnombre de suites de résidus de même signe : très inférieur à NP/2, il signale des résidus corrélés (régression encore en cours de convergence)
Spandurée couverte par la fenêtre (60m = 60 minutes)
Frequency / Freq Skewdérive estimée vis-à-vis de cette source, et incertitude sur cette estimation (ppm)
Offsetécart estimé vis-à-vis de cette source
Std Devdispersion des mesures

Trois lectures sur l’exemple : le PPS montre une dispersion de quelques centaines de nanosecondes sur sa fenêtre courte ; le GPS est bruité (dispersion sub-milliseconde) sans aucune conséquence (noselect) ; les sources réseau s’étalent de quelques dizaines à quelques centaines de µs d’offset apparent, l’ordre de grandeur de l’asymétrie réseau, pas celui des horloges (chapitre Comparaison des performances).

La lecture en dix secondes#

  1. Reference ID = PPS0 et #* sur la ligne PPS : la bonne source pilote.
  2. RMS offset autour de la microseconde ou mieux.
  3. Residual freq proche de zéro.
  4. Reach 377 sur toutes les sources.
  5. Sources réseau cohérentes entre elles à quelques centaines de µs près.
  6. NTS-KE accepted qui progresse, dropped à zéro.

Erreurs à éviter#

  • Juger le serveur sur un instantané. Un seul relevé n’est ni une moyenne ni une tendance : Skew élevé après un redémarrage, source LastRx ancienne à Poll 10, offset réseau ponctuellement fort sont des états transitoires normaux. La durée se juge sur Munin (chapitre Munin), la conformité sur la batterie du chapitre Vérification finale.
  • S’alarmer du GPS en #? ou de son offset milliseconde. C’est le fonctionnement nominal : cette source ne sert qu’à étiqueter la seconde (noselect, chapitre Chrony).
  • Comparer l’offset des sources réseau à la précision locale. Les centaines de µs affichées mesurent surtout l’asymétrie des trajets (chapitre Comparaison des performances), pas l’horloge locale.
  • Confondre Frequency, Residual freq et Skew. Correction appliquée, erreur restante, incertitude d’estimation : trois grandeurs différentes. Une Frequency faible avec tempcomp actif est un signe de bonne santé, pas une anomalie.
  • Oublier le socket Unix sous service durci. Sans -h /run/chrony/chronyd.sock, chronyc peut échouer sans message clair (chapitre Chrony, pièges).

Vérifier#

Ce chapitre est la vérification : la commande unique ci-dessus, exécutée à chaque visite. Ses deux compléments : les graphes Munin pour la tendance (24 h minimum), acceptance.sh pour la non-régression après un changement (chapitre Vérification finale).


📚 Pour aller plus loin