$tcpinfo_rtt 是 Linux 4.10+ 内核 struct tcp_info 中字段,表示经 EWMA 平滑后的当前连接 RTT(微秒),用于监控回源链路质量;需通过 getsockopt(TCP_INFO) 获取,或借助 eBPF 无侵入采集。

$tcpinfo_rtt 是 Linux 内核中 struct tcp_info 结构体的一个字段(自 4.10+ 内核起正式稳定暴露),表示当前 TCP 连接最后一次成功测量得到的平滑往返时间(Smoothed RTT,单位为微秒)。它不等于原始采样 RTT,而是经过指数加权平均(EWMA)处理后的估计值,更稳定、更适合监控回源链路质量。
确认内核版本与可用性
该字段仅在较新内核中可靠支持:
- Linux ≥ 4.10:
tcpinfo_rtt字段正式加入struct tcp_info,可通过getsockopt(..., IPPROTO_TCP, TCP_INFO, ...)获取; - 需确保内核配置启用
CONFIG_INET_TCP_DIAG(通常默认开启); - 用户态程序需使用足够新的
linux/tcp.h头文件(建议 glibc ≥ 2.29 或直接包含内核头); - 注意:部分旧发行版(如 CentOS 7 默认 3.10 内核)不支持,需升级或打补丁。
在回源场景中获取 $tcpinfo_rtt 的典型方式
回源链路(如 CDN 节点向源站发起 HTTP/HTTPS 回源请求)本质是客户端 TCP 连接。要监控其 RTT,关键是在连接活跃且有数据交互时读取:
- 对每个活跃回源连接,在发送请求后、收到响应前(或周期性)调用
getsockopt(fd, IPPROTO_TCP, TCP_INFO, &ti, &len); - 检查
ti.tcpi_rtt(即$tcpinfo_rtt)是否非零(为 0 表示尚未完成首次 RTT 估算); - 推荐在连接建立后、首包 ACK 收到后开始采集,并避开连接刚建立或即将关闭的不稳定阶段;
- 若使用 epoll 或 io_uring,可在可读/可写事件回调中嵌入采集逻辑,避免额外轮询开销。
结合 eBPF 实现无侵入式全链路采集
若无法修改回源服务代码(如 Nginx、Envoy),可借助 eBPF 在内核层面提取 tcpinfo_rtt:
- 使用
tracepoint:tcp:tcp_retransmit_skb或kprobe:tcp_rcv_established捕获 TCP 状态更新时机; - 通过
bpf_get_socket_info()(5.10+)或手动解析 socket 结构体,安全读取sk->sk_tcp_rtt或填充tcp_info; - 将结果(含源/目的 IP、端口、RTT 值、时间戳)推送至 perf buffer 或 ringbuf,由用户态聚合上报;
- 优势:无需重启服务、不干扰业务逻辑、可覆盖所有回源连接(包括短连接);
- 注意:eBPF 程序需适配内核版本,且
tcpinfo_rtt值需从struct sock中正确偏移读取(不同内核结构略有差异)。
解读与告警建议
$tcpinfo_rtt 是诊断回源延迟的强信号,但需结合上下文理解:
- 单次值波动正常,应关注 P95/P99 分位数、趋势变化(如持续上升可能预示链路拥塞或中间设备异常);
- 对比同地域多源站 RTT,可定位具体源站网络问题;
- 若 RTT 突增但重传率未升,可能是路径变更(如 BGP 收敛);若 RTT + 重传率同步升高,更倾向丢包或中间设备限速;
- 避免与应用层耗时(如源站处理时间)混淆:RTT 仅反映网络层往返,需分离测量(例如在回源请求发出前和响应头到达后分别打点)。










