欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

Linux 内核 eBPF 可观测性:Tracepoint 与 kprobe 动态追踪

发表于:|最后更新:|分类:Linux与内核|阅读:3987 次

eBPF 允许在不修改内核源码、不加载内核模块的前提下,将沙箱化的字节码挂载到 kprobe、tracepoint、uprobe 等钩子点,实现微秒级的内核行为观测。

eBPF 追踪架构

一、BCC 统计系统调用延迟

python
from bcc import BPF

program = r"""
BPF_HASH(start, u32);
BPF_HISTOGRAM(dist);

int trace_entry(struct pt_regs *ctx) {
    u32 pid = bpf_get_current_pid_tgid();
    u64 ts = bpf_ktime_get_ns();
    start.update(&pid, &ts);
    return 0;
}

int trace_return(struct pt_regs *ctx) {
    u32 pid = bpf_get_current_pid_tgid();
    u64 *tsp = start.lookup(&pid);
    if (tsp == 0) return 0;
    u64 delta = bpf_ktime_get_ns() - *tsp;
    dist.increment(bpf_log2l(delta / 1000));
    start.delete(&pid);
    return 0;
}
"""
b = BPF(text=program)
b.attach_kprobe(event="__x64_sys_read", fn_name="trace_entry")
b.attach_kretprobe(event="__x64_sys_read", fn_name="trace_return")