eBPF 不仅用于网络加速,也是内核可观测性的利器。通过挂载到 kprobe、tracepoint 或 tc(traffic control) 钩子上的 eBPF 程序,可以在不修改内核源码、不重启服务的情况下实时采集函数调用延迟与丢包统计。
一、bpftrace 一行命令定位块 I/O 延迟
bash
# 追踪块设备 I/O 完成事件,输出延迟超过 10ms 的请求
bpftrace -e '
tracepoint:block:block_rq_complete
/args->nr_sector > 0/
{
@start[args->dev] = nsecs;
}
tracepoint:block:block_rq_complete
{
$lat = nsecs - @start[args->dev];
if ($lat > 10000000) {
printf("slow I/O dev=%d latency=%d us\n", args->dev, $lat / 1000);
}
delete(@start[args->dev]);
}'