系统级性能分析工具 — Perfhtml
linux perf - 性能测试和优化工具:示例&应用java
从2.6.31内核开始,linux内核自带了一个性能分析工具perf,可以进行函数级与指令级的热点查找。linux
介绍:性能优化
Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。是Linux kernel自带的系统性能优化工具架构
它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操做系统相关性能指标的性能剖析。负载均衡
经常使用于性能瓶颈的查找与热点代码的定位。函数
优点:工具
与Linux Kernel的紧密结合,它能够最早应用到加入Kernel的new feature。而像OProfile, GProf等一般会“慢一拍”。post
pef能够用于查看热点函数,查看cashe miss的比率,从而帮助开发者来优化程序性能。
运行原理:
CPU周期(cpu-cycles):
是默认的性能事件,
是指CPU所能识别的最小时间单元,一般为亿分之几秒,
是CPU执行最简单的指令时所须要的时间,例如读取寄存器中的内容,也叫作clock tick。
Perf是一个包含22种子工具的工具集,如下是最经常使用的5种:
sw其实是内核的计数器,与硬件无关。
hw和cache是CPU架构相关的,依赖于具体硬件。
tracepoint是基于内核的ftrace,主线2.6.3x以上的内核版本才支持。
CPU-migrations:处理器迁移次数。Linux为了维持多个处理器的负载均衡,在特定条件下会将某个任务从一个CPU迁移到另外一个CPU。
page-faults:缺页异常的次数。当应用程序请求的页面还没有创建、请求的页面不在内存中,或者请求的页面虽然在内存中,但物理地址和虚拟地址的映射关系还没有创建时,都会触发一次缺页异常。另外TLB不命中,页面访问权限不匹配等状况也会触发缺页异常。
要用于实时分析各个函数在某个性能事件上的热度,可以快速的定位热点函数,包括应用程序函数、模块函数与内核函数,甚至可以定位到热点指令。
第一列:符号引起的性能事件的比例,默认指占用的cpu周期比例。
第二列:符号所在的DSO(Dynamic Shared Object),能够是应用程序、内核、动态连接库、模块。
第三列:DSO的类型。[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态连接库)。[k]表述此符号属于内核或模块。
第四列:符号名。有些符号不能解析为函数名,只能用地址表示。
Name:内核锁的名字。
aquired:该锁被直接得到的次数,由于没有其它内核路径占用该锁,此时不用等待。
contended:该锁等待后得到的次数,此时被其它内核路径占用,须要等待。
total wait:为了得到该锁,总共的等待时间。
max wait:为了得到该锁,最大的等待时间。
Callsite:内核代码中调用kmalloc和kfree的地方。
Total_alloc/Per:总共分配的内存大小,平均每次分配的内存大小。
Total_req/Per:总共请求的内存大小,平均每次请求的内存大小。
Hit:调用的次数。
Ping-pong:kmalloc和kfree不被同一个CPU执行时的次数,这会致使cache效率下降。
Frag:碎片所占的百分比,碎片 = 分配的内存 - 请求的内存,这部分是浪费的。
TASK:进程名和pid。
Runtime:实际的运行时间。
Switches:进程切换的次数。
Average delay:平均的调度延迟。
Maximum delay:最大的调度延迟。
还有一些适用于较特殊场景的工具, 好比内核锁、slab分配器、调度器,也支持自定义探测点。
[1]. Linux的系统级性能剖析工具系列,by 承刚
[2]. http://www.ibm.com/developerworks/cn/linux/l-cn-perf1/
[3]. http://www.ibm.com/developerworks/cn/linux/l-cn-perf2/
[4]. https://perf.wiki.kernel.org/index.php/Tutorial
介绍
经过采样的方式,给程序中cpu的使用状况进行“画像”
下载 gperftools:https://code.google.com/p/gperftools/downloads/detail?name=gperftools-2.0.tar.gz
搭配组件:
安装图形化分析工具kcachegrind:
查看profile结果:pprof工具
sw其实是内核的计数器,与硬件无关。