Page tree

如需转载请标注内容地址为: https://wiki.shileizcc.com/confluence/display/bpf/BPFtrace

Skip to end of metadata
Go to start of metadata

请在使用站内资源的同时不要恶意进行爬取或倒链等行为,感谢支持!

BPFtrace

安装:

$ apt install bpftrace

静态插桩

Open()

通过 bpftrace 跟踪调用 open 作为开始。

一个最简单的示例:

$ bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename));}'
Attaching 1 probe...
manage-startup- /dev/null
nsenter /proc/1/ns/ipc
nsenter /proc/1/ns/uts
nsenter /proc/1/ns/net
nsenter /proc/1/ns/pid
nsenter /proc/1/ns/mnt
...

输出结果打印了进程的名字和传递给 open(2) 系统调用的文件名: bpftrace 是全系统层面的跟踪,因此任何调用了 open(2) 的应用都能覆盖。输出结果的每一行代表一次系统调用,这也是输出单个事件的例子。

BPF 程序被定义在单引号所包含的范围内,当敲击 Enter 时运行 bpftrace 命令,它会立刻被编译并且运行。当按下 Ctrl+C 组合键结束时,open(2) 的跟踪点就被禁用了,相应的,BPF 小程序也会被移除。这就是 BPF 跟踪工具提供的按需插桩的工作方式: 它们只在相关命令的存活期间被激活,观测时间可以仅几秒。

输出结果的时间比预想的要慢,可能是因为遗漏了一些 open(2) 系统调用事件。内核支持一些 open 系统调用的变体,上面只跟踪了其中的一个。可以通过为 bpftrace 的命令行参数 -l 和通配符的方式,列出所有的与 open 系统调用相关的跟踪点。

$ bpftrace -l 'tracepoint:syscalls:sys_enter_open*' tracepoint:syscalls:sys_enter_open_by_handle_at
tracepoint:syscalls:sys_enter_open_tree
tracepoint:syscalls:sys_enter_open
tracepoint:syscalls:sys_enter_openat
tracepoint:syscalls:sys_enter_openat2

不过 openat(2) 这个 open 的变体现在使用的频率可能更高。

$ bpftrace -e 'tracepoint:syscalls:sys_enter_open* { @[probe] = count(); }'
Attaching 5 probes...
^C

@[tracepoint:syscalls:sys_enter_openat2]: 1618
@[tracepoint:syscalls:sys_enter_openat]: 4317

openat(2) 系统被调用的次数确实最多,4317 次,而 openat2(2) 系统调用仅被调用了 1618 次。

opensnoop.bt

这个工具可以同时对每个系统调用的开始和结束位置进行跟踪,然后将结果分列输出:

$ opensnoop.bt
Attaching 6 probes...
Tracing open syscalls... Hit Ctrl-C to end.
PID    COMM               FD ERR PATH
10746  etcd                2   0 /proc/self/fd
10106  kubelet             2   0 /var/lib/dockershim/sandbox
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/ed210e3e
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/ed210e3e
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/ed210e3e
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/ed210e3e
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/ed210e3e
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/ed210e3e
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/ed210e3e
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/ed210e3e
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/ed210e3e4
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/ed210e3e
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/2edbd4f01
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/2edbd4f01
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/2edbd4f0
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/5dc814ae3
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/5dc814ae3
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/5dc814ae
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/7c37d0e45
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/content/sha256/7c37d0e45
5670   dockerd             2   0 /var/lib/docker/image/overlay2/imagedb/metadata/sha256/7c37d0e4
10106  kubelet             2   0 /proc/35652/net/dev
10106  kubelet             2   0 /sys/fs/cgroup/cpu,cpuacct/kubepods/besteffort/poddd6ea976-c1c3
10106  kubelet             2   0 /proc/35652/fd
10106  kubelet             2   0 /proc/35665/fd
10106  kubelet             2   0 /proc/35666/fd
10106  kubelet             2   0 /proc/35652/limits
10106  kubelet             2   0 /proc/diskstats
...

这里的信息包括进程 ID (PID)、进程命名名字 (COMM)、文件描述符 (FD)、错误代码 (ERR),还有系统调用试图打开的文件路径 (PATH)。opensnoop.bt 工具可以对出错的软件进行故障排查,也许软件尝试打开了错误的文件位置;也可以用于了解配置和日志文件的具体位置;还可以识别一些性能问题,比如文件打次频次过快,或者反复检查错误文件位置等。这个工具应用十分广泛。

文档创建于 , 最后一次更新于 , 文档当前的状态 未完成正式版停止更新 , 当前编写页面的版本 V1.3.1 。

  • No labels