🛠 Surveiller la thermique et les fréquences big.LITTLE
Objectifs
Mettre en place une surveillance sérieuse du S922X big.LITTLE (4× Cortex-A73 + 2× Cortex-A53) : fréquences réelles par cœur, températures des zones thermiques, détection du throttling. Contexte : le N2 (Rev-B, 1,8 GHz) throttlait en charge soutenue ; le N2+ (Rev-C) tient 2,4 GHz sans ventilateur sous 80 °C ambiante 35 °C, le ventilateur s'active vers 65 °C. Les mainteneurs Armbian recommandent le governor « performance » pour éviter des gels aléatoires après 24 h+ (instabilité cpufreq/OPP).
Matériel
- ODROID-N2/N2+ sous Armbian, dissipateur en place (le SoC est sous la carte !)
stress-ngpour la charge :sudo apt install stress-ng- Ventilateur 2 broches optionnel (kit dépendant) >
Code complet
#!/usr/bin/env python3
"""thermal_watch.py — fréquences + températures S922X, alerte throttling."""
import glob, time, subprocess
CPU = "/sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq" # kHz
MAXF = "/sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq"
ZONE = "/sys/class/thermal/thermal_zone*/temp" # milli-°C
# Ordonné : cpu0-3 = A73 (max 2400 MHz N2+ / 1800 N2), cpu4-5 = A53 (2016/1900)
def read(path): return int(open(path).read.strip)
while True:
freqs = [read(p) // 1000 for p in sorted(CPU and glob.glob(CPU),
key=lambda s: int(s.split("cpu")[1].split("/")[0]))]
maxs = [read(p) // 1000 for p in sorted(glob.glob(MAXF),
key=lambda s: int(s.split("cpu")[1].split("/")[0]))]
temps = [read(p) / 1000 for p in glob.glob(ZONE)]
hot = [t for t in temps if t > 75]
throttled = any(f < m * 0.9 for f, m in zip(freqs, maxs))
print(f"{time.strftime('%H:%M:%S')} MHz={freqs} "
f"°C={[round(t,1) for t in temps]} "
f"{'THROTTLING!' if throttled else ''}{' HOT!' if hot else ''}")
time.sleep(2)
# Lancer en parallèle : stress-ng --cpu 6 --cpu-method matrixprod
Vérification attendue
lscpu -e confirme 6 CPU (les A53 cpu4/cpu5 doivent être en ligne — des images vendor 4.9 les laissaient hors ligne). Au repos : 1,6–1,8 W et fréquences basses (governor ondemand) ou max (performance). En stress matrixprod : N2 ≈ 5,2 W, N2+ ≈ 6 W ; le script doit montrer les A73 plafonnés à 1800 MHz (N2) ou 2400 MHz (N2+) sans chute durable sous dissipateur correct (≤ 74–80 °C mesurés CNX). cat /sys/class/thermal/thermal_zone*/type nomme les zones (soc_thermal etc.).
Erreurs fréquentes
- Lire scaling_cur_freq d'un seul cœur et conclure : le big.LITTLE migre les tâches ; surveiller les 6 cœurs.
- Governor powersave/conservateur et croire à un défaut : passer en
performance(cpupower frequency-set -g performance), recommandé par Armbian contre les gels > 24 h. - Zéler les zones thermiques : toutes les thermal_zone* ne sont pas le SoC ; vérifier
typeavant d'alerter. - Surveiller avec le doigt : le dissipateur est SOUS la carte, la sensation tactile est trompeuse et brûlante.
- Oublier la différence N2/N2+ : plafonds OPP différents (1800/1900 vs 2400/2016 MHz), ne pas diagnostiquer un faux throttling.
- >
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash