此文件中也摘要了其他网站部分内容
备注:仅适用perf命令,也能看到性能信息,火焰图会更加直观。当适用产生火焰图比较费劲时,可直接适用perf命令看性能信息
第一、 查看linux系统是否支持perf
如果支持linux系统,linux内核必须让
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_USE_VMALLOC=y
在已运行中的linux系统中,使用"#zcat /proc/config.gz",命令可现实所有的配置项状态。
在内核源码的“.config”,可查看CONFIG_HAVE_PERF_EVENTS和CONFIG_PERF_USE_VMALLOC的配置项状态
第二、编译出perf
在内核源码目录,进入tools/perf目录,在该目录下执行“make ; make install”,将会产生perf执行文件。
第三、perf的简单使用
#perf list
列出所有可记录的事件。
#perf stat ./aa.bin
执行后Crl+c会出现一下内容
Performance counter stats for './aa.bin':
396.000000 task-clock (msec) # 0.018 CPUs utilized
1,893 context-switches # 0.005 M/sec
3 cpu-migrations # 0.008 K/sec
740 page-faults # 0.002 M/sec
358,181,130 cycles # 0.904 GHz
156,515,885 instructions # 0.44 insn per cycle
23,186,645 branches # 58.552 M/sec
1,684,306 branch-misses # 7.26% of all branches
21.836086363 seconds time elapsed
Task-clock-msecs:CPU 利用率,该值高,说明程序的多数时间花费在 CPU 计算上而非 IO。
Context-switches:进程切换次数,记录了程序运行过程中发生了多少次进程切换,频繁的进程切换是应该避免的。
Cache-misses:程序运行过程中总体的 cache 利用情况,如果该值过高,说明程序的 cache 利用不好
CPU-migrations:表示进程 t1 运行过程中发生了多少次 CPU 迁移,即被调度器从一个 CPU 转移到另外一个 CPU 上运行。
Cycles:处理器时钟,一条机器指令可能需要多个 cycles,
Instructions: 机器指令数目。
IPC:是 Instructions/Cycles 的比值,该值越大越好,说明程序充分利用了处理器的特性。
Cache-references: cache 命中的次数
Cache-misses: cache 失效的次数。
#perf record – e cpu-clock – g ./aa.bin
输出内容如下:
Samples: 1K of event 'cpu-clock', Event count (approx.): 395000000
Children Self Command Shared Object Symbol ◆
+ 33.80% 0.13% dm.bin [kernel.kallsyms] [k] handle_sys64 ▒
15.57% 15.57% dm.bin libc-2.20.so [.] _loop_32B ▒
+ 9.56% 0.19% dm.bin [kernel.kallsyms] [k] do_sys_open ▒
+ 9.49% 0.06% dm.bin [kernel.kallsyms] [k] sys_write ▒
+ 9.30% 0.25% dm.bin [kernel.kallsyms] [k] vfs_write ▒
+ 8.29% 0.06% dm.bin [kernel.kallsyms] [k] path_openat ▒
+ 8.29% 0.00% dm.bin [kernel.kallsyms] [k] do_filp_open ▒
+ 7.97% 0.00% dm.bin [kernel.kallsyms] [k] do_sync_write ▒
+ 7.78% 0.19% dm.bin [kernel.kallsyms] [k] ext4_file_write ▒
+ 7.59% 0.13% dm.bin [kernel.kallsyms] [k] generic_file_aio_write ▒
+ 7.47% 0.25% dm.bin [kernel.kallsyms] [k] __generic_file_aio_write ▒
+ 7.03% 0.19% dm.bin [kernel.kallsyms] [k] vfs_fstatat ▒
+ 6.96% 0.06% dm.bin [kernel.kallsyms] [k] sys_newstat ▒
6.52% 6.52% dm.bin libc-2.20.so [.] _IO_vfscanf ▒
+ 6.33% 2.15% dm.bin [kernel.kallsyms] [k] link_path_walk ▒
+ 6.01% 0.00% dm.bin [kernel.kallsyms] [k] user_path_at_empty ▒
+ 5.44% 5.44% dm.bin [kernel.kallsyms] [k] arch_local_irq_restore ▒
+ 5.32% 0.25% dm.bin [kernel.kallsyms] [k] generic_file_buffered_write ▒
+ 4.75% 0.06% dm.bin [kernel.kallsyms] [k] filename_lookup ▒
+ 4.68% 0.25% dm.bin [kernel.kallsyms] [k] path_lookupat ▒
+ 4.56% 0.32% dm.bin [kernel.kallsyms] [k] do_last
通过将光标移动到前面有“+”号的行,可将此行展开。“-”标示已处于展开状态,若没有符号,标示无法展开。
“childern”列:指示该方法的字方法占用的百分比。
“self”列:标示该方法出子函数外占用的百分比(不包含被调用函数的百分比)
第 三、perf记录进程性能事件(假设进程PID:18263)
#perf record -F 99 -p 18263 -g -- sleep 60
命令执行后会产生perf.data进程事件文件
#perf script > out.perf
对perf.data文件进行处理产生out.perf文件
第四、系统须安装perl工具,解析perl脚本
第五、FlameGraph工具使用
从网站https://github.com/brendangregg/FlameGraph下载FlameGraph,下载后的文件名为解压FlameGraph-master.zip,解压zip文件,得到解压FlameGraph-master目录。
FlameGraph为perl脚本工具,可对perf产生的数据进行处理,产生火焰图。执行如下命令可产生火焰图,out.svg即为最终产生的火焰图。
FlameGraph-master/stackcollapse-perf.pl out.perf > out.folded
FlameGraph-master/flamegraph.pl out.folded > out.svg