1년 전 4K TV가 집에 돌아왔고, 마침내 지난주에 그 해상도로 구동할 수 있는 비디오 카드가 나왔습니다. 카드에는 거대한 방열판이 있지만 팬은 없습니다. 팬이 없다는 것은 열이 너무 많이 나지 않는다는 것을 의미하며(희망합니다) 이는 기존 250W 전원 공급 장치에 필요한 전력이 적다는 것을 의미합니다. 컴퓨터는 Linux를 실행하는데, 인터넷을 뒤져본 결과 케이스 내부의 온도 센서를 확인하는 명령을 찾았습니다. 녹색 넷플릭스 Linux 컴퓨터의 이름입니다.
nvidia-settings and sensors commands to show temperature온도를 표시하는 nvidia 설정 및 센서 명령
두 명령은 53C의 Nvidia(그래픽 카드) 온도와 46C와 53C 사이의 CPU 온도를 보여줍니다. 센서 명령은 또한 80C가 걱정되기 시작하는 동네의 시작임을 암시하는 것 같습니다. 현재 이 글을 작성하는 동안에는 비디오 카드가 유휴 상태이고 온도가 꽤 낮습니다. 전체 화면 4K 비디오를 표시하는 것은 훨씬 더 힘들고 온도도 올라갈 것입니다. 얼마나, 얼마나 빨리?
이를 확인하기 위해 JMP는 Linux 명령을 루프로 실행하여 결과를 기록하고 데이터가 수집됨에 따라 업데이트되는 그래프를 만듭니다. 마법은 RunProgram(JSL 함수)과 plink(Windows에서 실행되는 외부 프로그램, 퍼티 패키지의 일부)에 있습니다. 이것이 작동하려면 먼저 해야 할 일이 몇 가지 있습니다.
첫째, Linux 호스트 컴퓨터에는 SSH 서버가 실행되고 있어야 하며 적절한 보안이 유지되어야 합니다. 나는 다음과 같은 사이트를 이용했다. 이것 그리고 이것 이것을 해결하기 위한 것입니다.
다음으로 Windows 컴퓨터에 plink를 설치해야 합니다. 저는 msi 설치 프로그램을 선택했습니다 여기 그런 다음 읽어보세요 이것 plink가 어떻게 작동하는지 알아보세요.
마지막으로 키와 SSH 연결을 사용하도록 puttygen/putty/plink를 구성합니다(동일 이것 위에서부터) 비밀번호를 눈에 잘 띄지 않게 입력하세요.
이제 정말 간단한 테스트를 실행하여 모든 것이 제대로 작동하는지 확인하세요. 플링크 Windows 컴퓨터가 실행할 프로그램입니다(퍼티 설치의 일부). 넷플릭스 Putty 프로그램에서 내 Linux 컴퓨터 구성의 이름이기도 합니다.센서 Linux 컴퓨터가 실행할 프로그램의 이름입니다. 그리고 텍스트 RunProgram은 센서가 완료된 후 센서의 모든 텍스트 출력을 반환하도록 지시합니다.
Output of sensors command showing B0 for degree symbol도 기호에 대해 B0을 표시하는 센서 명령 출력
강조 표시된 B0는 도 기호여야 합니다. RunProgram은 실행 파일의 출력이 유니코드가 아닌 7비트 ASCII라고 가정합니다. 이 문제를 해결하려면 blob 옵션을 사용하고 blob을 텍스트로 변환하세요. 이 예에서는 두 가지 명령을 실행합니다. 명령이 포함된 JSL 문자열은 특수 문자가 필요할 경우 나중에 특수 문자를 더 쉽게 사용할 수 있도록 따옴표 안에 \[ 및 ]\ 문자를 사용합니다. 세미콜론은 두 개의 Linux 명령을 구분합니다. 관심 있는 노란색의 높은 조명 값과 학위 기호(B0 아님)를 볼 수 있습니다.
RunProgram with the blob option returns binary data which might convert to UnicodeBlob 옵션이 포함된 RunProgram은 유니코드로 변환될 수 있는 이진 데이터를 반환합니다.
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 together5개의 비GPU 온도가 함께 추적됩니다.
Firefly의 두 가지 에피소드. 처음 15분은 시청할 콘텐츠를 찾기 위해 선택 항목을 스크롤하는 시간이었습니다. 비디오 이후 마지막 몇 분은 하드 CPU 루프였습니다. 실수로 10,000초 전에 프로그램을 종료했습니다.