几句话说清楚16:如何构建零干扰CPU Benchmark环境

CPU性能测试对环境的要求

即便是硬件配置完全一样,操作系统相同,工作负载也相同的硬件平台,性能测试的结果也可能会因为各项配置的不同出现较大出入。

除了硬件的Hyper Thread/Turbo等特性之外,OS对进程的调度、中断等等也可能会产生影响。当然如果你要测试的工作负载还要和网络、存储交互的话,那么就还需要把他们放在一起综合考虑。

这里的讨论只限于Linux系统。

几种手段

识别系统架构

先看一下系统NUMA的情况,以及与要测试的工作负载相关的硬件资源分布情况。选用合理的测试配置(e.g. CPU核与网卡在同一个NUMA节点上)。

配置scaling_governor

scaling_governor配成performance是一个比较常用的手段。

echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

可以仅配置参与测试的CPU核(cpu*),也可以全部配置。另有cpupower工具可以协助完成,相关资料可以自行man cpupower

关闭Hyper Thread

Intel的CPU如果打开Hyper Thread,同一个CPU核中有很多流水线资源是两个Thread共享的。详情可以参见Skylake微架构剖析系列文章。如果能操作BIOS,最好就是直接关闭Hyper Thread。如果不方便操作BIOS或者只想关闭与测试有关的CPU核的Hyper Thread也可以用:

查看该CPU核的siblings列表:

/sys/devices/system/cpu/cpuN/topology/thread_siblings_list

看到另外那个CPU X之后:

echo 0 > /sys/devices/system/cpu/cpuX/online

关闭Turbo

并不是说Turbo不好,其实Trubo能比较显著地提高性能,但我们这里追求的是一个”纯净”的测试环境,需要尽量排除Trubo在频率升降过程中产生的误差干扰。

echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo

屏蔽内核干扰

内核有些时候也会对测试结果产生干扰,比如用户/内核线程到参与测试的CPU核,或者给CPU分配网卡等设备的中断等等。这些都有相应的内核参数可以配置,在这里推荐一个简单点的工具:

cpuset:https://github.com/lpechacek/cpuset

那么预留出参与测试的CPU核就比较简单了:

cset shield -c N1,N2 -k on

N1,N2就是CPU的编号。

查看和分配中断的方法可以参考这篇

执行要测试的负载可以用taskset也可以继续使用cset e.g.

cset shield --exec -- perf stat -r 10 <cmd>

关闭ASLR

ASLR(Address Space Layout Randomization)是一种安全机制,但可能会引入性能下降。我本人没有太深入研究具体原因,但可以参考一些现有的资料e.g.On the Effectiveness of Address-Space Randomization

Implementations of WX on CPUs whose memory-management units lack a per-page execute bit, for example, current x86 chips, incur a significant performance penalty.

关闭的方法:

echo 0 > /proc/sys/kernel/randomize_va_space

© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero