perf-tools简介
一个开发中的Linux性能测试使用的工具,能够收集ftrace和perf_events中乱七八糟的参数。ftrace和perf都是Linux中的内核跟踪工具,包含在Kernel中。ftrace在多数系统中已经存在,但perf可能需要添加额外的软件包。
这些工具设计的很容易安装(较少的依赖),能提供详细直观的性能参数,并且操作简单。本教程由Brendan Gregg (DTraceToolkit的作者)创建。
这些工具以服务的方式运行在内核中,因此多数工具都有说明手册(man帮助手册),并且工具需要保证内核特性向前兼容或者能够和新的跟踪工具集成。
本教程适用于Linux3.2及更新的版本。Linux2.6.x版本请参考警告页。
演示
这些工具在USENIX LISA 2014 presentation: Linux Performance Analysis: New Tools and Old Secrets中有相关演示
- PPT:http://www.slideshare.net/brendangregg/linux-performance-analysis-new-tools-and-old-secrets
- 视频:https://www.usenix.org/conference/lisa14/conference-program/presentation/gregg
主题
使用ftrace:
- iosnoop: 追踪磁盘IO细节和潜在问题。示例。
- iolatency: 柱状图显示磁盘IO状况。示例。
- execsnoop: 追踪exec()进程的状态和命令行参数。示例。
- opensnoop: 追踪open()系统调用情况显示文件名。示例。
- killsnoop: 追踪kill()信号显示进程和信号详细信息。示例。
- fs/cachestat: Linux页缓存的命中/丢失统计。示例。
- net/tcpretrans: 显示TCP的重发情况,包括地址等详细信息。示例。
- system/tpoint: 根据给定的追踪点追踪。示例。
- kernel/funccount: 显示内核函数的调用次数,支持通配符匹配。示例。
- kernel/functrace: 跟踪内核函数的调用,支持通配符匹配。示例。
- kernel/funcslower: 跟踪调用慢于设定阈值的内核函数。示例。
- kernel/funcgraph: 图表方式显示某个内核函数的调用,包括子函数和调用时间。示例。
- kernel/kprobe: 动态地追踪某个内核函数的调用和返回,及其参数。示例。
- user/uprobe: 动态地追踪某个用户函数的调用和返回,及其参数。示例。
- tools/reset-ftrace: 必要时重置ftrace的状态(正常情况下不会使用该功能)。示例。
使用perf_events:
使用eBPF:
- 未来功能的预览,参考bcc工具的章节。
截图
显示新进程及其参数:
#./execsnoop
Tracing exec()s. Ctrl-C to end.
Instrumenting sys_execve
PID PPID ARGS
22497 22485 gawk -v o=1 -v opt_name=0 -v name= -v opt_duration=0 [...]
22524 22488 cat -v trace_pipe
22670 1822 /usr/sbin/sshd -D -R
22717 22670 /usr/sbin/unix_chkpwd root nonull
22718 22670 /usr/sbin/unix_chkpwd root chkexpiry
22720 718 /usr/bin/pkla-check-authorization gdm true true org.freedesktop.packagekit.trigger-offline-update
22722 718 /usr/bin/pkla-check-authorization gdm true true org.freedesktop.packagekit.trigger-offline-update
22724 718 /usr/bin/pkla-check-authorization gdm true true org.freedesktop.packagekit.trigger-offline-update
22725 22670 -bash
从complate队列中的数量来分析块设备IO潜在问题:
#./iolatency -Q
Tracing block I/O. Output every 1 seconds. Ctrl-C to end.
>=(ms) .. <(ms) : I/O |Distribution |
0 -> 1 : 5 |######################################|
>=(ms) .. <(ms) : I/O |Distribution |
0 -> 1 : 5 |######################################|
>=(ms) .. <(ms) : I/O |Distribution |
0 -> 1 : 24 |######################################|
1 -> 2 : 1 |## |
2 -> 4 : 0 | |
4 -> 8 : 3 |#####
跟踪block:block_rq_insert跟踪点,只显示读取时内核栈信息:
#./system/tpoint -s block:block_rq_insert 'rwbs ~ "*R*"'
Tracing block:block_rq_insert. Ctrl-C to end.
kworker/3:2-26941 [003] d... 250230.367391: block_rq_insert: 0,0 R 8 (4a 01 00 00 10 00 00 00 08 00) 0 + 0 [kworker/3:2]
kworker/3:2-26941 [003] d... 250230.367423: <stack trace>
=> blk_execute_rq
=> scsi_execute
=> scsi_execute_req_flags
=> sr_check_events
=> cdrom_check_events
=> sr_block_check_events
=> disk_check_events
=> disk_events_workfn
=> process_one_work
=> worker_thread
=> kthread
统计以“bio_”开始的内核函数的调用,时间间隔为1秒:
#./kernel/funccount -i 1 'bio_*'
Tracing "bio_*"... Ctrl-C to end.
FUNC COUNT
bio_advance 5
bio_end_flush 5
bio_get_nr_vecs 6
bio_integrity_enabled 6
bio_add_page 14
bio_disassociate_task 15
bio_endio 15
bio_alloc_bioset 17
bio_put 20
[...]
在工具的example/目录中还有许多示例,也可以查阅man手册。
准备
本节力求简洁,更多Linux3.2服务器调试信息的细节请参考man手册。
ftrace
FTRACE集成在内核中,所以在系统中可能已经存在并且可以使用。FTRACE在2.6.27版本内核中首次集成,需要参数CONFIG_FTRACE和其他FTRACE工具依赖的选项。有些工具(如cunccount)还要依赖CONFIG_FUNCTION_PROFILER选项。
perf_events
需要首先安装“perf”命令使用的工具软件,位于linux-tool-common软件包中。安装完成后,perf可能会提示安装一个额外的linux工具(linux-tool-kernel_version)。perf也可以从内核源码中的tools/perf中编译安装。参考perf_events要求来获取使用perf_events完整功能的详细信息。
debugfs
需要内核选项CONFIG_DEBUG_FS的支持,与FTRACE一样,debugfs可能已经在系统中启用(2.6.10-rc3之后的内核)。debugfs需要被挂载后使用:
# mount -t debugfs none /sys/kernel/debug
awk
工具中的脚本大量使用了awk工具,根据功能目的会选择使用mawk或gawk:mawk用来缓存输出(更快的速度),gawk用来同步输出(更有效的分组输出)。
安装
工具本身使一些脚本,可以这样来抓取所有内容:
git clone --depth 1 https://github.com/brendangregg/perf-tools
或者使用github源URL获取单个的脚本:
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop
警告
Ftrace在Linux2.6.27版本内核中首次集成,perf_events则是在2.6.31版本中加入。早前的版本可能存在一些缺陷,这些锁或致命的问题在2.6.32系列内核中被发现。包括CentOS6.x,如果需要分析旧版本的系统内核,此工具需要在容错环境中使用,如实验测试环境。但是在Linux3.2及之后的内核中没有问题。
使用此工具也存在一些限制,具体信息如下。
内部开销
perf_events是在不断衍变的,这个系列主要是为Linux3.2内核所开发,而且也缺乏功能规划,这些可能在将来的内核中加入。在此之前,该工具依然利用欺骗和侵入内核的方式工作。有的工具会将事件发送到用户空间进行处理,这会比在内核空间处理带来更大的开销。每个工具的使用开销在其man手册页中有具体的描述。
警告:在某些极端情况下,使用该工具会使应用运行速度下降5倍。取决于此工具和内核的版本,也可能导致内核的崩溃。阅读程序头部的警告信息并且在使用前进行测试。
如果工具的开销是个问题,那么也可以进行改良。程序可以使用C语言重写,并且调用perf_events_open() 和 mmap()函数获得栈缓存。也可以用C语言实现频率统计,并且直接使用mmap()函数处理,而不必使用awk、Perl、Python等处理。基于ftrace的工具还可以进行一些额外的改进,比如使用快照和预分配缓存。
这些工具被作为内核功能补充被短期维护,所以有很大的可能被重写。旧版本的工具也会保存在仓库中供旧版本的内核使用。
(省略……)
链接
案例学习和总结
- 2014.08.13 http://lwn.net/Articles/608497 Ftrace: The hidden light switch