我想在执行高性能Linpack基准测试时测量两个插口机的温度和频率。
我编写了一个Shell脚本sensor.sh
,该脚本以sh sensors.sh &
在后台开始,然后进行基准测试。
for ((;;))
do
sensors | grep Core | awk '{print $3}' | tr '+' ' ' | tr '°C' ' ' | xargs >> temperature.dat
cat /proc/cpuinfo | grep "cpu MHz" | tr "cpu MHz : " " " | xargs >> frequency.dat
sleep .1
done
我得到了我的输出文件,但是时间戳彼此相隔不了0.1s。我猜系统很忙,而shell脚本进程却很少执行。 HPL表示它的运行时间约为1100秒,这一次我的temperature.dat文件生成了约4600个条目。
执行基准测试程序时,还有另一种方法可以测量温度和频率并将输出存储在.dat
文件中吗?
答案 0 :(得分:2)
您可以尝试以高优先级运行代码,因此它不会受到基准测试负载的影响。但是您需要以root用户身份运行才能使用负面的美感。
nice -n -10 bash
for ((;;))
do
sensors | grep Core | awk '{print $3}' | tr '+' ' ' | tr '°C' ' ' | xargs >> temperature.dat
cat /proc/cpuinfo | grep "cpu MHz" | tr "cpu MHz : " " " | xargs >> frequency.dat
sleep .1
done
exit
答案 1 :(得分:0)
您的脚本效率很低,在运行下一个sleep .1
之前,需要很多单独的进程来获取一些CPU时间,因此,是的,系统负载将使其运行频率降低。
此外,sensors
相对昂贵;也许使用命令行选项使其仅检查CPU温度。或者我认为可以直接从/proc
或/sys
中的文件获得CPU温度。
我认为没有参数的xargs
就像无用的cat
一样。
您可以对文本处理使用更高效的命令,这些命令需要更少的CPU时间,并且可以通过更少的单独进程进行管道传输来减少上下文切换。例如sensors
仅传送到一个执行所有文本处理的awk
命令中。还有sed -n
s / cpu MHz:// p {/proc/cpuinfo
>> frequency.dat`,以避免不必要地使用cat(和xargs)。
但这仍然会有一些开销。
您可以编写一个perl
脚本,该脚本从sensors
进行管道传输,然后关闭/重新打开/proc/cpuinfo
。
您可以让它检查当前时间并一直睡眠直到0.1
秒的下一个倍数。您也可以使用bash进行此操作,但是,它可以检查当前时间并保持睡眠状态这将需要运行更多的命令,并且您希望使基准测试的上下文切换尽可能少。