当前位置: 首页 > news >正文

为什么网卡停止收包?——Intel网卡RX Buffer Replenishment机制深度解析(上)

一、一次十分诡异的现网故障

某数据中心部署了一套基于DPDK开发的100GbE高性能交换机。

系统上线数月后。

现场反馈:

业务偶尔出现:20~50ms流量中断。

随后自动恢复。

整个过程中:

CPU始终100%。

Worker没有退出。

PMD持续运行。

监控如下:

指标状态
PMD CPU100%
RX Queue正常
TX Queue正常
Descriptor Error0
DD Bit正常
LinkUp

继续抓取:网卡统计。

发现:

CRC Error:0。

Missed Packet:0。

RX No Buffer:0。

一切似乎都没有问题。

但是:

交换机就是停止收包几十毫秒。

随后又恢复正常。


核心知识点一

对于DPDK来说:DD Bit正常,并不意味着RX能够持续运行。

真正决定:NIC是否还能继续DMA。

还有另外一个容易被忽略的条件。


二、第一轮排查:怀疑DD Bit

由于收包停止。

团队首先怀疑Descriptor。

于是:增加调试日志。

持续打印Descriptor Status。

例如:

status = rxdp->wb.upper.status_error;

观察发现:

DD始终能够正常置位。

并不存在Descriptor没有回写的问题。

因此排除:Write Back异常。


三、第二轮排查:怀疑RX Ring

继续查看RX Ring。

发现:RDH、RDT均处于合理范围。

Descriptor没有耗尽。

Ring也没有Overflow。

很多开发者此时都会认为:RX Ring没有问题。

事实上这里恰恰隐藏着真正的陷阱。


核心知识点二

RX Ring里面保存的不是Packet。

保存的是:Buffer描述信息。


四、很多人一直误解了RX Descriptor

第一次阅读Intel网卡手册。

很多人都会认为:RX Descriptor就是Packet。

实际上完全不是。

例如:

Intel 82599:Advanced RX Descriptor里面主要包含:

Packet Buffer Address Header Buffer Address Status Length RSS Hash VLAN Checksum

注意。

真正的数据并没有存放:Descriptor。

Descriptor只保存一个DMA目标地址。

真正Packet存放在mbuf对应的数据缓冲区。

也就是说:Descriptor更像一张"地址卡片"。

告诉NIC:

下一帧数据,请DMA到这里。


五、真正的数据流是什么?

收到一个Packet以后。

NIC真正执行的是:

Packet ↓ MAC ↓ RX FIFO ↓ DMA到mbuf Data Buffer ↓ 更新Descriptor Status ↓ DD = 1

CPU随后读取Descriptor获得Packet Length、RSS、Checksum。

然后取得对应mbuf。真正处理Packet。

注意。

这里CPU已经拿走了这个mbuf。

那么问题来了。

NIC下一次收到Packet。

还能继续DMA到同一个Buffer吗?

答案:不能。


核心知识点三

一个RX Buffer只能完成一次DMA。

Packet被CPU接管以后。

NIC必须重新获得一个新的Buffer。

才能继续收包。


六、真正容易被忽略的一半生命周期

很多开发者理解的RX流程:

只有前半段。

例如:

Packet ↓ DMA ↓ DD=1 ↓ CPU收到mbuf

于是认为整个RX流程结束。

实际上真正完整的生命周期应该是:

Packet ↓ DMA到mbuf ↓ DD=1 ↓ CPU处理Packet ↓ 释放旧Buffer ↓ 重新申请mbuf ↓ 重新填写RX Descriptor ↓ 通知NIC ↓ 下一次DMA

也就是说。

CPU处理完Packet以后。

真正重要的工作才刚刚开始。

如果没有新的Buffer。

NIC即使收到Packet。

也没有地方DMA。


七、问题终于开始浮现

继续阅读PMD源码。

发现rte_eth_rx_burst():并不是收到Packet就结束。

真正最后还有一段容易被忽略的代码。

它负责:

  • 分配新的mbuf;
  • 重新填写RX Descriptor;
  • 更新RX Tail。

看到这里。

真正的问题终于浮现。

现场DD正常、Descriptor正常、CPU正常。

但是NIC为什么还是停止收包?

真正值得怀疑的已经不是DD Bit。

而是:RX Buffer Replenishment(接收缓冲补充)机制。


(未完待续)

http://www.jsqmd.com/news/1125820/

相关文章:

  • Bellman方程 - RL强化学习中价值估计的数学根基
  • LangChain快速入门-03Retrieval(上)
  • 为什么测试这么难写?
  • HagiCode 是怎么把 13 个 Agent CLI 接到一套系统里的
  • 成都热门的中央空调企业哪家可靠
  • 告别重复劳动!GIMP BIMP批量图像处理插件完全指南
  • 自动售货机运营需要了解哪些政策法规?新手必看~YH
  • 数据血缘追踪与元数据管理平台
  • NET中的异步编程(四)- IO完成端口以及FileStream.BeginRead
  • 全球邮轮旅行服务市场投资前景分析及发展研究建议报告2026年版
  • Nano Banana 2 怎么用?14 种宽高比 + 4K 出图完整步骤
  • 国漫视效巅峰最好的国产动画片哪吒魔童
  • 四步部署Dify:构建私有化AI应用开发平台
  • 从文档到AI知识库:工程化SOP与RAG实战指南
  • Engine-Sim实战:3大技术挑战与精准仿真验证指南
  • 智商平平”学软件
  • 暖通 / 配电 / 动环培训推荐|传统技工转行机房刚需岗位完整攻略
  • 2025-2026工业纯水机主流品牌资质服务多维对比指南
  • magnetW:一款高效的跨平台磁力链接聚合搜索工具完全指南
  • 从团购网的漏洞看网站安全性问题
  • Git凭据助手原理与安全实践:从本地开发到CI/CD的凭证治理
  • Nginx安全头配置实战:从X-Frame-Options到CSP的完整指南
  • 使用WorkBuddy自动发微博教程
  • 三轴运动跟踪系统设计与IMU传感器应用实践
  • 微信支付V3 微信小程序支付 线下正常、线上验签失败 回调异常 报错 com.wechat.pay.java.core.exception.ValidationException
  • 【2026】3ds Max 2027安装教程超详细图文步骤(附完整安装包)
  • 低压密集型母线槽核心选材标准解析,16 年生产工厂实操经验总结
  • WP7有约(三):课堂重点
  • R语言实现电力系统N-1事故分析与风险图谱生成
  • 创业是一种心态、信念和坚持,是一种生活方式