Le Raspberry Pi le plus stable ? Une précision NTP améliorée de 81 % grâce à la gestion thermique
(austinsnerdythings.com)- Présentation des résultats d’une expérimentation combinant l’affectation fixe des cœurs CPU et la stabilisation thermique pour réduire les variations de fréquence d’un serveur NTP basé sur Raspberry Pi
- Observation du fait que les variations de température du CPU provoquent une dérive de fréquence de l’oscillateur à quartz, puis stabilisation en maintenant une température constante
- Grâce à un processus « time burner » basé sur une régulation PID maintenant le CPU à 54°C, obtention d’une réduction de 81 % des variations de fréquence et de 77 % de l’écart-type
- En réservant le CPU 0 à chronyd et en maintenant la charge thermique sur les autres cœurs, amélioration de l’offset NTP jusqu’à un niveau moyen d’environ 38 ns
- Mise en évidence de la possibilité de réaliser un serveur de timing haute précision à faible coût pour des environnements exigeant une exactitude extrême, comme la synchronisation temporelle de précision ou les équipements scientifiques
Problème : instabilité temporelle due aux variations de température
- La fonction de mise à l’échelle dynamique de la fréquence (DVFS) du Raspberry Pi est avantageuse pour l’efficacité énergétique, mais défavorable à la synchronisation temporelle de précision
- Lorsque la fréquence d’horloge varie selon la charge CPU, la cadence des ticks de l’horloge système varie elle aussi
- La fréquence de l’oscillateur à quartz est sensible à la température et varie de plusieurs ppm selon l’échauffement du CPU
- Les variations de température entre le jour et la nuit entraînent une dérive de fréquence
- Les résultats de surveillance dans Grafana montrent un offset de fréquence d’environ ±1 ppm selon les variations de température du CPU
- L’offset RMS moyen se situe autour de 86 ns, ce qui laisse une marge d’amélioration
Constat : l’effet bénéfique d’une température constante
- Il a été confirmé qu’en maintenant une température CPU constante, il est possible d’améliorer la stabilité de fréquence
- La solution se compose de deux volets
- Isolation des cœurs CPU – affecter chronyd et les interruptions PPS uniquement au CPU 0
- Stabilisation thermique – maintenir les autres cœurs en activité continue pour conserver une température constante
- Lorsque le système de stabilisation thermique a été activé le 17 novembre 2025 à 09:10, les oscillations de fréquence ont immédiatement diminué
Solution 1 : affectation fixe des cœurs CPU et priorité temps réel
- CPU 0 : réservé à chronyd et aux interruptions PPS
- CPU 1–3 : tâches générales et maintien de la charge thermique
- Mise en place d’un script d’optimisation exécuté automatiquement au démarrage
- Forcer le mode de gouvernance de fréquence CPU sur performance
- Épingler PPS IRQ(200) sur le CPU 0
- Définir chronyd en priorité temps réel (SCHED_FIFO 50)
- Augmenter la priorité du processus ksoftirqd/0
- Le script peut être enregistré dans
/etc/rc.localou comme service systemd
Solution 2 : stabilisation thermique basée sur une régulation PID
- Pour maintenir une température CPU constante, utilisation d’une boucle de contrôle PID
- Température cible : 54°C
- Trois processus workers sur CPU 1–3 génèrent de la charge via des calculs de hash MD5
- Le temps de calcul et le temps d’attente sont ajustés selon la valeur de sortie du PID
- Paramètres PID
- Kp=0.05, Ki=0.02, Kd=0.0
- Comme les variations de température sont lentes, le terme dérivé (Kd) est fixé à 0
- Au final, la température CPU reste stable dans une plage de ±0.2°C
Résultats : amélioration de la stabilité de fréquence
- Réduction de 81 % de la variabilité de fréquence, 77 % de réduction de l’écart-type et 49 % de réduction de l’offset RMS
- Offset RMS moyen : 85.44ns → 43.54ns
- Offset RMS médian : 80.13ns → 37.93ns
- Avec le CPU maintenu à 54°C, obtention d’une stabilité de fréquence dans une plage de ±0.14 ppm
- La stabilité est maintenue malgré les variations de température ambiante (18.9~22.2°C)
Procédure de configuration
- Préparation préalable : mise en place nécessaire d’un serveur NTP basé sur GPS PPS
- Installation des paquets requis
linux-cpupower,python3,util-linux
- Création du script d’optimisation au démarrage
/usr/local/bin/pps-optimize.shet enregistrement dans systemd - Création du script de contrôle thermique
/usr/local/bin/time_burner.pyet enregistrement comme serviceExecStart=/usr/bin/python3 /usr/local/bin/time_burner.py -t 54.0 -n 3
- Commandes de validation
- Vérifier que le governor CPU est sur
performance - Vérifier l’affinité CPU et la priorité de chronyd
- Mesurer l’offset RMS avec
chronyc tracking(par exemple autour de 35ns)
- Vérifier que le governor CPU est sur
Supervision et résolution de problèmes
- Surveillance en temps réel :
watch -n 1 "chronyc tracking" - Vérification de l’état du service :
sudo systemctl status time-burner.service - Réglage PID
- En cas d’oscillations de température, diminuer Kp ; si la stabilisation est trop lente, augmenter Ki
- La température cible peut être ajustée dans une plage de 50 à 60°C
- Une utilisation CPU élevée (environ 90 %) est un comportement intentionnel
Compromis
- Consommation électrique en hausse : 3–4W consommés en continu (environ 15–25kWh par an)
- Échauffement accru : maintien à 54°C, dans une plage sûre
- Occupation des ressources CPU : 3 cœurs utilisés sur 4
- Adapté à un équipement dédié au NTP, inadapté à un environnement multi-services
Domaines d’application possibles
- Synchronisation temporelle de précision, équipements scientifiques, recherche sur les systèmes distribués, tests réseau, etc.
- Excessif pour un usage général, mais utile pour mettre en place un environnement expérimental haute précision à faible coût
Pistes d’amélioration futures
- Réglage PID adaptatif pour s’adapter aux variations saisonnières de température
- Contrôle de refroidissement matériel (ventilateur PWM, etc.) pour améliorer l’efficacité énergétique
- L’utilisation d’un OCXO (oscillateur à quartz thermostabilisé) pourrait éliminer la dérive thermique
Conclusion
- Combiner l’affectation fixe des cœurs CPU et la gestion thermique par PID permet de réaliser un serveur NTP ultra-précis
- Amélioration de 81 % de la stabilité de fréquence, avec un offset RMS atteignant 38 ns
- L’expérimentation démontre la corrélation entre gestion thermique et ordonnancement temps réel
- Il s’agit d’un projet davantage centré sur l’exploration technique et la valeur pédagogique que sur la praticité
1 commentaires
Avis Hacker News
CPU0 concentre d’autres interruptions, donc il n’est pas adapté aux tâches qui exigent une haute précision temporelle
CPU0 a beaucoup de tâches système qui ne peuvent pas être déplacées, donc il est bien préférable d’utiliser un autre cœur comme îlot isolé (isolated core)
La latence de l’ordonnanceur sur notre cœur isolé est très stable, avec un minimum de 1µs, une moyenne de 5µs et un maximum d’environ 59µs
Article connexe : Spare Time – JILA
La masse thermique faite de bouteilles d’eau est aussi fascinante
C’est un peu comme mettre une pierre chaude dans un sac de couchage
Mon LEA-M8T génère une impulsion temporelle à 16Hz, et j’ai défini
dpoll=-4dans la configuration de chrony. Cela améliore la stabilité en collectant 256 échantillons sur 16 secondesJ’ai aussi un BH3SAP GPSDO à côté du bureau. Claude a modifié le firmware pour ajouter un mode flywheel qui continue à générer des impulsions GPS même sans PPS GPS
Il a aussi été mis à jour pour prendre en charge la sortie TSIP (protocole Trimble). J’en parlerai dans un prochain billet
Je répondrai bientôt aussi aux commentaires, et les questions sont toujours les bienvenues
Je me demande combien la pulsation à 16Hz change réellement les choses. Et j’aimerais aussi savoir comment vous injectez les données dans influxdb. J’utilise collectd, mais il y a peu d’informations
Même un boîtier métallique pourrait donner des résultats plus stables face aux variations cycliques de température dues au chauffage ou à la climatisation
Documentation connexe : Raspberry Pi StackExchange – remplacement de l’oscillateur
Rien qu’avec cette méthode, la dérive diminue de 4 à 5 fois. C’est encore mieux en la combinant avec d’autres techniques
Mais je ne suis pas assez sûr de mes compétences en soudure pour faire le remplacement moi-même
Même le simple fait de configurer un serveur NTP permet d’apprendre beaucoup de choses
Cela permet un excellent refroidissement passif sans ventilateur
Si la température change lentement, la dérive de l’horloge changera elle aussi plus lentement, ce qui facilite la correction
En revanche, un petit dissipateur peut au contraire devenir plus sensible aux variations de température ambiante
Cela pourrait atténuer les variations brusques de température de la pièce (ouvrir une fenêtre, humidité après une douche, etc.) et éviter que le CPU ne chauffe inutilement
Au final, le but est de maintenir la température aussi constante que possible
Les autres cœurs fonctionnent déjà près de leur température maximale et ajustent automatiquement leur fréquence en fonction de la température
Un refroidissement excessif peut perturber ce mécanisme interne d’autorégulation thermique
On peut ajouter un transistor pilotable par GPIO pour maintenir la température avec une régulation PID
Ils étaient stables parce qu’on utilisait des cristaux taillés pour avoir un coefficient de température proche de 0
Les équipements récents utilisent encore ce type d’architecture, et il faut environ 5 minutes pour une stabilisation complète
Cela réduisait les variations de température ambiante, mais au final la solution la plus sûre reste de le placer dans une chambre à température contrôlée
Par exemple, une carte STM32 avec Ethernet utilisée comme serveur NTP semblerait plus stable
Il peut fournir un signal NTP au Pi, et aussi à un STM32, mais il n’a pas de fonction Ethernet intégrée à l’origine
RTLinux a même une fonction pour synchroniser l’ordonnanceur avec l’état de broches externes
Mais quand le nombre de processeurs augmente, des problèmes de métastabilité (metastability) apparaissent
Le Pi n’offre pas de garanties temps réel comme un FPGA (Zynq)
Mais comme la consommation électrique est faible, il est logique de résoudre le problème en gaspillant un peu d’énergie plutôt qu’avec un système de refroidissement complexe
La méthode de détection du jitter avec deux signaux PPS est une vieille technique, et le tempco learning existe depuis des décennies
Il manque une validation montrant à quel point ce tempco appris est réellement précis