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



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

我编写了一个 shell 脚本sensor.sh我从后台开始使用sh sensors.sh &,然后继续基准测试。

for ((;;))
do
awk 'BEGIN{ORS=" ";} $2=="MHz" {print $4} END {print "n"}' /proc/cpuinfo >> cpuf.dat
awk 'BEGIN{ORS=" ";} {print $1} END {print "n"}' /sys/devices/platform/coretemp.?/hwmon/hwmon?/temp*_input >> cput.dat
sleep .1
done

我得到了我的输出文件,但是时间戳彼此之间相距不到 0.1 秒。我想系统很忙,并且 shell 脚本进程不经常执行。HPL说它的运行时间为~1100s,在这个时候我的温度.dat文件生成了~4600个条目。

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

您的脚本效率非常低,需要大量单独的进程才能获得一些 CPU 时间,然后才能运行下一个sleep .1所以是的,系统负载会降低它的运行频率。

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


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

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

但这仍然会有一些开销。


您可以编写一个从sensors管道perl脚本,并关闭/重新打开/proc/cpuinfo这将避免进程启动进行的所有系统调用。

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


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

您可以尝试以高优先级运行代码,这样它受基准测试负载的影响较小。但是你需要以 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

最新更新