在 Linux 上进行基准测试时测量温度

Measuring temperature while benchmarking on Linux

我想在执行高性能 Linpack 基准测试时测量双插座机器的温度和频率。

我写了一个 shell 脚本 sensor.sh,我在后台使用 sh sensors.sh & 开始,然后进行基准测试。

for ((;;))
do
awk 'BEGIN{ORS=" ";} =="MHz" {print } END {print "\n"}' /proc/cpuinfo >> cpuf.dat

awk 'BEGIN{ORS=" ";} {print } END {print "\n"}' /sys/devices/platform/coretemp.?/hwmon/hwmon?/temp*_input >> cput.dat
 sleep .1
done

我得到了我的输出文件,但是时间戳彼此之间的间隔不是 0.1 秒。我猜系统很忙, shell 脚本进程不经常执行。 HPL 说它有大约 1100 秒的运行时间,此时我的 temperature.dat 文件生成了大约 4600 个条目。

有没有其他方法可以在执行基准程序时测量温度和频率并将输出存储在 .dat 文件中?

您可以尝试 运行将您的代码设置为高优先级,这样它就不会受到基准测试负载的影响。但是你需要 运行 作为 root 才能使用负面友好度。

nice -n -10 bash
for ((;;))
do
 sensors | grep Core | awk '{print }' | tr '+' ' '  | tr '°C' ' ' | xargs >> temperature.dat
 cat /proc/cpuinfo | grep "cpu MHz" | tr "cpu MHz : " " " | xargs >> frequency.dat
 sleep .1
done
exit

你的脚本效率很低,需要很多单独的进程,每个进程都需要一些 CPU 时间才能 运行 下一个 sleep .1 所以是的,系统负载将会减少 运行 的频率。

还有,sensors比较贵;也许使用命令行选项让它只检查 CPU 温度。或者我认为 CPU temp 可以直接从 /proc/sys 中的文件获得。


没有参数的

xargs 默认为 echo,因此它只是一种将空白字符(包括换行符)折叠为空格的低效方法。 (如果你使用 printf '%s\n' foo bar | strace -f xargs 你可以看到它实际上执行 fork + execve /bin/echo 而不是像你可以使用 sedtr 那样简单地打印输出本身。)

您可以使用更高效的文本处理命令,需要更少的 CPU 时间,并且通过更少的独立进程进行管道传输,从而减少上下文切换。例如sensors 仅通过一个 awk 命令进行所有文本处理。并且 sed -n 's/cpu MHz : //p' /proc/cpuinfo >> frequency.dat 避免无用地使用 cat(和 xargs)。

但这仍然会有一些开销。


您可以编写一个 perl 脚本,从 sensors 和 closes/reopens /proc/cpuinfo. 进行管道传输,这样可以避免所有进程启动时进行的系统调用。

您可以让它检查当前时间并休眠到下一个 0.1 秒的倍数,而不是休眠固定时间。 您可以使用bash,也是,但这将需要 运行 宁更多的命令,并且您希望为您的基准测试造成尽可能少的上下文切换。


您也可以或改为用当前时间标记每一行,这样您就知道每个样本的来源。要在不需要启动另一个外部进程的情况下执行此操作,请使用 bash 的 $EPOCHREALTIME。如果您仍在使用 bash 而不是 Perl,请喜欢 { echo -n "$EPOCHREALTIME "; awk ...; } >> cpuf.dat