Je conseille souvent à mes clients de faire des tests de longues durées pour leurs systèmes temps réel avec des charges extrémement élevées, tant en interruptions qu’en processus, afin de valider la bonne tenue de l’architecture choisie. Il s’agit d’aller sensiblement au-delà de la charge prévue lors de la conception, et de laisser le système en fonctionnement le plus longtemps possible (plusieurs jours au minimum) afin de pouvoir observer les cas rares où les latences maximales sont atteintes.
Nous allons réaliser ce genre de torture test pour la Pandaboard.
Tenue en charge maximale
Le premier test à réaliser avec un équipement embarqué est de vérifier s’il peut tenir une charge processeur maximale de manière prolongée. Ceci est facile à réaliser. Prenons un petit processus bouclant indéfiniment.
boucle.c int main(void) { while(1) ; }
Cette boucle consommera tous les cycles CPU que le noyau lui laissera. Nous allons en lancer deux instances en parallèle (une sur chaque coeur) sur la Pandaboard.
[Panda]# /root/boucle & [Panda]# /root/boucle & [Panda]#
Si nous laissons tourner ce système pendant un moment, le processeur de la Pandaboard va se mettre à chauffer (ce qui est tout à fait normal) mais n’arrivera pas à dissiper toute la chaleur qu’il produit (ce qui est plus discutable). Aussi arrivé à un certain seuil, un disjoncteur thermique se déclenche et coupera l’alimentation. La durée avant la disjontion thermique varie en fonction de la température initiale du processeur (et donc de son activité antérieure) et des mouvements d’air dans la pièce.
Pour en avoir le coeur net, j’ai utilisé un petit programme de Mans Rullgard (en voici une copie locale) qui permet d’afficher la température du processeur (en degrés celsius).
[Panda]# ./omap4_temp 59 [Panda]#
Nous partons d’un état où le processeur est déjà en marche depuis quelques dizaines de secondes, mais n’a pas travaillé de manière intensive. Au bout de trente secondes nous lançons la première boucle, puis la seconde après trente secondes supplémentaires.
La valeur de température est relevée toutes les secondes et stockées dans un fichier de texte ainsi que la date (initialisée au 01/01/2000 à chaque boot) afin de pouvoir ajuster les différentes courbes que nous obtiendrons.Voici le script que j’ai utilisé pour réaliser cette expérience.
test-montee-temperature.sh: #! /bin/sh if [ $# -lt 1 ] then FICHIER="traces-temperatures-$(date)" else FICHIER="$1" fi sleep 5 date +"[%Y/%m/%d %H:%M] Debut Mesure" > "$FICHIER" for i in $(seq 1 30) do date +"[%Y/%m/%d %H:%M] $(/root/omap4_temp)" >> "$FICHIER" sleep 1 done date +"[%Y/%m/%d %H:%M] Debut boucle 1" >> "$FICHIER" taskset 1 /root/boucle & for i in $(seq 1 30) do date +"[%Y/%m/%d %H:%M] $(/root/omap4_temp)" >> "$FICHIER" sleep 1 done date +"[%Y/%m/%d %H:%M] Debut boucle 2" >> "$FICHIER" taskset 2 /root/boucle & while true do date +"[%Y/%m/%d %H:%M] $(/root/omap4_temp)" >> "$FICHIER" sleep 1 done
Le script attend un nom de fichier en argument.
[Panda]# /root/test-montee-temperature.sh /root/test-temperature-pandaboard-seule.txt
Le programme tourne pendant une vingtaine de minutes, puis la carte s’arrête soudainement. Le fichier de résultats est stocké sur la carte SD (même s’il est probablement tronqué d’un ou deux derniers enregistrements).
[Panda]# cat /root/test-temperature-pandaboard-seule.txt [2000/01/01 10:10] Debut Mesure [2000/01/01 10:10] 37 [2000/01/01 10:10] 37 [2000/01/01 10:10] 37 [2000/01/01 10:10] 37 [2000/01/01 10:10] 37 [2000/01/01 10:10] 37 [2000/01/01 10:10] 37 [2000/01/01 10:10] 37 [2000/01/01 10:10] 37 [2000/01/01 10:10] 37 [2000/01/01 10:10] 39 [2000/01/01 10:10] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 39 [2000/01/01 10:11] 41 [2000/01/01 10:11] 41 [2000/01/01 10:11] 41 [2000/01/01 10:11] 41 [2000/01/01 10:11] 41 [2000/01/01 10:11] 41 [2000/01/01 10:11] 41 [2000/01/01 10:11] Debut boucle 1 [2000/01/01 10:11] 41 [2000/01/01 10:11] 41 [2000/01/01 10:11] 42 [2000/01/01 10:11] 42 [2000/01/01 10:11] 42 [2000/01/01 10:11] 44 [...] [2000/01/01 10:34] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [2000/01/01 10:35] 99 [Panda]#
L’expérience a donc duré 25 minutes. En examinant les valeurs, on remarque que la température monte très rapidement aux alentours de 70°C puis continue à croître régulièrement. Les 90°C sont atteints au bout d’une dizaine de minutes. Lorsque le seuil des 100°C est atteint, le processeur s’arrête totalement.
Voici la courbe de montée en température du processeur lorsqu’il est chargé au maximum de manière continue ; cliquez sur la figure pour voir les détails.
Il est donc clair que la carte Pandaboard ne supporte pas une charge de 100% du CPU de manière continue.
Ceci n’est pas particulièrement surprenant, la plupart des processeurs modernes sont conçus avec un souci d’intégration tel qu’ils ne peuvent évacuer toute la chaleur qu’ils produisent en fonctionnant à plein régime. Nous allons devoir améliorer la dissipation thermique du processeur OMAP de la Pandaboard.
Ajout d’un dissipateur thermique
Une seconde expérience va consister à poser un petit radiateur de dissipation thermique sur le processeur (sans même utiliser de pâte de contact, je n’en avais plus au début de ces essais).
En informatique, un radiateur est une petite pièce métallique ayant une forte conductivité thermique et une forme incluant de nombreuses ailettes afin d’augmenter au maximum la surface d’échange avec l’air ambiant. Le radiateur que je vais employer (photo ci-contre) a été récupéré sur un ancien amplificateur. Il n’est pas parfaitement adapté mais ses dimensions sont correctes. Naturellement dans le cas d’une mise en production industrielle plus complète, on se procurera un dissipateur mieux ajusté.
À titre d’exemple, voici un modèle de radiateur que l’on trouve sur des processeurs plus conséquents (Pentium et ses descendants). On assure le contact entre le processeur et le radiateur à l’aide d’une pâte thermique qui garantit une bonne conductivité.
Nous allons réitérer notre expérience après avoir placé un dissipateur sur l’OMAP.
[Panda]# /root/test-montee-temperature.sh /root/test-temperature-pandaboard-dissipateur.txt
Le programme ne s’arrête pas cette fois. Au bout d’un peu plus d’une heure je l’ai interrompu manuellement.
(Contrôle-C) [Panda]# killall boucle [Panda]# cat /root/test-temperature-pandaboard-dissipateur.txt [2000/01/01 00:45] Debut Mesure [2000/01/01 00:45] 31 [2000/01/01 00:45] 31 [2000/01/01 00:45] 31 [2000/01/01 00:45] 31 [2000/01/01 00:45] 31 [2000/01/01 00:45] 31 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:45] 32 [2000/01/01 00:46] 32 [2000/01/01 00:46] Debut boucle 1 [2000/01/01 00:46] 34 [2000/01/01 00:46] 34 [2000/01/01 00:46] 34 [2000/01/01 00:46] 36 [2000/01/01 00:46] 36 [2000/01/01 00:46] 36 [2000/01/01 00:46] 36 [...] [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:55] 76 [2000/01/01 01:56] 76 [2000/01/01 01:56] 76 [2000/01/01 01:56] 76 [2000/01/01 01:56] 76 [2000/01/01 01:56] 76 [2000/01/01 01:56] 76 [2000/01/01 01:56] 76 [2000/01/01 01:56] 76 [2000/01/01 01:56] 76 [Panda]#
La température s’est stabilisée à 76 °Celsius et le dissipateur arrive à évacuer l’énergie thermique dégagée par le CPU.
Utilisation d’un ventilateur
Le dissipateur thermique utilisé précédemment semble suffisant pour évacuer la chaleur du CPU. Toutefois, dans le cas où la carte se trouverait dans un environnement clos (boîtier ou chassis fermé), il serait nécessaire d’assurer une ventilation mécanique supplémentaire. Nous allons faire quelques essais avec un petit ventilateur de PC.
J’ai placé le ventilateur à côté de la carte Pandaboard de manière à ce que le flux d’air passe sur le processeur. Puis nous pouvons recommencer notre expérience.
[Panda]# /root/test-montee-temperature.sh /root/test-temperature-pandaboard-ventilateur.txt
Le programme fonctionnant sans interruption, je l’ai arrêté manuellement au bout d’un peu plus d’une demi-heure.
(Contrôle-C) [Panda]# killall boucle [Panda]# cat /root/test-temperature-pandaboard-ventilateur.txt [2000/01/01 00:05] Debut Mesure [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] Debut boucle 1 [2000/01/01 00:05] 34 [2000/01/01 00:05] 34 [2000/01/01 00:05] 36 [2000/01/01 00:05] 36 [2000/01/01 00:05] 36 [2000/01/01 00:05] 36 [2000/01/01 00:05] 36 [2000/01/01 00:05] 37 [...] [2000/01/01 00:40] 46 [2000/01/01 00:40] 46 [2000/01/01 00:40] 46 [2000/01/01 00:40] 46 [2000/01/01 00:40] 46 [2000/01/01 00:40] 46 [2000/01/01 00:40] 46 [2000/01/01 00:40] 46 [2000/01/01 00:40] 46 [2000/01/01 00:40] 46 [Panda]#
Les résultats sont remarquables : non seulement la température se situe bien en-dessous de celle obtenue auparavant, mais en plus elle est parfaitement stabilisée.
Cumul d’un dissipateur et d’un ventilateur
Cumulons maintenant les effets de nos deux dispositifs, pour vérifier si la température est encore mieux régulée.
Au vu des résultats précédents, j’ai arrêté l’expérience au bout de vingt-cinq minutes seulement car la température était bien stabilisée.
[Panda]# /root/test-montee-temperature.sh /root/test-temperature-pandaboard-dissipateur-ventilateur.txt (Contrôle-C) [Panda]# killall boucle [Panda]# cat /root/test-temperature-pandaboard-dissipateur-ventilateur.txt [2000/01/01 02:04] Debut Mesure [2000/01/01 02:04] 29 [2000/01/01 02:04] 29 [2000/01/01 02:04] 29 [2000/01/01 02:04] 29 [2000/01/01 02:04] 29 [2000/01/01 02:04] 29 [2000/01/01 02:04] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] 29 [2000/01/01 02:05] Debut boucle 1 [2000/01/01 02:05] 29 [2000/01/01 02:05] 31 [2000/01/01 02:05] 31 [2000/01/01 02:05] 31 [2000/01/01 02:05] 31 [...] [2000/01/01 02:31] 37 [2000/01/01 02:31] 37 [2000/01/01 02:31] 37 [2000/01/01 02:31] 37 [2000/01/01 02:31] 37 [2000/01/01 02:31] 37 [2000/01/01 02:31] 37 [2000/01/01 02:31] 37 [2000/01/01 02:31] 37 [Panda]#
Cette fois le processeur ne dépasse pas les 40°, ce qui est une valeur vraiment basse lorsqu’on réalise qu’il fonctionne à plein régime.
Conclusion
Pour finir, j’ai regroupé les quatre expériences sur un seul graphique en tronquant la durée à celle du premier essai (qui menait à une disjonction thermique).
Nous pouvons ainsi voir l’importance du refroidissement pour les systèmes embarqués soumis à des charges CPU importantes, et remarquer que la simple présence d’un petit dissipateur posé sur le processeur assure déjà une nette amélioration des conditions de fonctionnement. Dans les prochains articles, nous allons laisser ce dissipateur en place pour mener des tests de performance sur des longues durées.