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项目中:
这些是可以通过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
像execsnoop和opensnoop之类的工具在每个事件中只打印一行。 这显示文件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工具还具有用于其他文件系统的版本: ext4slower , btrfsslower , zfsslower和nfsslower 。
这是一个有用的工具,也是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.txt和trace.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使用相同的功能。而且,密件抄送不是开发中的唯一前端。 有ply和bpftrace ,旨在提供高级语言来快速编写自定义工具。 此外, SystemTap刚刚发布了3.2版 ,其中包括早期的实验性eBPF后端。 如果继续进行开发,它将为运行多年来开发的许多SystemTap脚本和Tapsets(库)提供安全且高效的生产引擎。 (将SystemTap与eBPF结合使用将是另一篇好文章。)
如果您需要开发自定义工具,则也可以使用bcc进行操作,尽管该语言目前比SystemTap,ply或bpftrace更为冗长。 我的密件抄送工具可以用作代码示例,此外,我还提供了一个使用Python开发bcc工具的教程 。 我建议先学习bcc多功能工具,因为在需要编写新工具之前,您可能会从中获得很多帮助。 您可以从bcc储存库中的示例文件研究多功能工具: funccount , funclatency , funcslower , stackcount , trace和argdist 。
感谢Opensource.com进行编辑。
翻译自: https://opensource.com/article/17/11/bccbpf-performance
linux bcc