【Linux 网络子系统深度拆解】内核网络追踪工具箱:bpftrace/perf/ftrace 实战
💡
原文中文,约14900字,阅读约需36分钟。
📝
内容提要
本文讨论了网络故障排查中的常见问题,介绍了内核的三层可观测基础设施(tracepoint、kprobe/fentry、PMC),以及如何使用bpftrace、perf和ftrace等工具进行网络诊断。重点分析了TCP连接延迟的根因,展示了如何通过这些工具追踪丢包和TCP重传等问题,并提供了实用的命令示例和最佳实践。
🎯
关键要点
- 网络故障排查中常见问题是无法确定问题所在层次。
- 内核提供三层可观测基础设施:tracepoint、kprobe/fentry、PMC。
- bpftrace、perf 和 ftrace 是操作这三层基础设施的主要工具。
- tracepoint 用于追踪网络子系统的关键路径,如丢包、TCP 状态等。
- kfree_skb 是重要的丢包追踪点,提供丢包原因信息。
- tcp_probe 用于记录 TCP 拥塞状态的快照,帮助诊断性能问题。
- bpftrace 是基于 eBPF 的高级追踪语言,适合复杂内核追踪。
- perf 适合全局性能分析,能够生成火焰图和统计采样。
- ftrace 是内核内建的轻量追踪框架,适合在最小化环境中使用。
- 选择工具时需考虑安装需求、编程模型、聚合能力和适用场景。
- 通过实际案例展示了如何使用三大工具协同分析 TCP 连接延迟问题。
❓
延伸问答
如何使用bpftrace进行TCP重传的根因分析?
可以使用bpftrace脚本追踪tcp重传事件和拥塞状态,示例脚本如下: bpftrace -e 'tracepoint:tcp:tcp_retransmit_skb { ... }'
ftrace与perf的主要区别是什么?
ftrace是内核内建的轻量追踪框架,适合最小化环境使用,而perf适合全局性能分析,能够生成火焰图和统计采样。
在网络故障排查中,如何选择合适的追踪工具?
选择工具时需考虑安装需求、编程模型、聚合能力和适用场景,例如bpftrace适合条件过滤和实时告警,perf适合全局采样。
TCP连接延迟的根因分析步骤是什么?
步骤包括使用perf stat快速定界,使用bpftrace定位重传连接,使用tcp_probe追踪cwnd变化,最后确认丢包位置。
kfree_skb tracepoint的作用是什么?
kfree_skb tracepoint用于追踪内核因错误丢弃sk_buff时的丢弃原因,提供详细的丢包信息。
如何使用perf生成网络包处理的火焰图?
可以使用perf record命令采样CPU栈,然后通过perf script和FlameGraph工具生成火焰图,示例命令为:perf record -a -g --call-graph dwarf -F 99 -- sleep 30。
➡️