如何使用eBPF增加产品的可观察性

目前在项目中为了增加可观察性加入eBP是大势所趋,下文将描述如何快速做到这一点。这也适用于将其添加到自己的内部监控系统中的人,如果你使用的是开源监控平台,首先检查它是否已经有BPF代理。

安装并运行工具

在 Ubuntu 上 安装bcc或bpftrace工具

# apt-get install bpfcc-tools

然后试着运行一个工具。例如,要使用execsnoop(8)查看带有时间戳的流程执行:

# execsnoop-bpfcc -t
TIME PCOMM PID PPID RET ARGS
19:36:15 service 828567 6009 0 /usr/sbin/service --status-all
19:36:15 basename 828568 828567 0
19:36:15 basename 828569 828567 0 /usr/bin/basename /usr/sbin/service
19:36:15 env 828570 828567 0 /usr/bin/env -i LANG=en_AU.UTF-8 LANGUAGE=en_AU:en LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION= LC_ALL= PATH=/opt/local/bin:/opt/local/sbin:/usr/local/git/bin:/home/bgregg/.local/bin:/home/bgregg/bin:/opt/local/bin:/opt/local/sbin:/ TERM=xterm-256color /etc/init.d/acpid
19:36:15 acpid 828570 828567 0 /etc/init.d/acpid status
19:36:15 run-parts 828571 828570 0 /usr/bin/run-parts --lsbsysinit --list /lib/lsb/init-functions.d
19:36:15 systemctl 828572 828570 0 /usr/bin/systemctl -p LoadState --value show acpid.service
19:36:15 readlink 828573 828570 0 /usr/bin/readlink -f /etc/init.d/acpid
[...]
虽然是基本的,但我仅用这个工具就解决了许多性能问题,包括错误配置的系统,其中shell脚本在循环中启动失败的进程,以及一些小应用程序崩溃,每隔几分钟重新启动一次,但尚未被注意到。

加入到产品中

现在想象一下将execsnoop(8)添加到产品中,线上环境可能已经在所有客户系统上运行了代理。他们有办法运行命令并返回文本输出吗?或者运行一个命令并将输出发送到其他地方进行聚合(S3、Hive、Druid等)?这当中有这么多的选择,基于现有的系统和客户环境来使用。

当将第一个工具添加到产品中时,让它运行一段短时间,例如10到60秒。我刚刚注意到execsnoop(8)还没有duration选项,所以在此期间可以使用watch -n 1 -d execsnoop-bpfcc -t bpfcc来包装它。如果想全天候运行这些工具,请首先研究开销以了解成本。像进程执行这样的低频事件应该可以忽略不计。

增加检测项

现在您的产品中有了一个BPF可观察性工具,是时候添加更多了。以下是您可以运行并作为通用BPF可观察性仪表板显示的十大工具。

请注意runqlat和profile可能会有明显的开销,所以我只运行这些工具10到60秒,然后生成一个报告。如果需要的话,有些开销足够低,可以全天候运行(例如execsnoop、biolatency、tcplife、tcpretrans)

案例

Netflix正在构建一个新的GUI,它基于这些工具的bpftrace版本来实现这个工具仪表板和更多功能。体系如图:


                                            如何使用eBPF增加产品的可观察性

结语

正确使用eBPF能使产品具备了实时分析的能力,能更好迭代修复线上出现的性能问题。以上就是关于今天的全部内容,下期将给大家带来《如何利用CrashExplorer分析崩溃原因》,敬请期待~