perf使用小结
来源:互联网 发布:网络规划设计师好考吗 编辑:程序博客网 时间:2024/06/06 05:28
转载请标明出处floater的csdn blog,http://blog.csdn.net/flaoter
参考文档:
1. https://perf.wiki.kernel.org/index.php/Tutorial
2. https://en.wikipedia.org/wiki/Perf_(Linux)
3. Linux man pages
4. http://www.ibm.com/developerworks/cn/linux/l-cn-perf1/
5. Cortex-A7 MPCore Technical Reference Manual
6. ARM Cortex-A53 MPCore Processor Technical Reference Manual
1 Introduction
Perf是Linux平台一款性能分析工具,它的实现依赖于一个性能分析架构的内核子系统,并在应用层提供了简洁的命令行接口。
Perf可以分析指定应用程序的性能问题,也可以用来分析内核的性能问题。性能分析是基于内核提供的perf_events接口实现的,支持的events包括软件事件和硬件事件。软件事件分为
1. software events,例如context-switch, minor-faults,它们是完全的内核计数器。
2. tracepoint events, 内核代码中提供的hook,使能后可以在特定的代码被运行时被触发。
硬件事件是Performance Monitoring Unit(PMU) 事件,它是处理器提供的一组计算处理器行为的事件,例如cpu-cycles, cache-misses。
下面是perf命令的接口,可以看出它支持十几个命令。
# ./perf The most commonly used perf commands are: annotate Read perf.data (created by perf record) and display annotated code archive Create archive with object files with build-ids found in perf.data file bench General framework for benchmark suites buildid-cache Manage build-id cache. buildid-list List the buildids in a perf.data file diff Read two perf.data files and display the differential profile evlist List the event names in a perf.data file inject Filter to augment the events stream with additional information kmem Tool to trace/measure kernel memory(slab) properties kvm Tool to trace/measure kvm guest os list List all symbolic event types lock Analyze lock events probe Define new dynamic tracepoints record Run a command and record its profile into perf.data report Read perf.data (created by perf record) and display the profile sched Tool to trace/measure scheduler properties (latencies) script Read perf.data (created by perf record) and display trace output stat Run a command and gather performance counter statistics test Runs sanity tests. timechart Tool to visualize total system behavior during a workload top System profiling tool. See 'perf help COMMAND' for more information on a specific command.
可通过执行常用命令perf list获得当前环境支持的事件,关于事件在下节进行了详细的介绍。
2 Events
2.1 Hardware events
PMU hardware evetns是CPU厂商提供的,不同厂商提供的事件可能不同,本文只关注ARM CPU。PMU是ARM debug架构的一部分,是ARM架构的可选功能,但是ARM强烈建议包含此功能。它有三个版本PMUv1,PMUv2和PMUv3。Cortext-A7中使用的是PMUv2,Cortex-A53应用的是PMUv3架构。
图1显示了cortex-A7的PMU主要模块,此处理器提供一个64bit的cycle counter和四个32bit 的performance counter。Cycle counter对处理器的clock进行计数,performance counter可以对处理器支持的任意事件进行计数。
PMU的counter可以通过Count Enable Set/Clear Event Selection等寄存器进行控制。这些寄存器可以通过System control processor或外部的APB接口进行访问,此外如芯片支持还可以通过memory map的方式进行访问。
当一个PMU counter溢出时会生成溢出中断,发出nPMUIRQ信号,可将此信号连到处理器进行中断处理。软件可以通过向counter写初始值的方式来控制中断到来的频率,interrupt handler必须对中断状态进行复位。
Linux内核对支持的事件counter进行了划分,通过perf list命令可以明确区分出来:
PERF_TYPE_HARDWARE,
PERF_TYPE_SOFTWARE,
PERF_TYPE_TRACEPOINT,
PERF_TYPE_HW_CACHE,
PERF_TYPE_RAW,
PERF_TYPE_BREAKPOINT
PERF_TYPE_SOFTWARE和PERF_TYPE_TRACEPOINT为上文中提到的软件事件,PERF_TYPE_HARDWARE, PERF_TYPE_HW_CACHE和PERF_TYPE_RAW都是硬件事件。PERF_TYPE_HARDWARE, PERF_TYPE_HW_CACHE为通用型的事件,在所有版本的处理器上的都支持,它们不代表真正的处理器支持的事件,与真正的事件有一个映射关系的过程。PERF_TYPE_RAW为特定型的事件,直接对应处理器spec列出的支持的事件,即为raw类型。 有关PMU寄存器和PERF支持的事件及描述等详细信息可以通过查看arm spec获取。
2.2 Software Events
软件计数器,记录如下系统行为:
cpu-clock [Software event] task-clock [Software event] page-faults OR faults [Software event] minor-faults [Software event] major-faults [Software event] context-switches OR cs [Software event] cpu-migrations OR migrations [Software event] alignment-faults [Software event] emulation-faults [Software event]
2.3 Tracepoint Events
Tracepoint在内核源码中默认大部分没有被使能,一旦使能,可以在特定的代码被运行时触发。假如想知道内核内存管理模块的行为,便可以利用在slab分配器中的tracepoint,当内核运行到这些tracepoint时,便可以通知内核。
3 Perf工具使用
使用示例:
perf stat命令用于生成事件的统计信息,如下示例为对dd命令的统计结果,如果没有指定特定的事件,将对如下通用型事件进行统计。
perf stat -B dd if=/dev/zero of=/dev/null count=10000001000000+0 records in1000000+0 records out512000000 bytes (512 MB) copied, 0.956217 s, 535 MB/s Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000': 5,099 cache-misses # 0.005 M/sec (scaled from 66.58%) 235,384 cache-references # 0.246 M/sec (scaled from 66.56%) 9,281,660 branch-misses # 3.858 % (scaled from 33.50%) 240,609,766 branches # 251.559 M/sec (scaled from 33.66%) 1,403,561,257 instructions # 0.679 IPC (scaled from 50.23%) 2,066,201,729 cycles # 2160.227 M/sec (scaled from 66.67%) 217 page-faults # 0.000 M/sec 3 CPU-migrations # 0.000 M/sec 83 context-switches # 0.000 M/sec 956.474238 task-clock-msecs # 0.999 CPUs 0.957617512 seconds time elapsed
可通过-e指定特定的事件统计,可通过-p监测指定进程,-t监测指定线程,-C对指定cpu进行监测,-a对所有cpu进行统计。
./perf stat -e cache-misses -C 0 -B dd if=/dev/zero of=/dev/null count=10000001000000+0 records in1000000+0 records out512000000 bytes transferred in 5.882 secs (87045222 bytes/sec) Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000': 101365 cache-misses 5.917509880 seconds time elapsed
Cortex A53 trm中事件0x03的定义是L1D_CACHE_REFILL
./perf stat -e r003 -C 0 -B dd if=/dev/zero of=/dev/null count=10000001000000+0 records in1000000+0 records out512000000 bytes transferred in 6.021 secs (85035708 bytes/sec) Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000': 80520 raw 0x3 6.056482303 seconds time elapsed
4 用户态开发
4.1 用户态接口
- 系统调用
int perf_event_open(struct perf_event_attr *attr, pid_t pid, int cpu, int group_fd, unsigned long flags);
返回值为文件描述符。
2. read/write/mmap/close/fcntl/ioctl/poll
使用系统调用返回的文件描述符,正常操作。
- perf使用小结
- Perf使用
- perf使用1
- perf使用2
- perf使用1
- perf命令使用
- perf 使用教程
- centos perf kvm使用
- perf使用教程
- perf工具使用
- perf
- perf
- perf
- perf
- perf
- perf
- perf
- perf
- android线程管理一(进程与线程)
- oracle的USER01.DBF剪切走造成的错误以及解决办法
- node.js 使用express生成网站基本结构,默认是jade?如何切换成ejs
- 用java做一个简单的万年历
- Spring Boot构建RESTful API与单元测试
- perf使用小结
- 黑科技:WiFi霸屏神器,线下高效引流解决方案
- 练习题1
- openresty在access_log打印自定义变量
- gulp
- 图解集合7:红黑树概念、红黑树的插入及旋转操作详细解读
- 【水】高精度下进位的处理方法
- CSDN-markdown使用说明
- #POJ2393#Yogurt factory(贪心)