Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1481437
  • 博文数量: 228
  • 博客积分: 1698
  • 博客等级: 上尉
  • 技术积分: 3241
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-24 21:49
个人简介

Linux

文章分类

全部博文(228)

文章存档

2017年(1)

2016年(43)

2015年(102)

2014年(44)

2013年(5)

2012年(30)

2011年(3)

分类: LINUX

2014-11-28 18:51:52

转自:http://kernel.taobao.org/index.php/Documents/Perf_performance_analysis

内核中的Perf采样主要由PMI(Performance Monitor Interrupt)中断驱动。当某个PMU计数器溢出时,便触发PMI中断。采样驱动在此时记录IP、PID、TID等采样信息,并将采样信息保存在Ring Buffer中。采样信息具体包含的数据由用户在注册性能事件时指定。对PMI中断的处理过程正是采样驱动的开销来源。当我们对某个系统或应用程序进行性能剖析时,必须要考虑到perf等剖析工具的自身开销对系统或应用程序造成的影响。当然,这种影响越小越好。而perf采用的采样机制存在采样频率的问题。采样频率越高,得到的剖析结果就越可信,但是采样过程对系统造成的干扰就越高。反之,剖析结果的可信度就会降低,但是采样过程对系统的干扰也将减小。这里讲的剖析结果的可信度是指某次性能事件的发生与程序符号(函数名)之间的关联是否准确。


为了量化perf采样的开销,本文详细分析了采样驱动的处理器开销以及对应用程序造成的干扰。另外需要说明的一点是,采样开销只是perf全部开销的一部分。位于用户空间的perf分析程序也具有一定开销,本文暂不讨论这部分开销。

本文在实验中采用的硬件平台为:

CPU:Intel(R) Xeon(R) E5530 @ 2.40GHz

微架构:Nehalem

内存:24GB

perf采样驱动的CPU占用率

一个程序的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采样驱动对应用程序的干扰

本文通过实际测试说明了perf采样驱动在不同采样频率下对应用程序的干扰程度。测试方法如下:编写一个应用程序,该程序运行10s。程序在无限循环中不断对一个变量累加。10s后输出循环的次数。在不同的采样频率下,记录了上述程序的循环次数。 测试结果如表2所示。

表2. Perf采样驱动对应用程序的干扰

Hz
执行次数1
执行次数2
执行次数3
执行次数4
执行次数5
avg
性能损耗

14909533 
14932823 
14934853 
14900052 
14927378 
14920927.8 

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%。用户可以根据自己的需求,参考本文的实验数据选择合适的采样频率。

阅读(3463) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~