Gouverneur CPU et stabilité thermique#
Pourquoi#
Par défaut, Linux ajuste dynamiquement la fréquence des cœurs CPU selon la
charge, pour économiser l’énergie (gouverneur ondemand ou schedutil).
Chaque changement de fréquence introduit une latence de transition et une
variation de température, deux sources de jitter indésirables pour un
système qui vise la précision temporelle. On verrouille donc la fréquence
au maximum, en permanence.
Comment#
Verrouillage à pleine fréquence#
cat > /etc/systemd/system/cpu-governor.service <<'EOF'
[Unit]
Description=CPU frequency governor: performance (Stratum 1)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'for c in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo performance > "$c"; done'
RemainAfterExit=true
[Install]
WantedBy=basic.target
EOF
systemctl daemon-reload
systemctl enable --now cpu-governor.serviceConfinement de l’OS sur le cœur 0#
En complément de l’isolation isolcpus=2,3 du chapitre Firmware, on
confine explicitement tous les services génériques sur le cœur 0 ; les
services critiques (chrony, phc2sys) redéfiniront leur propre affinité
sur le cœur 1.
mkdir -p /etc/systemd/system.conf.d/
cat > /etc/systemd/system.conf.d/00-stratum1-affinity.conf <<'EOF'
[Manager]
CPUAffinity=0
EOF
systemctl daemon-reexecErreurs à éviter#
- Utiliser
DefaultCPUAffinity=au lieu deCPUAffinity=. Cette directive n’existe pas dans systemd : c’est une confusion fréquente avec d’autres optionsDefault*=. SeuleCPUAffinity=dans la section[Manager]fonctionne réellement (voirman systemd-system.conf). - S’attendre à ce que
daemon-reexecchange immédiatement l’affinité de PID 1. Le masque CPU du processus systemd lui-même (PID 1) est figé au moment de son lancement par le kernel,daemon-reexecrecharge la configuration pour les nouveaux services lancés, mais ne modifie pas rétroactivement l’affinité déjà allouée à PID 1. Un reboot complet est nécessaire pour voir le changement appliqué à PID 1 lui-même. - Chercher
cpufrequtils. Ce paquet a été retiré des dépôts Debian récents. L’approche par service systemd écrivant directement dans le sysfs (ci-dessus) ne dépend d’aucun paquet tiers.
Vérifier#
# Gouverneur "performance" sur les 4 cœurs
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# Fréquence effective au maximum (2.4 GHz sur Pi 5)
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
# Affinité de PID 1 (avant reboot : reflète isolcpus seul ;
# après reboot : reflète isolcpus + CPUAffinity=0 combinés)
grep Cpus_allowed_list /proc/1/status
# Test indirect : un service lancé MAINTENANT hérite du nouveau défaut
systemd-run --pipe --wait sh -c 'grep Cpus_allowed_list /proc/self/status'
# Doit retourner "Cpus_allowed_list: 0"
systemctl show --property=CPUAffinityretourne vide au niveau du manager, cette propriété n’est exposée que pour les unités individuelles. Le test fiable passe par/proc/self/statusviasystemd-run, comme montré ci-dessus.
La stabilité thermique proprement dite (ventilation active, mesure de l’impact sur la dérive de l’oscillateur) est couverte séparément au chapitre Stabilisation thermique active.