[Linux] [Tool] 内核监控神器:bpftrace

参考

介绍

简介

pftrace 是一款基于 eBPF 的高级动态追踪工具,它使用类似 awk 的脚本语言,可以观测和分析内核及用户空间程序的几乎所有行为。

版本要求

内核需求

  • 内核版本 ≥ Linux 4.9(完整功能需 ≥ 5.x)

常用系统

  • CentOS 8 (内核版本 4.18.0,支持不完全)及以上
  • Ubuntu 18.04.3 LTS (内核版本5.0) 以及上

国产系统

  • Kylin V10 SP1\2\3(内核版本 4.19.90,支持不完全)
  • OpenEuler 22.03(内核版本 5.10.0,完全支持)以及上

基础操作

  • 列出可用探针
bpftrace -l

01 系统调用监控

1.1 统计所有系统调用的次数

  • 监控任意系统调用的参数、返回值、频率:
# 统计所有系统调用的次数
bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }'

1.2 内核函数跟踪

  • 动态挂钩内核函数(无需修改内核)
# 跟踪内核函数调用的堆栈
bpftrace -e 'kprobe:__alloc_pages { @[kstack] = count(); }'

1.3 硬件事件监控

  • 监控 CPU 缓存命中、缺页异常等:
# 统计进程的缺页异常(page faults)
bpftrace -e 'software:faults:page-fault { @[comm] = count(); }'

02 用户空间程序分析

2.1 函数调用跟踪

  • 跟踪用户态函数的调用参数
# 监控 libc 的 malloc 调用
bpftrace -e 'uprobe:/lib/x86_64-linux-gnu/libc.so.6:malloc { printf("%s malloc(%d)\n", comm, arg0); }'

2.2 延迟分析

  • 测量函数执行耗时
bpftrace -e 'uprobe:/bin/bash:readline { @start[tid] = nsecs; }
              uretprobe:/bin/bash:readline /@start[tid]/ { 
                @ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); 
              }'

03 系统性能分析

3.1 CPU使用分析

  • 生成火焰图定位热点
bpftrace -e 'profile:hz:99 { @[ustack] = count(); }' > out.stacks
# 配合 FlameGraph 生成可视化

3.2 IO性能分析

  • 统计块设备IO延迟
bpftrace -e 'tracepoint:block:block_rq_issue { @start[args->device] = nsecs; }
             tracepoint:block:block_rq_complete /@start[args->device]/ {
               @us[args->device] = hist(nsecs - @start[args->device]); 
             }'

04 安全监控

4.1 敏感行为检测

  • 敏感文件访问监控
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { 
  if (str(args->filename) == "/etc/shadow") { 
    printf("ALERT: %s tried to access shadow!\n", comm); 
  } 
}'

4.2 异常进程行为

  • 检测反弹shell(异常execve调用)
bpftrace -e 'tracepoint:syscalls:sys_enter_execve { 
  printf("PID %d executed: %s\n", pid, join(args->argv)); 
}'

05 网络流量分析

5.1 TCP/UDP连接追踪

  • 统计 TCP 连接目标:
bpftrace -e 'tracepoint:syscalls:sys_enter_connect { 
  @dest[comm] = lhist(args->uservaddr->sin_port, 0, 65535, 100); 
}'

5.2 数据包捕获

  • 抓取特定进程的HTTP请求
bpftrace -e 'tracepoint:syscalls:sys_exit_read /comm == "curl"/ { 
  if (args->ret > 0) { printf("%s\n", str(buf(args->buf, args->ret))); } 
}'

06 动态调试与热修复

6.1 实时打桩

  • 临时修改函数返回值
bpftrace -e 'kretprobe:vfs_read { if (retval > 100) { retval = -EIO; } }'

6.2 内存泄露检测

  • 跟踪内存分配/释放不均匀
bpftrace -e 'uprobe:/lib/libc.so.6:malloc { @alloc[tid]++; }
             uprobe:/lib/libc.so.6:free { @alloc[tid]--; }
             interval:s:5 { print(@alloc); clear(@alloc); }'

07 容器/K8s环境观测

  • 跟踪容器内的系统调用:
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { 
  printf("ContainerID: %s, Cmd: %s, File: %s\n", 
         cgroup, comm, str(args->filename)); 
}'
posted on 2025-04-29 19:03  风惊庭前叶  阅读(222)  评论(0)    收藏  举报