Hace un año llegó a casa un televisor 4K y, finalmente, la semana pasada, una tarjeta de video que puede manejarlo a esa resolución. La tarjeta tiene un disipador de calor enorme, pero no tiene ventilador. Sin ventilador significa que no hay demasiado calor (espero), lo que significa menos energía requerida de la antigua fuente de alimentación de 250W. La computadora ejecuta Linux y, después de buscar en Internet, encontré estos comandos para verificar los sensores de temperatura dentro de la carcasa. El verde netflix es el nombre de la computadora Linux.
nvidia-settings and sensors commands to show temperaturenvidia-settings and sensors commands to show temperaturenvidia-settings and sensors commands to show temperaturenvidia-settings and sensors commands to show temperatureComandos de sensores y configuración de nvidia para mostrar la temperatura
Los dos comandos muestran la temperatura de Nvidia (tarjeta gráfica) a 53 °C y la temperatura de la CPU entre 46 °C y 53 °C. El comando de los sensores también parece sugerir que 80°C es el comienzo de un vecindario que empieza a preocuparse. Actualmente, la tarjeta de video está inactiva mientras se escribe esta publicación y la temperatura es bastante baja. Es mucho más difícil mostrar videos 4K en pantalla completa y la temperatura aumentará. ¿Cuánto y a qué velocidad?
Para averiguarlo, JMP ejecutará los comandos de Linux en un bucle, registrará los resultados y creará un gráfico que se actualizará a medida que se recopilan los datos. La magia está en RunProgram (una función JSL) y plink (un programa externo, parte del paquete PuTTY, que se ejecuta en Windows). Antes de que esto funcione, hay algunas cosas que hacer.
Primero, la computadora host de Linux necesita que el servidor SSH esté en ejecución y debe estar protegido adecuadamente. Usé sitios como este y este esto para resolverlo.
A continuación necesitarás instalar plink en tu computadora con Windows. Elegí el instalador msi aquí y luego leer este para descubrir cómo funciona plink.
Finalmente, configure puttygen/putty/plink para usar la conexión ssh con las claves (lo mismo este desde arriba) para que no dejes tu contraseña a la vista.
Ahora ejecute una prueba realmente sencilla para ver si todo está en su lugar. enlace es el programa que ejecutará su computadora con Windows (parte de la instalación de PuTTY). netflix es también el nombre de la configuración de mi computadora Linux en el programa PuTTY.Sensores es el nombre del programa que ejecutará la computadora Linux. Y texto le dice a RunProgram que simplemente devuelva toda la salida de texto de los sensores una vez finalizados los sensores.
Output of sensors command showing B0 for degree symbolOutput of sensors command showing B0 for degree symbolOutput of sensors command showing B0 for degree symbolOutput of sensors command showing B0 for degree symbolSalida del comando de sensores que muestra B0 para el símbolo de grado
El B0 resaltado debería ser un símbolo de grado. RunProgram asume que la salida de un ejecutable es ASCII de 7 bits, no Unicode. Para solucionar este problema, utilice la opción blob y convierta el blob en texto. Este ejemplo ejecutará dos comandos. La cadena JSL que contiene los comandos utiliza los caracteres \[ y ]\ entre comillas para facilitar el uso de caracteres especiales más adelante, si resultan necesarios. El punto y coma separa los dos comandos de Linux. Puede ver los valores de interés resaltados en amarillo, seguidos de símbolos de grados (no B0).
RunProgram with the blob option returns binary data which might convert to UnicodeRunProgram with the blob option returns binary data which might convert to UnicodeRunProgram with the blob option returns binary data which might convert to UnicodeRunProgram with the blob option returns binary data which might convert to UnicodeRunProgram con la opción blob devuelve datos binarios que podrían convertirse a Unicode
Crear la conexión a la computadora Linux una y otra vez está bien, pero no es lo ideal. La sobrecarga se puede evitar creándola una vez. Voy a hacer esto escribiendo un bucle para que se ejecute la computadora con Linux, con un breve retraso. ReadFunction seguirá recibiendo un blob, pero se convertirá en una función JSL real que recupera fragmentos de texto de la computadora Linux. Los fragmentos se unen, se analizan en busca de valores de interés y los valores se agregan a una tabla de datos.
// 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 togetherThe 5 non-GPU temperatures track togetherThe 5 non-GPU temperatures track togetherThe 5 non-GPU temperatures track togetherLas 5 temperaturas sin GPU se siguen juntas
Dos episodios de Firefly. Los primeros 15 minutos fueron pasando por selecciones buscando algo que ver. Los últimos minutos, después del vídeo, fueron un duro bucle de CPU. Accidentalmente terminé el programa antes de los 10.000 segundos.