3、监控指标体系:吞吐量、延迟、丢包率、重传率、乱序率、队列深度

监控RoCE网络,说白了就是盯住六个核心指标。我刚开始调RoCE时,面对一堆计数器完全懵了——后来才明白,这六个指标就像汽车的仪表盘,缺一个你都开不稳。

嗯,咱们一个一个来拆解。

3.1 吞吐量:最直观的“能跑多快”

吞吐量就是单位时间内成功传输的数据量。对于RoCE,我们通常看两个层面:

  • 网卡级吞吐量:物理端口实际收发的比特率
  • 应用级吞吐量:上层业务实际拿到的有效数据速率

我个人习惯用 ethtool -S 或者 perf stat 来抓网卡计数器。举个例子:

# 查看网卡统计
ethtool -S enp175s0 | grep -E "rx_bytes|tx_bytes"

# 用sar看实时吞吐
sar -n DEV 1 5

我在项目中遇到过一个问题:吞吐量显示接近线速,但应用层就是慢。后来发现是MTU没对齐,导致CPU拼命做分片重组。你想想看,网卡跑得再快,CPU扛不住也是白搭。

关键阈值:当吞吐量低于线速的80%时,就该排查了。尤其是100Gbps链路,丢一个MTU大小的包,吞吐可能直接掉10%。

3.2 延迟:RoCE的“命门”

延迟是RoCE最敏感的指标。RDMA之所以快,就是因为它绕过了内核,把延迟压到了微秒级。一旦延迟飙升,业务立马感知。

延迟分几种:

  • 端到端延迟:从发送方应用写到接收方应用读到
  • 网络往返延迟(RTT):纯粹的网络传输时间
  • 队列延迟:数据在交换机或网卡缓冲区里排队的时间

我常用的测量工具是 ib_write_latperftest 套件:

# 测量端到端延迟
ib_write_lat -a -d mlx5_0 -i 1

为什么会这样?因为RoCE的流控机制(DCQCN)就是靠延迟信号来调整发送速率的。延迟一抖动,PFC死锁就可能出现。我曾经在某个存储集群里,就因为交换机微突发导致延迟从5μs飙到200μs,整个集群IO直接卡死。

我的经验:延迟监控建议用百分位(P99、P999),别只看平均值。平均值5μs,P99可能已经500μs了——这才是真正的性能杀手。

3.3 丢包率:零容忍的指标

RoCE网络对丢包是零容忍的。为什么?因为RDMA协议没有TCP那样的重传机制——丢一个包,整个QP(队列对)就可能挂掉。

丢包率通常用 ethtool -S 看网卡统计:

ethtool -S enp175s0 | grep -E "drop|discard|error"

我建议重点关注这几个计数器:

  • rx_dropped:接收端丢弃的包
  • tx_discarded:发送端丢弃的包
  • rx_buffer_errors:缓冲区溢出导致的丢包
注意:RoCE的丢包率必须为0。哪怕0.001%的丢包,对RDMA应用来说都是灾难。我曾经排查过一个案例,丢包率只有0.0005%,但存储集群的IOPS直接腰斩。

3.4 重传率:网络健康的“晴雨表”

重传率反映的是数据包需要重新发送的比例。虽然RoCE本身不重传,但上层协议(如iWARP或RoCE v2的拥塞控制)会触发重传。

查看重传率可以用 netstat -s 或者 rdma statistic

# 查看TCP重传(如果RoCE跑在TCP上)
netstat -s | grep retransmit

# 查看RDMA重传统计
rdma statistic show

重传率升高通常意味着:

  • 网络存在拥塞
  • 链路质量差(光模块故障、线缆松动)
  • 交换机缓存不足

嗯,这里要注意:重传率和丢包率不是一回事。丢包了不一定重传(比如被上层忽略),重传了也不一定是因为丢包(比如超时重传)。

3.5 乱序率:被忽视的“隐形杀手”

乱序率很多人不关注,但我觉得它比丢包更隐蔽。RoCE依赖顺序交付,一旦乱序,接收端就要花额外资源去重组。

乱序率可以用 tcpdump 抓包分析:

# 抓包分析乱序
tcpdump -i enp175s0 -w roce.pcap
# 然后用Wireshark打开,看TCP序列号或RDMA的PSN

我在项目中遇到过:某台服务器的RoCE延迟忽高忽低,查了半天发现是ECMP哈希不均,导致同一个流的数据包走了不同路径,乱序率高达5%。

避坑指南:我曾经以为乱序率1%以下就没事,结果发现存储集群的元数据操作全卡住了。后来才知道,乱序会导致接收端频繁触发NACK,相当于变相增加了重传。

3.6 队列深度:拥塞的“前兆信号”

队列深度是交换机或网卡缓冲区里排队的数据量。这个指标能提前预警拥塞——队列深度开始涨,说明网络快扛不住了。

查看队列深度的方法:

  • 网卡队列ethtool -Stx_queue_len
  • 交换机队列:通过SNMP或CLI查看端口队列统计
  • RDMA QP深度ibv_devinfo 查看QP的发送/接收队列深度
# 查看网卡发送队列长度
ip -s link show enp175s0

# 查看RDMA QP状态
rdma resource show qp

我个人习惯把队列深度和延迟放在一起看。队列深度从0涨到100,延迟可能只增加10μs;但从100涨到200,延迟可能直接翻倍。这就是拥塞的“非线性效应”。

我的经验:队列深度监控建议设置两级阈值——黄色预警(队列深度达到最大值的60%)和红色告警(达到80%)。一旦触发红色告警,基本可以断定拥塞即将发生。

3.7 六个指标的关系:一张图看懂

这六个指标不是孤立的。我画了一张图,帮你理清它们之间的因果关系:

RoCE监控指标体系关系图 吞吐量 延迟 丢包率 重传率 乱序率 队列深度 过高导致 加剧 正相关 触发 间接导致 溢出导致 核心逻辑:队列深度 → 延迟/丢包 → 重传/乱序 → 吞吐量下降 直接指标 敏感指标 后果指标 衍生指标

从这张图可以看出:队列深度是“前兆”,延迟和丢包是“症状”,重传和乱序是“并发症”,吞吐量是“最终结果”。监控时,我建议按这个优先级来:队列深度 > 延迟 > 丢包率 > 重传率 > 乱序率 > 吞吐量。

总结一下:六个指标,一个都不能少。但别贪多——先盯住队列深度和延迟,这两个抓住了,其他指标自然就稳了。我这些年踩过的坑,十有八九都是队列深度先报警,然后延迟飙升,最后丢包崩盘。

公众号:蓝海资料掘金营,微信deep3321