1 年前に 4K テレビが登場し、ついに先週、その解像度でテレビを駆動できるビデオ カードが登場しました。 このカードには巨大なヒートシンクが付いていますが、ファンはありません。 ファンがないということは、熱があまりかからないことを意味し(そう願っています)、つまり、昔の 250W 電源から必要な電力が少なくなるということです。 このコンピューターは Linux を実行しており、インターネットを調べたところ、ケース内の温度センサーをチェックする次のコマンドを見つけました。 緑Netflix Linux コンピュータの名前です。
nvidia-settings and sensors commands to show temperature温度を表示するための nvidia-settings とセンサーのコマンド
2 つのコマンドは、Nvidia (グラフィックス カード) の温度を 53 ℃、CPU の温度を 46 ℃ ~ 53 ℃ で表示します。 センサー コマンドは、80℃が心配し始める付近の始まりであることを示唆しているようです。 この記事を書いている現在、ビデオ カードはアイドリング状態であり、温度はかなり低いです。 4Kビデオを全画面表示するとかなり負荷がかかり、温度が上昇します。 どれくらいの量で、どのくらいの速度でしょうか?
これを確認するために、JMP は Linux コマンドをループで実行し、結果を記録し、データの収集に応じて更新されるグラフを作成します。 この魔法は、RunProgram (JSL 関数) と plink (Windows 上で実行される外部プログラム、Putty パッケージの一部) にあります。これが機能する前に、いくつかのことを行う必要があります。
まず、Linux ホスト コンピューターでは SSH サーバーが実行されており、適切に保護されている必要があります。 のようなサイトを利用しましたこれそしてこれこれはそれを解明するためです。
次に、Windows コンピューターに plink をインストールする必要があります。 私はmsiインストーラーを選択しましたここそれから読んでくださいこれplink がどのように機能するかを理解するために。
最後に、キーで ssh 接続を使用するように puttygen/putty/plink を設定します (同じです)これ上から) パスワードを目に見えるところに置かないようにします。
次に、非常に簡単なテストを実行して、すべてが適切に配置されているかどうかを確認します。 プリンクは、Windows コンピュータが実行するプログラムです (Putty インストールの一部)。 Netflixこれは、Putty プログラム内の Linux コンピューターの構成の名前でもあります。センサーLinux コンピュータが実行するプログラムの名前です。 そして文章センサーが終了した後、センサーからのすべてのテキスト出力を返すように RunProgram に指示します。
Output of sensors command showing B0 for degree symbol度記号の B0 を示すセンサー コマンドの出力
ハイライト表示された B0 は度記号である必要があります。 RunProgram は、実行可能ファイルの出力が Unicode ではなく 7 ビット ASCII であると想定します。 これを修正するには、blob オプションを使用し、blob をテキストに変換します。 この例では 2 つのコマンドを実行します。 コマンドを保持する JSL 文字列では、引用符内に \[ および ]\ 文字を使用して、後で特殊文字が必要になった場合に簡単に使用できるようにします。 2 つの Linux コマンドはセミコロンで区切られます。 黄色で強調表示された対象の値と、その後に度記号 (B0 ではありません) が表示されます。
RunProgram with the blob option returns binary data which might convert to Unicodeblob オプションを指定した RunProgram は、Unicode に変換される可能性があるバイナリ データを返します
Linux コンピューターへの接続を何度も作成することは問題ありませんが、理想的ではありません。 一度作成することでオーバーヘッドを回避できます。 これを行うには、Linux コンピューターが少し遅れて実行するループを作成します。 ReadFunction は引き続き BLOB を取得しますが、Linux コンピューターからテキストのチャンクを取得する実際の JSL 関数になります。 チャンクが結合され、対象の値が解析されて、値がデータ テーブルに追加されます。
// 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 togetherGPU 以外の 5 つの温度が一緒に追跡されます
ファイアフライの2話。 最初の 15 分間は、見たいものを探して選択項目をスクロールしていました。 ビデオ後の最後の数分間はハードな CPU ループでした。 誤って 10,000 秒前にプログラムを終了してしまいました。