linux下程序的性能分析

本来觉得linux下性能分析只是一系列工具,也没什么难点。后来发现几个工具中间,各有优缺点。

稍微介绍下吧。

gprof:

Linux性能评测工具之一:gprof篇

这个工具比较轻量级,能看到所有的函数调用链,和函数运行时间,原生是只支持单线程监控的,通过文中的方法,可以支持多线程

这是最傻瓜的工具了,也不支持内核下的调用情况,能做最简单的分析

Perf:

Perf -- Linux下的系统性能调优工具,第 1 部分

基本这样使用即可

perf record –e cpu-clock ./t1 
perf report

比较复杂一点的监控程序,缺点是在虚拟机下,大部分的时间消耗会出现在_spin_unlock_irqrestore这个函数上

stackoverflow搜了下,有人也提出了这个问题

_spin_unlock_irqrestore() has very high sampling rate in my kvm, why?

根据老外的说法,IRQs禁用的时候,perf的中断其实没有运行而在排队等待,而中断钩子会监视唤醒时运行的函数,大部分情况下是_spin_unlock_irqrestore

I know that it can be done with oprofile (perf's predecessor) by changing the makefile, but don't know about perf.

搜了下,perf没看到比较详细的文档,于是尝试使用oprofile

oprofile:

这个工具很强大,最关键是他不会打断程序的使用,就是装起来很麻烦,需要编译内核来支持

Oprofile:CPU性能分析工具指南

linux性能分析工具oprofile的安装与使用

用 OProfile 彻底了解性能

除此之外oprofile在vmware下需要开启Timer Interrupt模式,这个模式详细信息参考链接中第二篇文章。

具体开启是这样的:

# opcontrol --deinit
# modprobe oprofile timer=1
# echo "options oprofile timer=1" >> /etc/modprobe.conf
然后就可以了
# opcontrol --start