Il y a un an, un téléviseur 4K est arrivé à la maison et enfin, la semaine dernière, une carte vidéo capable de le piloter à cette résolution. La carte possède un énorme dissipateur thermique, mais pas de ventilateur. Pas de ventilateur signifie pas trop de chaleur (j'espère), ce qui signifie moins d'énergie requise par l'ancienne alimentation de 250 W. L'ordinateur fonctionne sous Linux et après avoir fouillé sur Internet, j'ai trouvé ces commandes pour vérifier les capteurs de température à l'intérieur du boîtier. Le vert Netflix est le nom de l'ordinateur Linux.
nvidia-settings and sensors commands to show temperatureCommandes nvidia-settings et capteurs pour afficher la température
Les deux commandes affichent la température Nvidia (carte graphique) à 53 °C et la ou les températures du processeur entre 46 °C et 53 °C. La commande des capteurs semble également suggérer que 80 °C est le début d’un quartier qui commence à s’inquiéter. Actuellement, la carte vidéo est au ralenti pendant la rédaction de cet article et la température est assez basse. Il est beaucoup plus difficile d’afficher une vidéo 4K en plein écran et la température va augmenter. Combien et à quelle vitesse ?
Pour le savoir, JMP exécutera les commandes Linux en boucle, enregistrant les résultats et créant un graphique qui se mettra à jour au fur et à mesure de la collecte des données. La magie réside dans RunProgram (une fonction JSL) et plink (un programme externe, faisant partie du package putty, qui s'exécute sous Windows.) Avant que cela fonctionne, il y a quelques choses à faire.
Tout d’abord, l’ordinateur hôte Linux a besoin du serveur SSH en cours d’exécution et doit être sécurisé de manière appropriée. J'ai utilisé des sites comme ce et ce ceci pour comprendre.
Ensuite, vous devrez installer plink sur votre ordinateur Windows. J'ai choisi le programme d'installation MSI ici puis lis ce pour comprendre comment fonctionne plink.
Enfin, configurez puttygen/putty/plink pour utiliser la connexion ssh avec les clés (mêmes ce d'en haut) afin de ne pas mettre votre mot de passe bien en vue.
Exécutez maintenant un test très simple pour voir si tout est en place. Plink est le programme que votre ordinateur Windows va exécuter (une partie de l'installation de Putty). Netflix est également le nom de la configuration de mon ordinateur Linux dans le programme putty.Capteurs est le nom du programme que l'ordinateur Linux exécutera. Et texte indique à RunProgram de renvoyer simplement tout le texte sorti des capteurs une fois les capteurs terminés.
Output of sensors command showing B0 for degree symbolSortie de la commande des capteurs affichant B0 pour le symbole du degré
Le B0 en surbrillance doit être un symbole de degré. RunProgram suppose que la sortie d'un exécutable est en ASCII 7 bits, et non en Unicode. Pour résoudre ce problème, utilisez l'option blob et convertissez le blob en texte. Cet exemple exécutera deux commandes. La chaîne JSL contenant les commandes utilise les caractères \[ et ]\ entre guillemets pour faciliter l'utilisation ultérieure de caractères spéciaux, s'ils s'avèrent nécessaires. Le point-virgule sépare les deux commandes Linux. Vous pouvez voir les valeurs d'intérêt en surbrillance jaune, suivies des symboles de degrés (pas B0).
RunProgram with the blob option returns binary data which might convert to UnicodeRunProgram avec l'option blob renvoie des données binaires qui pourraient être converties en Unicode
Créer la connexion à l'ordinateur Linux encore et encore est acceptable, mais pas idéal. La surcharge peut être évitée en la créant une seule fois. Je vais le faire en écrivant une boucle pour que l'ordinateur Linux s'exécute, avec un court délai. La fonction ReadFunction obtiendra toujours un blob, mais elle deviendra une véritable fonction JSL qui récupère des morceaux de texte de l'ordinateur Linux. Les morceaux sont réunis, analysés pour les valeurs intéressantes et les valeurs ajoutées à une table de données.
// open a data table to record results
dt = New Table( "temperature",
New Column( "time", Format( "hr:m:s", 13, 0 ) ),
New Column( "gpu" ),
New Column( "PhysicalID0" ),
New Column( "Core0" ),
New Column( "Core1" ),
New Column( "Core2" ),
New Column( "Core3" )
);
start = Tick Seconds(); // capture initial time to subtract out later
buffer = Char To Blob( "" ); // buffer several reads together; init to empty
rp = RunProgram( // launch the long-running external program; note the shell command "while [ 1 ]" and the "sleep 2"
executable( "plink" ),
options( {"netflix", "\[while [ 1 ]; do nvidia-settings -c :0 -q gpucoretemp; sensors; sleep 2; done]\"} ), // inxi -Fxz
readfunction(
Function( {this}, {},
While( this << canread,
buffer = buffer || (this << read( "blob" ));
Wait( 0.1 ); // try to grab up all of the output for each 2-second report
);
If( Length( buffer ) > 0, // not always
text = Blob To Char( buffer ); // there is a remote possibility a unicode sequence gets split here
buffer = Char To Blob( "" ); // reset empty
dt << addrow( 1 ); // build the table
dt:time = Tick Seconds() - start; // apply offset to get 0 time for start
dt:gpu = Num( Regex( text, "\[Attribute 'GPUCoreTemp' \(Netflix.local:0.0\): (\d+)]\", "\1" ) );
dt:PhysicalID0 = Num( Regex( text, "\[Physical id 0: \+(\d+)]\", "\1" ) );
dt:Core0 = Num( Regex( text, "\[Core 0: \+(\d+)]\", "\1" ) );
dt:Core1 = Num( Regex( text, "\[Core 1: \+(\d+)]\", "\1" ) );
dt:Core2 = Num( Regex( text, "\[Core 2: \+(\d+)]\", "\1" ) );
dt:Core3 = Num( Regex( text, "\[Core 3: \+(\d+)]\", "\1" ) );
//write("\!n", gpu," ",PhysicalID0," ",Core0," ",Core1," ",Core2," ",Core3 );
);
)
)
);
Wait( 10 ); // wait for a few rows before launching
dt << Graph Builder(
Size( 679, 444 ),
Show Control Panel( 0 ),
Variables(
X( :time ),
Y( :gpu ),
Y( :PhysicalID0, Position( 1 ) ),
Y( :Core0, Position( 1 ) ),
Y( :Core1, Position( 1 ) ),
Y( :Core2, Position( 1 ) ),
Y( :Core3, Position( 1 ) )
),
Elements( Smoother( X, Y( 1 ), Y( 2 ), Y( 3 ), Y( 4 ), Y( 5 ), Y( 6 ), Legend( 4 ), Lambda( 4.32912374502826 ) ) ),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "Temperatures" )} ),
Dispatch( {}, "X title", TextEditBox, {Set Text( "H:M:S" )} ),
Dispatch( {}, "Y title", TextEditBox, {Set Text( "Centigrade" )} )
)
);
Wait( 10000 ); // wait 10,000 seconds, then...
rp = 0; // kill it. it is in a loop.
The 5 non-GPU temperatures track togetherLes 5 températures non GPU se suivent ensemble
Deux épisodes de Firefly. Les 15 premières minutes consistaient à faire défiler des sélections à la recherche de quelque chose à regarder. Les dernières minutes, après la vidéo, ont été une dure boucle CPU. J'ai accidentellement terminé le programme avant 10 000 secondes.