简介
仓库地址: https://github.com/OpenCloudOS/nettrace
背景: 在云原生场景中,linux系统中的网络部署变得越来越复杂,一个tcp连接,从客户端到服务器,中间可能要经过复杂的NAT
、GRE
、IPVS
等过程,网络报文在节点上的处理路径也变得越来越长,在发生网络故障时,如何快速定位、有效地定位出网络问题成为一个难题
现有的网络工具:
- tcpdump:只能在链路层抓包,无法定位内核协议栈中的问题,比如常规的内核丢包问题
- ftrace:只能追踪内核函数,无法进行报文过滤,且入手较难,需要对内核协议栈有一定了解
- kprobe:临时编写内核模块,效率和安全性低
- BCC:功能单一,临时编写BCC程序跟踪效率低,需要对内核有一定了解
- dropwatch:功能单一,只能查看网络丢包问题
功能介绍:
- 网络报文追踪:跟踪网络报文从进入到内核协议栈到释放/丢弃的过程中在内核所走过的路径,实现报文整个生命周期的监控,并采集生命周期各个阶段的事件、信息。
- 网络故障诊断:将以往的经验集成到工具的知识库,通过知识匹配的方式来主动诊断当前网络故障,给出诊断结果以及修复建议。
- 网络异常监控:常态化部署到生产环境中,主动地发现、上报环境上的网络异常
- droptrace:用于跟踪、监控系统中的丢包事件的工具,目前已经集成到nettrace中,通过
nettrace --drop
使用 - 性能分析:通过跟踪协议栈处理延迟、TCP RTT等信息进行网络性能分析
工作机制:
{% asset_img nettrace工作机制-6773285.png %}
参数介绍
过滤类参数
s/saddr: 根据源ip地址过滤网络包
d/daddr: 根据目标ip地址过滤网络包
addr: 根据源或目标地址ip过滤网络包
S/sport: 根据源TCP/UDP端口过滤网络包
D/dport: 根据目的TCP/UDP端口过滤网络包
P/port: 根据源或目标TCP/UDP端口过滤网络包
p/proto: 根据L3/L4协议过滤网络包
netns: 根据网络命令空间进行过滤,该参数后面跟的是网络命名空间的inode,可以通过ls -l /proc/<pid>/ns/net
来查看对应进程的网络命名空间的inode号
netns-current: 仅显示当前网络命名空间的报文
pid: 根据当前处理报文的进程id进行过滤
min-latency: 根据报文的寿命进行过滤, 仅打印处理时长超过该值的报文,单位为us。该参数在默认/diag/latency
模式下可用
pkt-len: 根据IP报文总长度来进行过滤
tcp-flags: 根据tcp报文的flags进行过滤,支持的flag包括:SAPRF
模式类参数
默认启用的是生命周期跟踪模式
basic: 基本模式,会直接打印出报文所经过的内核函数/tracepoint。
diag: 启用诊断模式
diag-quiet: 只显示出现存在问题的报文,不显示正常的报文
diag-keep: 持续跟踪,diag模式下,默认在跟踪到异常报文后会停止跟踪,使用该参数后,会持续跟踪下去
drop: 进行系统丢包监控
drop-stack: 打印kfree_skb内核函数的调用堆栈,等价于--trace-stack kfree_skb
sock: 启用socket模式。这个模式下,不会再跟踪报文(skb),而会跟踪socket
monitor: 启用监控模式。一种轻量化的实时监控系统中网络异常的模式
rtt: 启用Rtt统计模式,会统计tcp rtt分布情况
rtt-detail: 详细模式,输出符合过滤条件的每个报文的rtt数据
filter-srtt: 根据srtt来进行过滤,rtt/rtt-detail
模式下可用,单位ms
filter-minrtt: 根据minrtt来进行过滤,rtr/rtt-detail
模式下可用,单位ms
latency-show: 显示延迟(协议栈处理耗时)信息, basic/sock
模式下不可用
latency: 启用延迟分析模式,可以高效分析每个报文协议处理耗时
latency-summary: 启用延迟分析统计模式,可以统计协议栈处理耗时的分布情况
显示类参数
t/trace
概述: 要启用的跟踪group或者是具体的追踪点(通过trace.yaml
可以知道所有的group以及追踪点)
示例:
nettrace -t tcp
nettrace -t tcp_v4_send_reset
ret
跟踪和显示内核函数的返回值
detail
显示跟踪详细信息,包括当前的进程、网口和cpu等信息
date
以时间格式打印,而不是时间戳
c/count
指定要跟踪的报文个数c,达到该个数后自动退出
hooks
结合netfilter做的适配
tiny-show
精简显示,只显示第一个报文的内容,用于提升性能
trace-stack
概述: 指定需要进行堆栈打印的内核函数,可以指定多个,用","分隔
示例:
nettrace --trace-stack tcp_send_active_reset
trace-matcher
指定进行报文匹配的内核函数,默认所有的函数,用于提升性能
trace-exclude
概述: 不进行跟踪的group或者是具体的追踪点(通过trace.yaml
可以知道所有的group以及追踪点)
示例:
nettrace --trace-exclude life
nettrace --trace-exclude kfree_skb
trace-noclone
不跟踪报文的clone时间,即不把clone出来的报文和当前报文放到一块跟踪
func-stats
只统计内核函数被调用的次数,不打印具体的报文,可指定过滤条件
rate-limit
进行限速,限制每秒事件输出的数量
btf-path
手动指定btf文件的路径
debug
概述: 显示nettrace中的debug信息
bpf-debug
概述: 启用ebpf程序的debug日志输出,需要在使用make编译时添加选项BPF_DEBUG=1
示例:
make BPF_DEBUG=1
nettrace --bpf-debug