Heng30的博客
搜索 分类 关于 订阅

如何使用bpftrace跟踪调试内核?

2025-02-15

bpftrace是一个基于eBPF(扩展的伯克利包过滤器)的高级跟踪工具,用于动态追踪Linux系统的行为和性能。它允许用户通过简单的脚本语言编写跟踪程序,实时监控内核和用户空间的活动。

主要特点

  • 易用性:bpftrace提供了类似AWK的脚本语言,语法简洁,易于编写和调试。

  • 强大功能:支持动态插桩(kprobesuprobes)、tracepointsUSDT(用户静态定义跟踪点)等多种跟踪方式。

  • 低开销:基于eBPF技术,性能开销低,适合生产环境使用。

  • 灵活性:可以监控内核函数、用户态函数、系统调用、网络事件等。

常用场景

  • 性能分析:查找系统瓶颈、分析函数调用耗时。

  • 故障排查:跟踪特定进程或内核事件。

  • 动态监控:实时监控系统行为,如文件访问、网络连接等。

安装

  • sudo apt install -y bpftrace

示例(ubuntu 24.04)

  • 统计系统调用次数:

    • bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }'
    ...
    @[tracepoint:syscalls:sys_enter_getpeername]: 1
    @[tracepoint:syscalls:sys_enter_symlink]: 1
    @[tracepoint:syscalls:sys_enter_setpgid]: 1
    @[tracepoint:syscalls:sys_enter_signalfd4]: 2
    @[tracepoint:syscalls:sys_enter_utimensat]: 2
    @[tracepoint:syscalls:sys_enter_geteuid]: 2
    @[tracepoint:syscalls:sys_enter_getppid]: 2
    
  • 跟踪文件打开事件,打印出每个进程打开的文件名

    • bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'
    systemd-oomd /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/mem..
    systemd-oomd /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/mem..
    systemd-oomd /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/mem..
    systemd-oomd /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/mem..
    
  • 统计进程的CPU时间

    • bpftrace -e 'profile:hz:99 { @[comm] = count(); }'
    @[systemd-oomd]: 2
    @[zsh]: 3
    @[bpftrace]: 4
    @[gnome-shell]: 10
    @[sshd]: 17
    @[swapper/6]: 3271
    
  • 更多例子可参考bpftrace github

参考

希望上面的内容对你有所帮助。