dropwatch分析丢包

你说的对,直接 `nf_hook_slow` 的 trace 只显示调用,没有显示详细耗时信息。要分析 `nf_hook_slow` 的具体耗时和瓶颈,可以用下面方法:

---

## 1. 用 perf 采集带调用栈和时间的火焰图

```bash
sudo perf record -e cycles -g -- sleep 10
sudo perf script > out.perf
```

然后用火焰图工具生成火焰图,观察 `nf_hook_slow` 及其调用链的 CPU 时间占用。

---

## 2. 用 ftrace 开启函数跟踪及函数耗时

```bash
echo function > /sys/kernel/debug/tracing/current_tracer
echo nf_hook_slow > /sys/kernel/debug/tracing/set_ftrace_filter
echo 1 > /sys/kernel/debug/tracing/tracing_on
sleep 10
echo 0 > /sys/kernel/debug/tracing/tracing_on
cat /sys/kernel/debug/tracing/trace_pipe
cat /sys/kernel/debug/tracing/trace
```

这个可以看到进入和退出函数的时间戳,间接推断函数耗时。

---

## 3. 用 bpftrace 动态追踪函数耗时

写个 bpftrace 脚本:

```bpftrace
kprobe:nf_hook_slow
{
    @start[tid] = nsecs;
}

kretprobe:nf_hook_slow
{
    @durations[tid] = nsecs - @start[tid];
    printf("nf_hook_slow took %d ns\n", @durations[tid]);
    delete(@start[tid]);
}
```

保存为 `nf_hook_slow_time.bt`,运行:

```bash
sudo bpftrace nf_hook_slow_time.bt
```

可以实时打印函数执行耗时,单位纳秒。

---

## 4. 如果想分析网络包在 netfilter 中的延时,建议从 skb 处理链路整体采样,包括 conntrack、filter、nat 等函数调用链,结合时间戳综合分析。

---

需要我帮你写具体脚本,或者给你演示怎么用火焰图看耗时吗?重启某个pods conntrack观察相关pods ip状态情况 

3. 监控和调试手段

  • 观察 netlink 队列情况:

bash
cat /proc/net/netlink
  • 使用 perftrace-cmd 跟踪 netlink 相关函数。

  • 查看监听进程(如 conntrackd)的日志和性能指标。

posted on 2025-07-02 20:29  吃草的青蛙  阅读(31)  评论(0)    收藏  举报

导航