BCC - 用于Linux性能监视,网络和更多的动态跟踪工具

BCC(BPF编译器集合 )是用于创建足智多谋内核跟踪和操作程序一套功能强大的适当的工具和示例文件。 它采用扩展BPF( Berkeley包过滤器 ),最初被称为eBPF这是在Linux的3.15的新功能之一。
BCC / BPF - 用于Linux性能监视的动态跟踪工具

BCC / BPF - 用于Linux性能监视的动态跟踪工具

实际上,大多数由BCC使用的组件的需要的Linux 4.1或以上,和其值得注意的特点包括:
  1. 不需要第三方内核模块,因为所有的工具都基于内置于内核的BPF工作,BCC使用Linux 4.x系列中添加的功能。
  2. 支持观察软件执行。
  3. 包括几个性能分析工具与示例文件和手册页。

建议阅读: 20命令行工具来监控Linux性能

最适合用于高级Linux用户,BCC可以很容易地编写使用内核仪表用C BPF程序和前端在PythonLua。此外,它支持多个任务,如性能分析,监控,网络流量控制等。

如何在Linux系统中安装BCC

请记住,BCC使用在Linux内核版本4.1中加入以上功能,并作为一项要求,内核应该已经编译如下设置标志:
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
# [optional, for tc filters]
CONFIG_NET_CLS_BPF=m
# [optional, for tc actions]
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
CONFIG_HAVE_BPF_JIT=y
# [optional, for kprobes]
CONFIG_BPF_EVENTS=y
要检查你的核心标志,查看文件了/proc/config.gz或在下面的例子中运行命令:
howtoing@HowToing ~ $ grep CONFIG_BPF= /boot/config-`uname -r`
CONFIG_BPF=y
howtoing@HowToing ~ $ grep CONFIG_BPF_SYSCALL= /boot/config-`uname -r`
CONFIG_BPF_SYSCALL=y
howtoing@HowToing ~ $ grep CONFIG_NET_CLS_BPF= /boot/config-`uname -r`
CONFIG_NET_CLS_BPF=m
howtoing@HowToing ~ $ grep CONFIG_NET_ACT_BPF= /boot/config-`uname -r`
CONFIG_NET_ACT_BPF=m
howtoing@HowToing ~ $ grep CONFIG_BPF_JIT= /boot/config-`uname -r`
CONFIG_BPF_JIT=y
howtoing@HowToing ~ $ grep CONFIG_HAVE_BPF_JIT= /boot/config-`uname -r`
CONFIG_HAVE_BPF_JIT=y
howtoing@HowToing ~ $ grep CONFIG_BPF_EVENTS= /boot/config-`uname -r`
CONFIG_BPF_EVENTS=y
验证内核标志后,它的时间在Linux系统中安装BCC工具。

在Ubuntu 16.04

只有夜间包的Ubuntu 16.04创建,但安装说明都非常简单。无需内核升级或从源代码编译。
$ echo "deb [trusted=yes] https://repo.iovisor.org/apt/xenial xenial-nightly main" | sudo tee /etc/apt/sources.list.d/iovisor.list
$ sudo apt-get update
$ sudo apt-get install bcc-tools

在Ubuntu 14.04

通过安装4.3以上版本的 Linux内核,从开始http://kernel.ubuntu.com/~kernel-ppa/mainline 。 作为一个例子,写一个小的shell脚本“bcc-install.sh”与下面的内容。 注意 :更新PREFIX值的最晚日期,以及浏览提供获得实际的REL值,在shell脚本代替它们的前缀网址的文件。
#!/bin/bash
VER=4.5.1-040501
PREFIX=http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.5.1-wily/
REL=201604121331
wget ${PREFIX}/linux-headers-${VER}-generic_${VER}.${REL}_amd64.deb
wget ${PREFIX}/linux-headers-${VER}_${VER}.${REL}_all.deb
wget ${PREFIX}/linux-image-${VER}-generic_${VER}.${REL}_amd64.deb
sudo dpkg -i linux-*${VER}.${REL}*.deb
保存文件并退出。使其可执行,然后如图所示运行:
$ chmod +x bcc-install.sh
$ sh bcc-install.sh
然后,重新启动系统。
$ reboot
接下来,运行以下命令安装签名的BCC软件包:
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D4284CDD
$ echo "deb https://repo.iovisor.org/apt trusty main" | sudo tee /etc/apt/sources.list.d/iovisor.list
$ sudo apt-get update
$ sudo apt-get install binutils bcc bcc-tools libbcc-examples python-bcc

在Fedora 24-23

安装从4.2+内核http://alt.fedoraproject.org/pub/alt/rawhide-kernel-nodebug ,如果您的系统具有比需要什么更低版本。下面是一个如何做的例子:
$ sudo dnf config-manager --add-repo=http://alt.fedoraproject.org/pub/alt/rawhide-kernel-nodebug/fedora-rawhide-kernel-nodebug.repo
$ sudo dnf update
$ reboot
在此之后,添加BBC工具库,更新你的系统,并执行下一个命令系列的安装工具:
$ echo -e '[iovisor]\nbaseurl=https://repo.iovisor.org/yum/nightly/f23/$basearch\nenabled=1\ngpgcheck=0' | sudo tee /etc/yum.repos.d/iovisor.repo
$ sudo dnf update
$ sudo dnf install bcc-tools

Arch Linux - AUR

您应该将内核升级到至少4.3.1-1版本开始,随后安装使用以下任何拱包管理器,如包pacaur,yaourt, 畏缩等。
bcc bcc-tools python-bcc python2-bcc

如何在Linux系统中使用BCC工具

所有BCC工具将被安装/usr/share/bcc/tools目录下。 但是,您可以替代地根据BCC Github上库运行它们/tools在那里他们有结束.py扩展。
$ ls /usr/share/bcc/tools 
argdist       capable     filetop         offwaketime  stackcount  vfscount
bashreadline  cpudist     funccount       old          stacksnoop  vfsstat
biolatency    dcsnoop     funclatency     oomkill      statsnoop   wakeuptime
biosnoop      dcstat      gethostlatency  opensnoop    syncsnoop   xfsdist
biotop        doc         hardirqs        pidpersec    tcpaccept   xfsslower
bitesize      execsnoop   killsnoop       profile      tcpconnect  zfsdist
btrfsdist     ext4dist    mdflush         runqlat      tcpconnlat  zfsslower
btrfsslower   ext4slower  memleak         softirqs     tcpretrans
cachestat     filelife    mysqld_qslower  solisten     tplist
cachetop      fileslower  offcputime      sslsniff     trace
我们应包括以下几个例子-监测的一般Linux系统的性能和网络。

跟踪open()系统调用

让我们通过追踪所有启动open()使用opensnoop系统调用。这使我们能够通过识别他们的数据文件,配置文件等等告诉我们各种应用程序如何工作:
$ cd /usr/share/bcc/tools 
$ sudo ./opensnoop
PID    COMM               FD ERR PATH
1      systemd            35   0 /proc/self/mountinfo
2797   udisksd            13   0 /proc/self/mountinfo
1      systemd            35   0 /sys/devices/pci0000:00/0000:00:0d.0/ata3/host2/target2:0:0/2:0:0:0/block/sda/sda1/uevent
1      systemd            35   0 /run/udev/data/b8:1
1      systemd            -1   2 /etc/systemd/system/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /run/systemd/system/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /run/systemd/generator/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /usr/local/lib/systemd/system/sys-kernel-debug-tracing.mount
2247   systemd            15   0 /proc/self/mountinfo
1      systemd            -1   2 /lib/systemd/system/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /usr/lib/systemd/system/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /run/systemd/generator.late/sys-kernel-debug-tracing.mount
1      systemd            -1   2 /etc/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /etc/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /run/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /run/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /run/systemd/generator/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /run/systemd/generator/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /usr/local/lib/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /usr/local/lib/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /lib/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /lib/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /usr/lib/systemd/system/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /usr/lib/systemd/system/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /run/systemd/generator.late/sys-kernel-debug-tracing.mount.wants
1      systemd            -1   2 /run/systemd/generator.late/sys-kernel-debug-tracing.mount.requires
1      systemd            -1   2 /etc/systemd/system/sys-kernel-debug-tracing.mount.d
1      systemd            -1   2 /run/systemd/system/sys-kernel-debug-tracing.mount.d
1      systemd            -1   2 /run/systemd/generator/sys-kernel-debug-tracing.mount.d
....

总结块设备I / O延迟

在本示例中,它显示使用生物分解的磁盘I / O延迟的汇总分布。执行该命令后,等待几分钟,然后按Ctrl-C来结束它,并查看输出。
$ sudo ./biolatecncy
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         : 0        |                                        |
64 -> 127        : 0        |                                        |
128 -> 255        : 3        |****************************************|
256 -> 511        : 3        |****************************************|
512 -> 1023       : 1        |*************                           |

通过exec()Syscalls跟踪新进程

在本节中,我们将移动到使用execsnoop工具执行跟踪新工艺。 每一个过程是由两岔时间fork()exec()系统调用,它示出在输出中。但是,并非所有进程都被捕获。
$ sudo ./execsnoop
PCOMM            PID    PPID   RET ARGS
gnome-screensho  14882  14881    0 /usr/bin/gnome-screenshot --gapplication-service
systemd-hostnam  14892  1        0 /lib/systemd/systemd-hostnamed
nautilus         14897  2767    -2 /home/howtoing/bin/net usershare info
nautilus         14897  2767    -2 /home/howtoing/.local/bin/net usershare info
nautilus         14897  2767    -2 /usr/local/sbin/net usershare info
nautilus         14897  2767    -2 /usr/local/bin/net usershare info
nautilus         14897  2767    -2 /usr/sbin/net usershare info
nautilus         14897  2767    -2 /usr/bin/net usershare info
nautilus         14897  2767    -2 /sbin/net usershare info
nautilus         14897  2767    -2 /bin/net usershare info
nautilus         14897  2767    -2 /usr/games/net usershare info
nautilus         14897  2767    -2 /usr/local/games/net usershare info
nautilus         14897  2767    -2 /snap/bin/net usershare info
compiz           14899  14898   -2 /home/howtoing/bin/libreoffice --calc
compiz           14899  14898   -2 /home/howtoing/.local/bin/libreoffice --calc
compiz           14899  14898   -2 /usr/local/sbin/libreoffice --calc
compiz           14899  14898   -2 /usr/local/bin/libreoffice --calc
compiz           14899  14898   -2 /usr/sbin/libreoffice --calc
libreoffice      14899  2252     0 /usr/bin/libreoffice --calc
dirname          14902  14899    0 /usr/bin/dirname /usr/bin/libreoffice
basename         14903  14899    0 /usr/bin/basename /usr/bin/libreoffice
...

跟踪慢ext4操作

使用ext4slower跟踪ext4文件系统是大于10ms较慢的常用操作,帮助我们通过文件系统识别独立较慢的磁盘I / O。

建议阅读: 13 Linux的性能监视工具

它只输出超过阈值的操作:
$ sudo ./execslower
Tracing ext4 operations slower than 10 ms
TIME     COMM           PID    T BYTES   OFF_KB   LAT(ms) FILENAME
11:59:13 upstart        2252   W 48      1          10.76 dbus.log
11:59:13 gnome-screensh 14993  R 144     0          10.96 settings.ini
11:59:13 gnome-screensh 14993  R 28      0          16.02 gtk.css
11:59:13 gnome-screensh 14993  R 3389    0          18.32 gtk-main.css
11:59:25 rs:main Q:Reg  1826   W 156     60         31.85 syslog
11:59:25 pool           15002  R 208     0          14.98 .xsession-errors
11:59:25 pool           15002  R 644     0          12.28 .ICEauthority
11:59:25 pool           15002  R 220     0          13.38 .bash_logout
11:59:27 dconf-service  2599   S 0       0          22.75 user.BHDKOY
11:59:33 compiz         2548   R 4096    0          19.03 firefox.desktop
11:59:34 compiz         15008  R 128     0          27.52 firefox.sh
11:59:34 firefox        15008  R 128     0          36.48 firefox
11:59:34 zeitgeist-daem 2988   S 0       0          62.23 activity.sqlite-wal
11:59:34 zeitgeist-fts  2996   R 8192    40         15.67 postlist.DB
11:59:34 firefox        15008  R 140     0          18.05 dependentlibs.list
11:59:34 zeitgeist-fts  2996   S 0       0          25.96 position.tmp
11:59:34 firefox        15008  R 4096    0          10.67 libplc4.so
11:59:34 zeitgeist-fts  2996   S 0       0          11.29 termlist.tmp
...

跟踪块设备I / O,带PID和延迟

下一步,让我们每秒钟为每个磁盘I / O打印一行,其中包括进程ID,扇区,字节,使用biosnoop的其他延迟等细节:
$ sudo ./biosnoop
TIME(s)        COMM           PID    DISK    T  SECTOR    BYTES   LAT(ms)
0.000000000    ?              0              R  -1        8          0.26
2.047897000    ?              0              R  -1        8          0.21
3.280028000    kworker/u4:0   14871  sda     W  30552896  4096       0.24
3.280271000    jbd2/sda1-8    545    sda     W  29757720  12288      0.40
3.298318000    jbd2/sda1-8    545    sda     W  29757744  4096       0.14
4.096084000    ?              0              R  -1        8          0.27
6.143977000    ?              0              R  -1        8          0.27
8.192006000    ?              0              R  -1        8          0.26
8.303938000    kworker/u4:2   15084  sda     W  12586584  4096       0.14
8.303965000    kworker/u4:2   15084  sda     W  25174736  4096       0.14
10.239961000   ?              0              R  -1        8          0.26
12.292057000   ?              0              R  -1        8          0.20
14.335990000   ?              0              R  -1        8          0.26
16.383798000   ?              0              R  -1        8          0.17
...

跟踪页面缓存命中/未命中比率

此后,我们继续使用cachestat到显示器汇总统计的一行从系统缓存每一秒。这通过指出低缓存命中率和高错失率来实现系统调整操作:
$ sudo ./cachestat
HITS   MISSES  DIRTIES  READ_HIT% WRITE_HIT%   BUFFERS_MB  CACHED_MB
0        0        0       0.0%       0.0%           19        544
4        4        2      25.0%      25.0%           19        544
1321       33        4      97.3%       2.3%           19        545
7476        0        2     100.0%       0.0%           19        545
6228       15        2      99.7%       0.2%           19        545
0        0        0       0.0%       0.0%           19        545
7391      253      108      95.3%       2.7%           19        545
33608     5382       28      86.1%      13.8%           19        567
25098       37       36      99.7%       0.0%           19        566
17624      239      416      96.3%       0.5%           19        520
...

跟踪TCP活动连接

监测TCP连接,每秒使用tcpconnect。其输出包括源和目标地址以及端口号。此工具可用于跟踪意外的TCP连接,从而帮助我们识别应用程序配置或攻击者的低效率。
$ sudo ./tcpconnect
PID    COMM         IP SADDR            DADDR            DPORT
15272  Socket Threa 4  10.0.2.15        91.189.89.240    80  
15272  Socket Threa 4  10.0.2.15        216.58.199.142   443 
15272  Socket Threa 4  10.0.2.15        216.58.199.142   80  
15272  Socket Threa 4  10.0.2.15        216.58.199.174   443 
15272  Socket Threa 4  10.0.2.15        54.200.62.216    443 
15272  Socket Threa 4  10.0.2.15        54.200.62.216    443 
15272  Socket Threa 4  10.0.2.15        117.18.237.29    80  
15272  Socket Threa 4  10.0.2.15        216.58.199.142   80  
15272  Socket Threa 4  10.0.2.15        216.58.199.131   80  
15272  Socket Threa 4  10.0.2.15        216.58.199.131   443 
15272  Socket Threa 4  10.0.2.15        52.222.135.52    443 
15272  Socket Threa 4  10.0.2.15        216.58.199.131   443 
15272  Socket Threa 4  10.0.2.15        54.200.62.216    443 
15272  Socket Threa 4  10.0.2.15        54.200.62.216    443 
15272  Socket Threa 4  10.0.2.15        216.58.199.132   443 
15272  Socket Threa 4  10.0.2.15        216.58.199.131   443 
15272  Socket Threa 4  10.0.2.15        216.58.199.142   443 
15272  Socket Threa 4  10.0.2.15        54.69.17.198     443 
15272  Socket Threa 4  10.0.2.15        54.69.17.198     443 
...
以上所有的工具,也可以与各种选项一起使用,使一个给定的工具的帮助页面,利用的-h选项,例如:
$ sudo ./tcpconnect -h
usage: tcpconnect [-h] [-t] [-p PID] [-P PORT]
Trace TCP connects
optional arguments:
-h, --help            show this help message and exit
-t, --timestamp       include timestamp on output
-p PID, --pid PID     trace this PID only
-P PORT, --port PORT  comma-separated list of destination ports to trace.
examples:
./tcpconnect           # trace all TCP connect()s
./tcpconnect -t        # include timestamps
./tcpconnect -p 181    # only trace PID 181
./tcpconnect -P 80     # only trace port 80
./tcpconnect -P 80,81  # only trace port 80 and 81

跟踪失败exec()s Syscalls

要跟踪失败的exec()秒的系统调用,应用-x具有如下opensnoop选项:
$ sudo ./opensnoop -x
PID    COMM               FD ERR PATH
15414  pool               -1   2 /home/.hidden
15415  (ostnamed)         -1   2 /sys/fs/cgroup/cpu/system.slice/systemd-hostnamed.service/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/cpu/system.slice/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/cpuacct/system.slice/systemd-hostnamed.service/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/cpuacct/system.slice/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/blkio/system.slice/systemd-hostnamed.service/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/blkio/system.slice/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/memory/system.slice/systemd-hostnamed.service/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/memory/system.slice/cgroup.procs
15415  (ostnamed)         -1   2 /sys/fs/cgroup/pids/system.slice/systemd-hostnamed.service/cgroup.procs
2548   compiz             -1   2 
15416  systemd-cgroups    -1   2 /run/systemd/container
15416  systemd-cgroups    -1   2 /sys/fs/kdbus/0-system/bus
15415  systemd-hostnam    -1   2 /run/systemd/container
15415  systemd-hostnam    -1  13 /proc/1/environ
15415  systemd-hostnam    -1   2 /sys/fs/kdbus/0-system/bus
1695   dbus-daemon        -1   2 /run/systemd/users/0
15415  systemd-hostnam    -1   2 /etc/machine-info
15414  pool               -1   2 /home/howtoing/.hidden
15414  pool               -1   2 /home/howtoing/Binary/.hidden
2599   dconf-service      -1   2 /run/user/1000/dconf/user
...

跟踪特定的过程函数

下面的最后一个示例演示了如何执行自定义跟踪操作。我们正在使用其PID跟踪特定进程。

建议阅读: Netdata -适用于Linux的实时性能监控工具

首先确定进程ID:
$ pidof firefox
15437
后来,运行定制trace命令。 在下面的命令: -p指定的进程ID, do_sys_open()是动态跟踪包括它的第二个参数是一个字符串核函数。
$ sudo ./trace -p 4095 'do_sys_open "%s", arg2'
TIME     PID    COMM         FUNC             -
12:17:14 15437  firefox      do_sys_open      /run/user/1000/dconf/user
12:17:14 15437  firefox      do_sys_open      /home/howtoing/.config/dconf/user
12:18:07 15437  firefox      do_sys_open      /run/user/1000/dconf/user
12:18:07 15437  firefox      do_sys_open      /home/howtoing/.config/dconf/user
12:18:13 15437  firefox      do_sys_open      /sys/devices/system/cpu/present
12:18:13 15437  firefox      do_sys_open      /dev/urandom
12:18:13 15437  firefox      do_sys_open      /dev/urandom
12:18:14 15437  firefox      do_sys_open      /usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf
12:18:14 15437  firefox      do_sys_open      /usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf
12:18:14 15437  firefox      do_sys_open      /usr/share/fonts/truetype/liberation/LiberationSans-Italic.ttf
12:18:14 15437  firefox      do_sys_open      /sys/devices/system/cpu/present
12:18:14 15437  firefox      do_sys_open      /dev/urandom
12:18:14 15437  firefox      do_sys_open      /dev/urandom
12:18:14 15437  firefox      do_sys_open      /dev/urandom
12:18:14 15437  firefox      do_sys_open      /dev/urandom
12:18:15 15437  firefox      do_sys_open      /sys/devices/system/cpu/present
12:18:15 15437  firefox      do_sys_open      /dev/urandom
12:18:15 15437  firefox      do_sys_open      /dev/urandom
12:18:15 15437  firefox      do_sys_open      /sys/devices/system/cpu/present
12:18:15 15437  firefox      do_sys_open      /dev/urandom
12:18:15 15437  firefox      do_sys_open      /dev/urandom
....

概要

BCC是各种系统管理任务,例如追踪系统性能监控,跟踪块设备一个功能强大且易于使用的工具包I / O,TCP的功能,文件系统操作,系统调用,Node.js的探头,再加上其它更多地方。重要的是,它提供了几个示例文件和手册页的工具来指导你,使其用户友好和可靠。 最后但同样重要的是,您可以通过下面的评论部分分享您对主题的想法,提出问题,提出有用的建议或任何建设性的反馈,以回复我们。 欲了解更多信息和使用情况,请访问: https://iovisor.github.io/bcc/