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.service

Confinement 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-reexec

Erreurs à éviter#

  • Utiliser DefaultCPUAffinity= au lieu de CPUAffinity=. Cette directive n’existe pas dans systemd : c’est une confusion fréquente avec d’autres options Default*=. Seule CPUAffinity= dans la section [Manager] fonctionne réellement (voir man systemd-system.conf).
  • S’attendre à ce que daemon-reexec change 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-reexec recharge 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=CPUAffinity retourne 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/status via systemd-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.