linux bcc_使用bcc / BPF在Linux中分析性能的7种工具

linux bcc

Linux中出现了一项新技术,可以为系统管理员和开发人员提供大量新工具和仪表板,以进行性能分析和故障排除。 它被称为增强型Berkeley数据包过滤器(eBPF,或简称BPF),尽管这些增强功能不是在Berkeley中开发的,它们不仅对数据包起作用,而且对过滤的作用远不止这些。 我将讨论在Fedora 26上的Fedora和Red Hat系列Linux发行版中使用BPF的一种方法。

BPF可以在内核中运行用户定义的沙盒程序,以立即添加新的自定义功能。 这就像按需为Linux添加超级功能一样。 您可以使用它的示例包括:

  • 先进的性能跟踪工具 :文件系统操作,TCP事件,用户级事件等的编程低开销检测。
  • 网络性能 :提早丢弃数据包以提高DDOS的弹性,或在内核中重定向数据包以提高性能
  • 安全监控 :24x7全天候自定义监控并记录可疑内核和用户空间事件

BPF程序必须通过内核验证程序,以确保它们可以安全运行,并使其在可能的情况下比编写自定义内核模块更安全。 我怀疑大多数人不会自己编写BPF程序,而是会使用其他人的程序。 我已经在BPF编译器集合(bcc)项目中以开源形式在GitHub上发布了许多内容。 bcc为BPF开发提供了不同的前端,包括Python和Lua,并且目前是BPF工具最活跃的项目。

7个有用的新bcc / BPF工具

为了了解bcc / BPF工具及其功能,我创建了以下图表并将其添加到bcc项目中:

Linux bcc/BPF tracing tools diagram

布伦丹·格雷格(Brendan Gregg), CC BY-SA 4.0

这些是可以通过SSH(安全外壳)使用的命令行界面(CLI)工具。 如今,包括GUI在内的许多分析都是使用GUI和仪表板进行的。 SSH是不得已的方法。 但是,即使您最终打算仅在可用时通过GUI使用它们,这些CLI工具仍然是预览BPF功能的好方法。 我已经开始将BPF功能添加到开源GUI中,但这是另一篇文章的主题。 现在,我想共享CLI工具,您现在可以使用它。

1. execsnoop

从哪儿开始? 如何观看新流程。 这些可以消耗系统资源,但寿命短暂,因此它们不会出现在top(1)或其他工具中。 可以使用execsnoop来检测它们(或者,使用行业术语,可以对其进行跟踪 )。 跟踪时,我将在另一个窗口中通过SSH登录:



   
   
# /usr/share/bcc/tools/execsnoop
PCOMM            PID    PPID   RET ARGS
sshd             12234   727       0 / usr / sbin / sshd -D -R
unix_chkpwd       12236   12234     0 / usr / sbin / unix_chkpwd root nonull
unix_chkpwd       12237   12234     0 / usr / sbin / unix_chkpwd root chkexpiry
bash             12239   12238     0 / bin / bash
id               12241   12240     0 / usr / bin / id -un
hostname         12243   12242     0 / usr / bin / hostname
pkg-config       12245   12244     0 / usr / bin / pkg-config --variable =completionsdir bash-completion
grepconf.sh       12246   12239     0 / usr / libexec / grepconf.sh -c
grep             12247   12246     0 / usr / bin / grep -qsi ^COLOR. * none / etc / GREP_COLORS
tty               12249   12248     0 / usr / bin / tty -s
tput             12250   12248     0 / usr / bin / tput colors
dircolors         12252   12251     0 / usr / bin / dircolors --sh / etc / DIR_COLORS
grep             12253   12239     0 / usr / bin / grep -qi ^COLOR. * none / etc / DIR_COLORS
grepconf.sh       12254   12239     0 / usr / libexec / grepconf.sh -c
grep             12255   12254     0 / usr / bin / grep -qsi ^COLOR. * none / etc / GREP_COLORS
grepconf.sh       12256   12239     0 / usr / libexec / grepconf.sh -c
grep             12257   12256     0 / usr / bin / grep -qsi ^COLOR. * none / etc / GREP_COLORS

哇。 那是什么 什么是grepconf.sh ? 什么是/ etc / GREP_COLORS ? grep是否真的通过运行grep来读取自己的配置文件? 那怎么工作?

欢迎使用系统跟踪的乐趣。 您可以学到很多有关系统如何真正工作(或视情况而定不工作)的知识,并在此过程中发现一些简单的优化方法。 execsnoop通过跟踪exec()系统调用来工作,该系统调用通常用于在新进程中加载​​不同的程序代码。

2. opensnoop

从上面继续,所以grepconf.sh可能是一个shell脚本,对不对? 我将运行file(1)进行检查,并使用opensnoop bcc工具查看正在打开的文件:



   
   
# /usr/share/bcc/tools/opensnoop
PID    COMM               FD ERR PATH
12420   file                 3   0 / etc / ld.so.cache
12420   file                 3   0 / lib64 / libmagic.so.1
12420   file                 3   0 / lib64 / libz.so.1
12420   file                 3   0 / lib64 / libc.so.6
12420   file                 3   0 / usr / lib / locale / locale-archive
12420   file               -1   2 / etc / magic.mgc
12420   file                 3   0 / etc / magic
12420   file                 3   0 / usr / share / misc / magic.mgc
12420   file                 3   0 / usr / lib64 / gconv / gconv-modules.cache
12420   file                 3   0 / usr / libexec / grepconf.sh
1      systemd             16   0 / proc / 565 / cgroup
1      systemd             16   0 / proc / 536 / cgroup

execsnoopopensnoop之类的工具在每个事件中打印一行。 这显示文件file(1)正在打开(或尝试打开)的文件:对于/etc/magic.mgc ,返回的文件描述符(“ FD”列)为-1 ,而“ ERR”列则表明它是“文件不存在”。找到了。” 我不知道该文件,也不知道file(1)正在读取的/usr/share/misc/magic.mgc 。 我不应该感到惊讶,但是file(1)可以确定文件类型没有问题:



   
   
# file /usr/share/misc/magic.mgc /etc/magic
/ usr / share / misc / magic.mgc: magic binary file for file ( 1 ) cmd ( version 14 ) ( little endian )
/ etc / magic:                magic text file for file ( 1 ) cmd, ASCII text

opensnoop通过跟踪open()系统调用来工作。 为什么不只使用strace -feopen文件... ? 在这种情况下,它将起作用。 但是, opensnoop的两个优点是它可以在系统范围内运行,并且可以在所有进程中跟踪open()调用。 请注意,上面包含的输出从systemd打开。 Opensnoop的开销也应该低得多:BPF跟踪已得到优化,并且当前版本的strace(1)仍使用较旧和较慢的ptrace(2)接口。

3. xfsslower

bcc / BPF不仅可以分析系统调用,还可以进行更多分析。 xfsslower工具跟踪延迟大于1毫秒(参数)的常见XFS文件系统操作:



   
   
# /usr/share/bcc/tools/xfsslower 1
Tracing XFS operations slower than 1 ms
TIME     COMM           PID    T BYTES   OFF_KB   LAT ( ms ) FILENAME
14 : 17 : 34 systemd-journa 530    S 0       0           1.69 system.journal
14 : 17 : 35 auditd         651    S 0       0           2.43 audit.log
14 : 17 : 42 cksum           4167   R 52976   0           1.04 at
14 : 17 : 45 cksum           4168   R 53264   0           1.62 [
14 : 17 : 45 cksum           4168   R 65536   0           1.01 certutil
14 : 17 : 45 cksum           4168   R 65536   0           1.01 dir
14 : 17 : 45 cksum           4168   R 65536   0           1.17 dirmngr-client
14 : 17 : 46 cksum           4168   R 65536   0           1.06 grub2-file
14 : 17 : 46 cksum           4168   R 65536   128         1.01 grub2-fstest
[ ... ]

在上面的输出中,我捕获了许多cksum(1)读取(类型==“ R”的“ T”),延迟超过1毫秒。 这是通过在xfsslower工具运行时动态地检测XFS中的内核功能来实现的,并且在结束时撤消该检测。 该bcc工具还具有用于其他文件系统的版本: ext4slowerbtrfsslowerzfsslowernfsslower

这是一个有用的工具,也是BPF跟踪的重要示例。 传统的文件系统性能分析着重于块I / O统计信息,这是您通常在iostat(1)工具上看到并由许多性能监视GUI进行绘制的结果。 这些统计数据显示了磁盘的性能,但实际上不是文件系统。 通常,您比磁盘更关心文件系统的性能,因为它是应用程序向其发出请求并等待的文件系统。 而且文件系统的性能可能与磁盘的性能完全不同! 文件系统可以完全从内存缓存中读取数据,也可以通过预读算法填充该缓存并用于回写缓存。 x fsslower显示文件系统性能-应用程序直接体验的性能。 这通常对于简化整个存储子系统很有用。 如果确实没有文件系统延迟,那么性能问题很可能在其他地方。

4.生物潜伏期

尽管文件系统性能对于研究了解应用程序性能很重要,但是研究磁盘性能也很有价值。 当各种缓存技巧无法掩盖其延迟时,磁盘性能低下将最终影响应用程序。 磁盘性能也是容量规划研究的目标。

iostat(1)工具显示了平均磁盘I / O延迟,但是平均值可能会误导您。 以直方图的形式研究I / O延迟的分布可能很有用,可以使用生物潜伏期来完成:



   
   
# /usr/share/bcc/tools/biolatency
Tracing block device I / O... Hit Ctrl-C to end.
^C
     usecs               : count     distribution
          0 - > 1          : 0         |                                         |
          2 - > 3          : 0         |                                         |
          4 - > 7          : 0         |                                         |
          8 - > 15         : 0         |                                         |
        16 - > 31         : 0         |                                         |
        32 - > 63         : 1         |                                         |
        64 - > 127        : 63       |****                                     |
        128 - > 255        : 121       |*********                               |
        256 - > 511        : 483       |************************************     |
        512 - > 1023       : 532       |****************************************|
      1024 - > 2047       : 117       |********                                 |
      2048 - > 4095       : 8         |                                         |

这是另一个有用的工具和另一个有用的示例。 它使用称为地图的BPF功能,可用于实现有效的内核内摘要统计信息。 从内核级别到用户级别的数据传输只是“计数”列; 用户级程序将生成其余部分。

值得注意的是,其中许多工具都支持CLI选项和参数,如USAGE消息所示:



   
   
# /usr/share/bcc/tools/biolatency -h
usage: biolatency [ -h ] [ -T ] [ -Q ] [ -m ] [ -D ] [ interval ] [ count ]

Summarize block device I / O latency as a histogram

positional arguments:
  interval            output interval, in seconds
  count               number of outputs

optional arguments:
  -h, --help          show this help message and exit
  -T, --timestamp     include timestamp on output
  -Q, --queued        include OS queued time in I / O time
  -m, --milliseconds  millisecond histogram
  -D, --disks         print a histogram per disk device

examples:
    . / biolatency             # summarize block I/O latency as a histogram
    . / biolatency 1 10       # print 1 second summaries, 10 times
    . / biolatency -mT 1       # 1s summaries, milliseconds, and timestamps
    . / biolatency -Q         # include OS queued time in I/O time
    . / biolatency -D         # show each disk device separately

它们的行为类似于其他Unix工具是设计使然,以帮助采用。

5. tcplife

另一个有用的工具和示例,这一次显示TCP会话的寿命和吞吐量统计信息,是tcplife



   
   
# /usr/share/bcc/tools/tcplife
PID   COMM       LADDR           LPORT RADDR           RPORT TX_KB RX_KB MS
12759 sshd       192.168.56.101   22    192.168.56.1     60639     2     3 1863.82
12783 sshd       192.168.56.101   22    192.168.56.1     60640     3     3 9174.53
12844 wget       10.0.2.15       34250 54.204.39.132   443       11   1870 5712.26
12851 curl       10.0.2.15       34252 54.204.39.132   443       0     74 505.90

在您说之前:“我不能为此只刮一下tcpdump(8)输出吗?” 请注意,即使多年来对tcpdump(8)的用户级和内核级机制进行了优化,运行tcpdump(8)或任何数据包嗅探器也会在高数据包速率的系统上花费大量开销。更差)。 tcplife不会检测每个数据包; 它仅监视TCP会话状态的更改以提高效率,并以此来计算会话的持续时间。 它还使用内核计数器,该计数器已经跟踪吞吐量以及进程和命令信息(“ PID”和“ COMM”列),而这些信息对于tcpdump(8)等在线嗅探工具不可用。

6. gethostlatency

前面的每个示例都涉及内核跟踪,因此我至少需要一个用户级跟踪示例。 这是gethostlatency ,它使用gethostbyname(3)和相关的库调用来进行名称解析:



   
   
# /usr/share/bcc/tools/gethostlatency
TIME      PID    COMM                  LATms HOST
06: 43 : 33   12903  curl                 188.98 opensource.com
06: 43 : 36   12905  curl                   8.45 opensource.com
06: 43 : 40   12907  curl                   6.55 opensource.com
06: 43 : 44   12911  curl                   9.67 opensource.com
06: 45 :02   12948  curl                   19.66 opensource.cats
06: 45 :06   12950  curl                   18.37 opensource.cats
06: 45 :07   12952  curl                   13.64 opensource.cats
06: 45 : 19   13139  curl                   13.10 opensource.cats

是的,它始终是DNS,因此拥有在系统范围内监视DNS请求的工具非常方便(这仅在应用程序使用标准系统库的情况下有效)。 看到我如何跟踪多个查找到“ opensource.com”? 第一次花费了188.98毫秒,然后更快了,不到10毫秒,无疑是被缓存了。 它还跟踪了多个查找到“ opensource.cats”的主机,可悲的是它不存在,但是我们仍然可以检查第一次查找和后续查找的延迟。 (第二次查找后是否有一些负缓存?)

7.追踪

好的,再举一个例子。 跟踪工具由Sasha Goldshtein贡献,并提供了一些具有自定义探针的基本printf(1)功能。 例如:



   
   
# /usr/share/bcc/tools/trace 'pam:pam_start "%s: %s", arg1, arg2'
PID    TID    COMM         FUNC             -
13266   13266  sshd         pam_start        sshd: root

在这里我正在追踪libpam 及其pam_start(3)函数,并将两个参数都打印为字符串。 Libpam用于可插入身份验证模块系统,并且输出显示sshd为“ root”用户(我已登录)调用了pam_start( )。 在USAGE消息中有更多示例(“ trace -h”),此外,所有这些工具在bcc存储库中都有手册页和示例文件; 例如trace_example.txttrace.8

通过软件包安装密件抄送

按照bcc INSTALL.md的指示,从iovisor存储库安装bcc的最佳方法。 IO Visor是包含bcc的Linux Foundation项目。 这些工具使用的BPF增强功能已添加到4.x系列Linux内核(最高4.9)中。 这意味着带有4.8内核的Fedora 25可以运行其中的大多数工具。 Fedora 26(具有4.11内核)可以全部运行(至少当前运行)。

如果您使用的是Fedora 25(或Fedora 26,并且该文章已在多个月前发布,您好吗?从遥远的过去!),那么这种打包方法应该可以用。 如果您使用的是Fedora 26,请跳至“ 通过源代码安装”部分,以避免已知的和已修复的错误。 该错误修复目前尚未进入Fedora 26软件包依赖项。 我正在使用的系统是:



   
   
# uname -a
Linux localhost.localdomain 4.11.8- 300 .fc26.x86_64 #1 SMP Thu Jun 29 20:09:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/fedora-release
Fedora release 26 ( Twenty Six )

这是我遵循的安装步骤,但请参考INSTALL.md以获取更新的版本:



   
   
# echo -e '[iovisor]\nbaseurl=https://repo.iovisor.org/yum/nightly/f25/$basearch\nenabled=1\ngpgcheck=0' | sudo tee /etc/yum.repos.d/iovisor.repo
# dnf install bcc-tools
[ ... ]
Total download size: 37 M
Installed size: 143 M
Is this ok [ y / N ] : y

安装后,您应该在/ usr / share中看到新工具:



   
   
# ls /usr/share/bcc/tools/
argdist       dcsnoop              killsnoop       softirqs    trace
bashreadline  dcstat               llcstat         solisten    ttysnoop
[ ... ]

让我们尝试运行其中之一:



   
   
# /usr/share/bcc/tools/opensnoop
chdir ( / lib / modules / 4.11.8- 300 .fc26.x86_64 / build ) : No such file or directory
Traceback ( most recent call last ) :
  File "/usr/share/bcc/tools/opensnoop" , line 126 , in < module >
    b = BPF ( text =bpf_text )
  File "/usr/lib/python3.6/site-packages/bcc/__init__.py" , line 284 , in __init__
    raise Exception ( "Failed to compile BPF module %s" % src_file )
Exception: Failed to compile BPF module

它运行失败,抱怨缺少/lib/modules/4.11.8-300.fc26.x86_64/build 。 如果您也遇到了这个问题,那仅仅是因为系统缺少内核头文件。 如果查看该文件指向的内容(这是一个符号链接),然后使用“ dnf whatprovides”进行搜索,它将告诉您接下来需要安装的软件包。 对于此系统,它是:



   
   
# dnf install kernel-devel-4.11.8-300.fc26.x86_64
[ ... ]
Total download size: 20 M
Installed size: 63 M
Is this ok [ y / N ] : y
[ ... ]

现在:



   
   
# /usr/share/bcc/tools/opensnoop
PID    COMM               FD ERR PATH
11792   ls                   3   0 / etc / ld.so.cache
11792   ls                   3   0 / lib64 / libselinux.so.1
11792   ls                   3   0 / lib64 / libcap.so.2
11792   ls                   3   0 / lib64 / libc.so.6
[ ... ]

有用。 这是另一个窗口中的ls命令捕获的活动。 有关其他有用的命令,请参见前面的部分。

通过源安装

如果需要从源代码安装,还可以在INSTALL.md中找到文档和更新的说明。 我在Fedora 26上做了以下工作:



   
   
sudo dnf install -y bison cmake ethtool flex git iperf libstdc++-static \
  python-netaddr python-pip gcc gcc-c++ make zlib-devel \
  elfutils-libelf-devel
sudo dnf install -y luajit luajit-devel   # for Lua support
sudo dnf install -y \
  http: // pkgs.repoforge.org / netperf / netperf-2.6.0- 1 .el6.rf.x86_64.rpm
sudo pip install pyroute2
sudo dnf install -y clang clang-devel llvm llvm-devel llvm-static ncurses-devel

除了netperf之外,一切都为我安装了,它有以下错误:


Curl error ( 28 ) : Timeout was reached for http: // pkgs.repoforge.org / netperf / netperf-2.6.0- 1 .el6.rf.x86_64.rpm [ Connection timed out after 120002 milliseconds ] 

我们可以忽略此错误,因为netperf是可选的-它仅用于测试-并且bcc会在没有它的情况下进行编译。

以下是剩余的密件抄送编译和安装步骤:



   
   
git clone https: // github.com / iovisor / bcc.git
mkdir bcc / build; cd bcc / build
cmake .. -DCMAKE_INSTALL_PREFIX= / usr
make
sudo make install

此时,命令应该起作用:



   
   
# /usr/share/bcc/tools/opensnoop
PID    COMM               FD ERR PATH
4131   date                 3   0 / etc / ld.so.cache
4131   date                 3   0 / lib64 / libc.so.6
4131   date                 3   0 / usr / lib / locale / locale-archive
4131   date                 3   0 / etc / localtime
[ ... ]

最后的话和其他前端

BPF的密件抄送前端,并包含Fedora的安装说明。 bcc附带了60多种用于性能分析的新工具,这些工具将帮助您充分利用Linux系统。 也许您将直接通过SSH使用这些工具,或者一旦它们支持BPF,将通过监视GUI使用相同的功能。

而且,密件抄送不是开发中的唯一前端。 有plybpftrace ,旨在提供高级语言来快速编写自定义工具。 此外, SystemTap刚刚发布了3.2版 ,其中包括早期的实验性eBPF后端。 如果继续进行开发,它将为运行多年来开发的许多SystemTap脚本和Tapsets(库)提供安全且高效的生产引擎。 (将SystemTap与eBPF结合使用将是另一篇好文章。)

如果您需要开发自定义工具,则也可以使用bcc进行操作,尽管该语言目前比SystemTap,ply或bpftrace更为冗长。 我的密件抄送工具可以用作代码示例,此外,我还提供了一个使用Python开发bcc工具的教程 。 我建议先学习bcc多功能工具,因为在需要编写新工具之前,您可能会从中获得很多帮助。 您可以从bcc储存库中的示例文件研究多功能工具: funccountfunclatencyfuncslowerstackcounttraceargdist

感谢Opensource.com进行编辑。

翻译自: https://opensource.com/article/17/11/bccbpf-performance

linux bcc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值