Vor einem Jahr kam ein 4K-Fernseher nach Hause und letzte Woche endlich eine Grafikkarte, die ihn mit dieser Auflösung betreiben kann. Die Karte verfügt über einen riesigen Kühlkörper, aber keinen Lüfter. Kein Lüfter bedeutet nicht zu viel Hitze (hoffe ich), was bedeutet, dass weniger Strom vom alten 250-W-Netzteil benötigt wird. Auf dem Computer läuft Linux, und nachdem ich im Internet herumgestöbert habe, habe ich diese Befehle gefunden, um die Temperatursensoren im Inneren des Gehäuses zu überprüfen. Das Grün Netflix ist der Name des Linux-Computers.
nvidia-settings and sensors commands to show temperatureNVIDIA-Einstellungen und Sensoren-Befehle zum Anzeigen der Temperatur
Die beiden Befehle zeigen die Nvidia-Temperatur (Grafikkarte) bei 53 °C und die CPU-Temperatur(en) zwischen 46 °C und 53 °C an. Der Sensorbefehl scheint auch darauf hinzudeuten, dass 80 °C der Beginn der besorgniserregenden Gegend sind. Derzeit ist die Grafikkarte im Leerlauf, während dieser Beitrag geschrieben wird, und die Temperatur ist ziemlich niedrig. Es ist viel schwieriger, 4K-Videos im Vollbildmodus anzuzeigen, und die Temperatur steigt. Wie viel und wie schnell?
Um das herauszufinden, führt JMP die Linux-Befehle in einer Schleife aus, zeichnet die Ergebnisse auf und erstellt ein Diagramm, das aktualisiert wird, während die Daten erfasst werden. Die Magie liegt in RunProgram (einer JSL-Funktion) und plink (einem externen Programm, Teil des Putty-Pakets, das unter Windows läuft). Bevor dies funktioniert, müssen einige Dinge erledigt werden.
Zunächst muss auf dem Linux-Hostcomputer der SSH-Server ausgeführt und entsprechend gesichert werden. Ich habe Websites wie verwendet Das Und Das Dies, um es herauszufinden.
Als nächstes müssen Sie plink auf Ihrem Windows-Computer installieren. Ich habe den MSI-Installer ausgewählt Hier und dann lesen Das um herauszufinden, wie Plink funktioniert.
Konfigurieren Sie abschließend puttygen/putty/plink für die Verwendung der SSH-Verbindung mit den Schlüsseln (gleich Das von oben), damit Sie Ihr Passwort nicht offenkundig zur Schau stellen.
Führen Sie nun einen ganz einfachen Test durch, um zu sehen, ob alles an seinem Platz ist. Plink ist das Programm, das auf Ihrem Windows-Computer ausgeführt wird (Teil der Putty-Installation). Netflix ist auch der Name der Konfiguration meines Linux-Computers im Putty-Programm.Sensoren ist der Name des Programms, das auf dem Linux-Computer ausgeführt wird. Und Text weist RunProgram an, einfach die gesamte Textausgabe von Sensoren zurückzugeben, nachdem die Sensoren fertig sind.
Output of sensors command showing B0 for degree symbolAusgabe des Sensorbefehls mit B0 als Gradsymbol
Das hervorgehobene B0 sollte ein Gradsymbol sein. RunProgram geht davon aus, dass die Ausgabe einer ausführbaren Datei 7-Bit-ASCII und nicht Unicode ist. Um dies zu beheben, verwenden Sie die Blob-Option und konvertieren Sie den Blob in Text. In diesem Beispiel werden zwei Befehle ausgeführt. Der JSL-String, der die Befehle enthält, verwendet die Zeichen \[ und ]\ in den Anführungszeichen, um die spätere Verwendung von Sonderzeichen bei Bedarf zu erleichtern. Das Semikolon trennt die beiden Linux-Befehle. Sie können die gelb hervorgehobenen, interessanten Werte sehen, gefolgt von Gradsymbolen (nicht B0).
RunProgram with the blob option returns binary data which might convert to UnicodeRunProgram mit der Blob-Option gibt Binärdaten zurück, die möglicherweise in Unicode konvertiert werden
Das wiederholte Herstellen der Verbindung zum Linux-Computer ist in Ordnung, aber nicht ideal. Der Overhead kann durch einmaliges Erstellen vermieden werden. Ich werde dies tun, indem ich eine Schleife schreibe, die der Linux-Computer mit einer kurzen Verzögerung ausführen kann. Die ReadFunction erhält weiterhin einen Blob, wird aber zu einer tatsächlichen JSL-Funktion, die Textblöcke vom Linux-Computer zurückerhält. Die Blöcke werden zusammengefügt, auf interessante Werte analysiert und die Werte einer Datentabelle hinzugefügt.
// 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 togetherDie 5 Nicht-GPU-Temperaturen werden zusammen verfolgt
Zwei Episoden von Firefly. In den ersten 15 Minuten habe ich durch die Auswahl gescrollt und nach etwas gesucht, das ich mir ansehen konnte. Die letzten paar Minuten nach dem Video waren eine harte CPU-Schleife. Ich habe das Programm versehentlich vor 10.000 Sekunden beendet.