perf-tools

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中有相关演示

主题

perf-tools

使用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:

  • misc/perf-stat-hist: 聚合某个追踪点的变量。示例
  • syscount: 使用系统调用来统计系统调用。示例
  • disk/bitesize: 柱状图显示磁盘IO数量。示例

使用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
  • 1

或者使用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的工具还可以进行一些额外的改进,比如使用快照和预分配缓存。
这些工具被作为内核功能补充被短期维护,所以有很大的可能被重写。旧版本的工具也会保存在仓库中供旧版本的内核使用。

(省略……)


链接

案例学习和总结

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值