Linux
分类: LINUX
2014-11-28 18:51:52
为了量化perf采样的开销,本文详细分析了采样驱动的处理器开销以及对应用程序造成的干扰。另外需要说明的一点是,采样开销只是perf全部开销的一部分。位于用户空间的perf分析程序也具有一定开销,本文暂不讨论这部分开销。
本文在实验中采用的硬件平台为:
CPU:Intel(R) Xeon(R) E5530 @ 2.40GHz
微架构:Nehalem
内存:24GB
一个程序的CPU占用率是最常用的性能指标。但是内核自身并没有提供直接获取某个中断处理函数CPU占用率的机制。为了获取PMI处理函数的CPU占用率我们需要自己设计一个方法。 PMI中断实际上是一种NMI中断,不可被屏蔽。这就保证了PMU中记录的数据不会因为某种干扰而丢失。采样驱动在初始化时将PMI的处理函数挂在了NMI中断的通知链(Notifer Chain)上。当某次NMI中断发生时,内核会根据触发NMI的原因逐条处理通知链上的各个函数。 本文利用了Trace Event机制,在PMI处理函数的入口与出口处分别添加了一个Trace Event。那么每次处理PMI都会触发这两个Event。在用户空间,利用Perf Record便能够记录下这两个Event发生的时间戳。进入函数与退出函数之间的时间差便是该函数的处理时间。由此,我们将测试到的处理函数执行时间之和比上整个测试时间,便可以得到PMI中断处理函数的CPU占用率。进一步,我们可以认为这就是整个采样驱动的CPU占用率。在记录这两个Trace Event的同时,以不同的频率执行命令: $perf record -e cycles -F *** -a
从而使得PMU能够以不同的频率触发PMI。
为了分析perf record记录下的Trace Event事件,本文编写了Python分析脚本。对所有的采样数据进行了统计分析。得到结果如下:
表1. Perf的采样频率
Hz |
CPU Util |
---|---|
100 |
0.018035% |
500 |
0.0822545% |
2000 |
0.3114508% |
4000 |
0.5585349% |
100000 |
14.6878577% |
Perf的默认采样频率为4000Hz。当采样频率小于4000Hz时,由采样引入的CPU开销并不算高。
通过进一步分析可以看到CPU Utilization随采样频率的增长幅度大体符合线性。在本文采用的硬件平台上,CPU Utilization的增长因子可取为:delta= 0.1574313354。
CPU_util = Freq * delta
对于其它的硬件平台,如果要获取CPU Utilization的增长因子,可重复上述实验。
本文通过实际测试说明了perf采样驱动在不同采样频率下对应用程序的干扰程度。测试方法如下:编写一个应用程序,该程序运行10s。程序在无限循环中不断对一个变量累加。10s后输出循环的次数。在不同的采样频率下,记录了上述程序的循环次数。 测试结果如表2所示。
表2. Perf采样驱动对应用程序的干扰
Hz |
执行次数1 |
执行次数2 |
执行次数3 |
执行次数4 |
执行次数5 |
avg |
性能损耗 |
---|---|---|---|---|---|---|---|
0 |
14909533 |
14932823 |
14934853 |
14900052 |
14927378 |
14920927.8 |
0 |
100 |
14818452 |
14823337 |
14817366 |
14824549 |
14818770 |
14820494.8 |
0.67% |
500 |
14815118 |
14800701 |
14814506 |
14815243 |
14817493 |
14812612.2 |
0.73% |
2000 |
14785694 |
14772391 |
14782337 |
14736883 |
14783035 |
14772068 |
1% |
4000 |
14744654 |
14728685 |
14726230 |
14743028 |
14736320 |
14735783.4 |
1.24% |
100000 |
12816201 |
12777856 |
12799469 |
12788528 |
12818016 |
12800014 |
14.21% |
由表2中的数据可知,perf的采样频率越高对应用程序的干扰就越大。而此干扰,不仅仅是由于采样驱动占用了处理器,可能还会通过Cache,流水线等硬件资源干扰到应用程度的执行。在我们的测试环境下,当采样频率低于2000Hz时,对应用程序造成的干扰在1%以内。
本文分析了Perf采样驱动的处理器占占用率及其对应用程序的干扰。实验结果表明,这两项指标受到采样频率的制约。采样频率越高,这两项指标也越高。特别是采样驱动的处理器占用率基本相对于采样频率呈线性增长。当采样频率低于4000Hz时,perf采样驱动的处理器占用率低于0.56%。而此时,由于采样驱动的干扰造成应用程序的性能损耗在1.24%。用户可以根据自己的需求,参考本文的实验数据选择合适的采样频率。