eBPF学习笔记
2024-04-14
2分钟阅读时长
eBPF的理论看起来有点抽象,实际上就是注册到内核的回调函数,可以拦截系统调用,然后用来完成自己的事情。
只是这个回调函数在内核空间只能用C来写,门槛还是有点高的,除了C之外其他的语言可以写用户空间部分。
tcpdump和strace等常用程序就是基于eBPF来实现的。
bcc程序集
eBPF常用的利用方式是直接使用其他人贡献的bcc程序集,就和你直接用tcpdump一样。
安装程序集的方法参考这里,Ubuntu最新版需要使用非官方PPA:
sudo add-apt-repository ppa:hadret/libbpf
sudo add-apt-repository ppa:hadret/bpftrace
sudo add-apt-repository ppa:hadret/bpfcc
sudo apt-get install bpfcc-tools linux-headers-$(uname -r)
Ubuntu里这些二进制文件的名字会添加-bpfbcc
的后缀,比如exesnoop-bpfbcc
.
bcc用户态的代码是用Python写的。
execsnoop
监控系统新进程的产生,那些会消耗系统资源,但很短暂的进程,它们甚至不会出现在 top
命令或其它工具中的显示之中,此时使用该命令可以有效监控。
这个名字的来源是它实际监控exec
的系统调用。
opensnoop
类似地,用来监控文件打开。
biosnoop
根据块设备io,并打印延迟。
一般使用biolatency -D找到延迟大的磁盘,然后使用biosnoop找到延迟大的进程。
biotop
可以迅速定位占用大量io的进程。
ext4slower
检测ext4系统上,文件io较慢的进程和文件名。
其他文件系统也有对应的工具,修改前缀匹配即可。
biolatency
块设备io延迟跟踪,以直方图显示。
比iostat的输出更加直观。
cachestat
查看文件系统的缓存命中率。