Un script Python pour suivre les fréquences, tension et température du SoC d'un Raspberry Pi

Un script Python pour suivre les fréquences, tension et température du SoC d’un Raspberry Pi

Chaud cacao !

Avatar de l'auteur
David Legrand

Publié dans

Hardware

30/07/2019 4 minutes
30

Un script Python pour suivre les fréquences, tension et température du SoC d'un Raspberry Pi

La hausse de performances du Raspbery Pi 4 ne s'est pas faite sans impacts négatifs, notamment la température du SoC. Pour nos tests, nous avons développé un script Python permettant de la surveiller, ainsi que les fréquences. Nous le publions en open source.

Le Raspberry Pi 4 utilise un nouveau SoC, plus efficace et plus rapide. Cadencé jusqu'à 1,5 GHz, son intégration reste assez basique, notamment le refroidissement. 

En effet, la fondation ne propose aucun système de dissipation complémentaire ou d'éléments pour ajouter simplement un ventilateur. Pourtant, la chaleur dégagée par sa nouvelle carte est importante, tout comme la température relevée au sein du boîtier officiel lorsqu'il est fermé, même au repos.

Des choix critiqués, d'autant que l'équipe communique allègrement sur les performances en hausse de la bête, qui correspondent à un cas idéal où le SoC n'atteint pas ses limites de chaleur. C'est pourtant rapidement le cas. La fondation a promis des améliorations via le firmware pour réduire la consommation de sa puce, et donc son échauffement. Une promesse qu'il faudra vérifier.

Nous avons donc développé un petit script pour suivre l'évolution de quelques informations du SoC dans le temps.

Notre script Python

Il utilise vcgencmd qui permet de relever des valeurs ou des éléments de configuration du Raspberry Pi. Vous pouvez obtenir la liste des commandes pouvant être utilisées en tapant cette ligne dans un terminal :

vcgencmd commands

Nous avons utilisé Python, présent nativement au sein de Raspbian, permettant facilement de manipuler des données et des fichiers CSV. L'objectif est en effet de garder un historique des valeurs sur une période donnée. Nous pourrons ainsi les exploiter dans un graphique si nécessaire.

Le script est simple, définissant un délai en secondes entre chaque relevé (2 par défaut) puis le nom du fichier à utiliser. Le compteur est ensuite initialisé à 0. Une première méthode permet l'écriture de valeurs dans le fichiers CSV sous forme de lignes ajoutées les unes aux autres. Une autre permet l'extraction d'une valeur flottante depuis un texte. C'est nécessaire puisque vcgencmd ne renvoie pas seulement la valeur demandée.

Une fois toutes ces méthodes définies, on passe à l'affichage du résultat et à l'écriture du fichier CSV. Celui-ci est initialisé avec un en-tête comprenant le nom des différentes valeus relevées, ce qui aide à sa comprehension. On attend ensuite le délai demandé.

Pour lancer, vous pouvez utiliser la commande suivante :

wget -qO- https://gist.github.com/davlgd/07f6288e869519acb695774e146a20b6/raw/09be19d5e96a627a33f444ea8db511245066dc7e/pi_soc_monitor.py | python

Près de 70 °C au repos avec le boîtier officiel

Lors de nos relevés, nous avons utilisé un Raspberry Pi 4 Model B équipé de 4 Go de mémoire, connecté à un écran (sans 4Kp60) et un clavier/souris. Bluetooth et Wi-Fi étaient désactivés, au profit de la seule connexion réseau filaire. Boîtier fermé, le SoC se stabilise entre 66 et 68°C au repos, contre 62 à 64°C boîtier ouvert dans une pièce à 24°C.

La puce est chaude au toucher, confirmant que ce n'est pas une erreur logicielle. Sa fréquence est alors bien de 600 MHz (Core) et 250 MHz (ARM), contre 1 500/500 MHz en charge. Seule sa tension ne bouge pas et reste à 0,85 V, contre 1,20/1,34 V pour le SoC d'un Raspberry Pi 3B+. 

Dès que l'on sollicite l'ensemble des cœurs, on atteint vite une température limite à un peu plus de 80°C. Une sécurité s'enclenche alors, limitant la fréquence de fonctionnement à 1 GHz, avec un impact important sur les performances. On voit très nettement cette zone dans nos relevés, et la conséquence sur un simple test OpenSSL :

openssl speed --multi $(nproc) rsa4096

Signatures RSA 4096 bits par seconde :

  • 4B à 1,5 GHz : 38
  • 4B à 1,0 GHz : 31 (-18 %)
  • 3B+ : 21

Vérifications RSA 4096 bits par seconde :

  • 4B à 1,5 GHz : 2 593
  • 4B à 1,0 GHz : 1 750 (- 32 %)
  • 3B+ : 1 444

Chaque test d'une vingtaine de secondes suffit à faire prendre 10°C au SoC du Pi 4, jusqu'à ce que sa température limite soit atteinte. Ce même phénomène ne s'observe pas sur un Raspberry Pi 3B+ dont la température au repos se situe entre 53/54°C, contre 77°C même après une dizaine de tests. On retombe rapidement à moins de 60°C.

Nous reviendrons dans un prochain article sur les solutions qui peuvent être mises en place pour améliorer la situation, en attendant des évolutions proposées directement par la fondation.

Températures Raspberry Pi 4 Model B ReposTempératures Raspberry Pi 4 Model B ChargeTempératures Raspberry Pi 3 Model B+ Charge
Le Raspberry Pi 4 Model B au repos puis en charge puis le Raspberry Pi 3 B+ en charge

Écrit par David Legrand

Tiens, en parlant de ça :

Sommaire de l'article

Introduction

Notre script Python

Près de 70 °C au repos avec le boîtier officiel

Fermer

Commentaires (30)


C’est le véritable problème du pi 4.
J’en possède 2 qui sont presque inexploitables malheureusement…
J’attends avec impatience cette mise a jour du firmware en espérant qu’elle sorte vraiment mais j’ai bien peur que l’on soit obligé d’attendre une version 4B+ car il semblerait que ce problème soit purement matériel


Ca me rapelle le PI premier du nom qui avait aussi des problèmes de surchauffe, un petit radiateur de vrm dessus et hop c’était résolu.


@SLV17, le nouveau firmware est en alpha, et on peut déjà le choper. J’ai fait une fiche sur mon wiki : https://wiki.fiat-tux.fr/admin:systeme:maj-firmware-raspberrypi4



J’attends avec impatience la livraison d’un ventilateur que j’ai commandé : https://shop.pimoroni.com/products/fan-shim
Ça devrait faire du bien au pi :-)



framasky a dit:





Oui avec le ventilateur on règle le souci, mais le problème de fond c’est que le boîtier officiel n’est pas prévu pour ça (on en reparle bientôt plus en détails :p). Gare quand même aux firmwares alpha sur lesquels ont sait peu de choses, hors pour des cas de tests. Sinon autant attendre la release officielle.



David_L a dit:


Oui avec le ventilateur on règle le souci, mais le problème de fond c’est que le boîtier officiel n’est pas prévu pour ça




Ah ? J’ai toujours considéré que le RPi était conçu pour pendouiller nu au bout de son câble USB :transpi:



Charly32 a dit:





Tu peux faire tout ce que tu veux et l’habiller comme tu veux. Mais dans tous les cas, que la simple installation dans le boîtier officiel implique une surchauffe rapide est un problème :D


Des tests sont ils prévus avec un boitier en métal de le prochain article ?


Ils ont intégré le mode Uber de chez AMD par défaut tout simplement. :D


Le firmware va abaisser la fréquence maximale à 800MHz, comme ça on récupère les performances thermiques d’un Pi 3 B+ (ainsi que les performances en calcul…) :troll:


je prêche un peu pour la concurrence, mais il y a un plugin pour domoticz qui permet de suivre les metrics du PI : https://github.com/Xorfor/Domoticz-PiMonitor-Plugin



(je l’ai découvert que le mois dernier :transpi: )


Pour le script, j’aurai utiliser les regex de python :



import re
#je compile en variable global : ainsi c'est fait qu'une seul fois.
#C'est la RE pour un float quelconque tel que donnée par la doc de python https://docs.python.org/3/library/re.html#simulating-scanf
FLOAT_RE=re.compile("[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?")
...
def extract_float_value(text):
return float(re.search(FLOAT_RE, text).group(0))
def get_temp():
temp_r = os.popen("vcgencmd measure_temp").readline()
temp_f=extract_float_value(temp_r)
#et ainsi de suite pour les autres
...


Après votre solution est bonne aussi. Ce n’est pas forcément rationnel, mais je préfère déléguer au maximum aux bibliothèques en python quand les bibliothèques sont souvent compilées et donc sont plus performantes (j’ai pu voir ça avec justement CSV : lors de la lecture il vaut mieux lui déléguer le cast en float que de le faire à la main après lecture). Avec une RE, le parsing est normalement en O(n) (automate fini déterministe), votre solution est potentiellement en O(2n) (il faut parcourir 2 fois la chaîne de caractères).


Un rad va bien finir par sortir, par contre on va devoir découper à la mano le boîtier…



crocodudule a dit:


Un rad va bien finir par sortir, par contre on va devoir découper à la mano le boîtier…




J’ai commandé ça : Ice Tower



pas tout petit pour un boitier :mdr:



Gueshty a dit:





La taille du ventirad importe peu je pense, un simple 40mm placé sur le SoC suffit à assurer un bon refroidissement. Ce n’est pas tant que le SoC chauffe trop, c’est surtout qu’il faut faire sortir l’air chaud du boîtier.


Je râlai car 2 mois avant la sortie du Pi4, j’ai acheté 3 Pi3 pour en faire des médiacenter et autre chez ma soeur, mais finalement c’est pas plus mal vu les températures du bouzin…



Comme disait un des mes VDD, y a plus qu’à attendre la version B car j’ai du mal à voir comment ils vont pouvoir régler ce problème de surchauffe juste avec une mise à jour logicielle.


Il y a aussi le fameux problème d’alimentation USB…



Je vais attendre la révision B avant de potentiellement en acheter un :transpi:


Ou sinon, on peut utiliser munin, dispo en standard dans raspbian.



(quote:42844:alex.d.)




aka le bazooka pour chasser les mouches (30 Mo de dépendances pour afficher trois valeurs en boucle, si c’est pas overkill… :transpi:


Pas besoin de ventilateur, un simple petit radiateur collé a 50 centimes suffit a régler le problème.



kantfredo a dit:





Vu que ça revient à mieux dissiper la chaleur dans un boîtier fermé trop chaud, j’ai comme un doute sur l’efficacité. Disons que ça peut retarder le phénomène à la marge mais rien de plus.


Sinon il y a ce boitier en alu qui a l’air pas mail avec une partie directement en contact avec le CPU : https://flirc.tv/more/raspberry-pi-4-case


Potentiellement une bonne solution (si le boîtier n’est pas lui-même confiné, ca sera je pense la principale limite du pi4 1’ génération : contrairement aux autres on ne pourra pas le planqué à l’arrache dans un meuble par exemple)


Perso, le gros problème pour moi des Pi, c’est le stockage qui n’est pas fiable à moins d’y ajouter un adaptateur USB/data pour y mettre un ssd. Et a partir de la quand on met les tarifs bout à bout, on arrive au prix de boîtier tout fait sur Aliexpress ou même des Intel Nuc d’ocaz comme le n2820 (que j’ai) qui est plus performant, plus compact, dans un beau boîtier, et auquel je peux y mettre un stockage en sata natif. Quant à la consommation électrique, c’est kif kif avec un pi (7w pour le pi ce 9w pour le nuc)


Je trouve pas comment editer mon message précédent.



Pour le n2820, a noter que j’ai ajouter un dongle hdmi qui simule un écran sinon le nuc ne boot pas headless.
Ça ne change en rien mon avis, je trouve ça bien plus pertinent. Surtout qu’on peut y installer la distrib que l’on veux, pas juste raspbian.



Sinon pour revenir au Pi, éventuellement le pi nano w qui peut avoir un intérêt.


Petite remarque sur le script:
si tu utilises un context manager en Python pour ouvrir un fichier (with open …. etc …), la fermeture du fichier en sortie du context est implicite et automatique.
Donc la ligne “csv_file_opened.close()” de la fonction write_csv ne sert a rien et peut être supprimée.



David_L a dit:


Oui avec le ventilateur on règle le souci, mais le problème de fond c’est que le boîtier officiel n’est pas prévu pour ça (on en reparle bientôt plus en détails :p). Gare quand même aux firmwares alpha sur lesquels ont sait peu de choses, hors pour des cas de tests. Sinon autant attendre la release officielle.




Je suis bien d’accord sur le pb du boitier. Je viens de recevoir mon ventilo et de l’intaller. Je passe de 60° quand le pi ne fait rien à 37°, boitier ouvert. Je crois le couvercle du boitier va prendre quelques coups de perceuses avant sa remise en place :D



Pour le firmware, j’ai mis à jour parce qu’avec la canicule, baisser la température de 3 ou 4 degrés, c’était limite vital, mais maintenant que j’ai un ventilo, je pourrais sans doute repasser sur le firmware de base.



David_L a dit:


aka le bazooka pour chasser les mouches (30 Mo de dépendances pour afficher trois valeurs en boucle, si c’est pas overkill… :transpi:




Tu as une seule installation de munin pour tout le parc. Sur chaque noeud surveillé, tu n’as besoin que de munin-node, qui est tout petit.
Chez moi, je monitore mes 6 PCs, tous les paramètres (température, mémoire, espace disque, etc.) en un seul endroit centralisé. C’est quand même plus pratique que des solutions ad-hoc disparates, différentes pour chaque plate-forme. Plus le petit plugin maison pour surveiller la synchro ADSL et la téléinfo EDF :-)


[quote]
wget -qO- https://gist.github.com/davlgd/07f6288e869519acb695774e146a20b6/raw/09be19d5e96a627a33f444ea8db511245066dc7e/pi_soc_monitor.py | python
[/quote]



Même si c’est très fréquent dans les documentations, ce n’est pas recommandé d’exécuter du code non vérifié (pas de contrôle d’intégrité/d’authenticité)… Le site web peut très bien présenter un contenu différent (en se basant sur le User Agent par exemple). C’est bien mieux pour la sécurité de le télécharger puis consulter son contenu et l’exécuter.



Sinon avec un RPi 3B+ j’atteint fréquement les 78-80°C sur Kodi avec Netflix, dans un boitier métalique comportant quelques entailles sur sa face supérieur mais sans dissipateur. Le tout dans une pièce à 24°C.



(quote:42927:alex.d.)




Ton besoin n’est pas celui du script ;)


Pour ma part j’utilise depuis longtemps bcmstat pour surveiller l’état de mes RPi montés en caméras ou en NAS.



Exemple de sortie sur un RPi 2 qui tourne 2424 depuis des années:



pi@RPI1:~ $ bcmstat
Config: v0.5.2, args “”, priority lowest (+19)
Board: 4 x ARMv7 cores available, ondemand governor (Pi2 Model B rev 1.1, BCM2836 SoC with 1GB RAM by Sony UK)
Memory: 1014MB (split 998MB ARM, 16MB GPU) plus 100MB Swap
HW Block: | ARM | Core | H264 | SDRAM |
Min Freq: | 250MHz | 250MHz | 0MHz | 450MHz |
Max Freq: | 900MHz | 450MHz | 300MHz | 450MHz |
Voltages: | 0, 1.3125V | +1, 1.2250V |
Other: temp_limit=70
Firmware: Oct 24 2017 17:10:16, version a3d7660e6749e75e2c4ce4d377846abd3b3be283 (clean) (release)
Codecs: none
Booted: Wed Jul 31 07:23:39 2019



Time ARM Core H264 Core Temp (Max) IRQ/s RX B/s TX B/s
======== ======= ======= ======= =============== ====== =========== ===========
06:34:36 900Mhz 450Mhz 250Mhz 44.39C (44.39C) 2,420 1,039 3,571
06:34:38 900Mhz 450Mhz 250Mhz 44.39C (44.39C) 636 67 84