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 队列情况:
-
使用
perf或trace-cmd跟踪 netlink 相关函数。 -
查看监听进程(如
conntrackd)的日志和性能指标。
浙公网安备 33010602011771号