eBPF 允许在不修改内核源码、不加载内核模块的前提下,将沙箱化的字节码挂载到 kprobe、tracepoint、uprobe 等钩子点,实现微秒级的内核行为观测。
![]()
一、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")