You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DPDK 21.11 X710网卡rte_eth_tx_burst突发停发数据包排查

DPDK 21.11 X710网卡rte_eth_tx_burst突发停发问题排查

自研应用基于DPDK 21.11版本实现数据包收发逻辑,业务稳定运行一段时间后,rte_eth_tx_burst API突然停止向外发送任何数据包,完整排查过程与结论如下:

基础环境

  • 网卡:X710 10GbE SFP+以太网控制器(设备ID 1572)
  • 驱动:网卡绑定vfio-pci驱动
  • 队列配置:RX描述符数量128,TX描述符数量512

初始发包逻辑

业务侧实现了最多3次重试的发包逻辑,代码片段如下:

#define MAX_RETRY_COUNT_RTE_ETH_TX_BURST 3

do
{
    num_sent_pkt = rte_eth_tx_burst(eth_port_id, queue_id, &mbuf[mbuf_idx], pkt_count);
    pkt_count -= num_sent_pkt;
    retry_count++;
} while(pkt_count && (retry_count != MAX_RETRY_COUNT_RTE_ETH_TX_BURST));

初步排查

首先通过telemetry接口读取端口1的ethdev xstats扩展统计信息,所有错误计数均为0,无异常统计项,结果如下:

--> /ethdev/xstats,1
{"/ethdev/xstats": {"rx_good_packets": 97727, "tx_good_packets": 157902622, "rx_good_bytes": 6459916, "tx_good_bytes": 229590348448, "rx_missed_errors": 0, "rx_errors": 0, "tx_errors": 0, "rx_mbuf_allocation_errors": 0, "rx_unicast_packets": 95827, "rx_multicast_packets": 1901, "rx_broadcast_packets": 0, "rx_dropped_packets": 0, "rx_unknown_protocol_packets": 97728, "rx_size_error_packets": 0, "tx_unicast_packets": 157902621, "tx_multicast_packets": 0, "tx_broadcast_packets": 1, "tx_dropped_packets": 0, "tx_link_down_dropped": 0, "rx_crc_errors": 0, "rx_illegal_byte_errors": 0, "rx_error_bytes": 0, "mac_local_errors": 0, "mac_remote_errors": 0, "rx_length_errors": 0, "tx_xon_packets": 0, "rx_xon_packets": 0, "tx_xoff_packets": 0, "rx_xoff_packets": 0, "rx_size_64_packets": 967, "rx_size_65_to_127_packets": 96697, "rx_size_128_to_255_packets": 0, "rx_size_256_to_511_packets": 64, "rx_size_512_to_1023_packets": 0, "rx_size_1024_to_1522_packets": 0, "rx_size_1523_to_max_packets": 0, "rx_undersized_errors": 0, "rx_oversize_errors": 0, "rx_mac_short_dropped": 0, "rx_fragmented_errors": 0, "rx_jabber_errors": 0, "tx_size_64_packets": 0, "tx_size_65_to_127_packets": 46, "tx_size_128_to_255_packets": 0, "tx_size_256_to_511_packets": 0, "tx_size_512_to_1023_packets": 0, "tx_size_1024_to_1522_packets": 157902576, "tx_size_1523_to_max_packets": 0, "rx_flow_director_atr_match_packets": 0, "rx_flow_director_sb_match_packets": 13, "tx_low_power_idle_status": 0, "rx_low_power_idle_status": 0, "tx_low_power_idle_count": 0, "rx_low_power_idle_count": 0, "rx_priority0_xon_packets": 0, "rx_priority1_xon_packets": 0, "rx_priority2_xon_packets": 0, "rx_priority3_xon_packets": 0, "rx_priority4_xon_packets": 0, "rx_priority5_xon_packets": 0, "rx_priority6_xon_packets": 0, "rx_priority7_xon_packets": 0, "rx_priority0_xoff_packets": 0, "rx_priority1_xoff_packets": 0, "rx_priority2_xoff_packets": 0, "rx_priority3_xoff_packets": 0, "rx_priority4_xoff_packets": 0, "rx_priority5_xoff_packets": 0, "rx_priority6_xoff_packets": 0, "rx_priority7_xoff_packets": 0, "tx_priority0_xon_packets": 0, "tx_priority1_xon_packets": 0, "tx_priority2_xon_packets": 0, "tx_priority3_xon_packets": 0, "tx_priority4_xon_packets": 0, "tx_priority5_xon_packets": 0, "tx_priority6_xon_packets": 0, "tx_priority7_xon_packets": 0, "tx_priority0_xoff_packets": 0, "tx_priority1_xoff_packets": 0, "tx_priority2_xoff_packets": 0, "tx_priority3_xoff_packets": 0, "tx_priority4_xoff_packets": 0, "tx_priority5_xoff_packets": 0, "tx_priority6_xoff_packets": 0, "tx_priority7_xoff_packets": 0, "tx_priority0_xon_to_xoff_packets": 0, "tx_priority1_xon_to_xoff_packets": 0, "tx_priority2_xon_to_xoff_packets": 0, "tx_priority3_xon_to_xoff_packets": 0, "tx_priority4_xon_to_xoff_packets": 0, "tx_priority5_xon_to_xoff_packets": 0, "tx_priority6_xon_to_xoff_packets": 0, "tx_priority7_xon_to_xoff_packets": 0}}

初期怀疑存在TX描述符泄漏,尝试查找对应计数器判断丢包是否由无可用TX描述符导致,未找到匹配的异常计数。

深度驱动层排查

  • 首先排查mbuf引用计数逻辑,未发现异常
  • 跟踪i40e驱动调用链路:rte_eth_tx_burst内部调用i40e_xmit_pkts发包,发包前会调用i40e_xmit_cleanup回收已完成发送的描述符。问题触发时,驱动内的TX描述符DONE状态校验逻辑失败,返回-1直接中断发包流程,对应代码如下:
if ((txd[desc_to_clean_to].cmd_type_offset_bsz &
        rte_cpu_to_le_64(I40E_TXD_QW1_DTYPE_MASK)) !=
        rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE)) {
    PMD_TX_LOG(DEBUG, "TX descriptor %4u is not done "
           "(port=%d queue=%d)", desc_to_clean_to,
           txq->port_id, txq->queue_id);
    return -1;
}
  • 临时验证:注释掉上述return -1语句(该操作不属于合规修复,存在触发内存越界、重复发包等问题的风险),测试发现流量可长期稳定运行
  • 从流量启动到问题复现全程跟踪mbuf生命周期与状态,未发现mbuf存在异常
  • 已知I40E_TX_DESC_DTYPE_DESC_DONE标记由网卡硬件完成发送后置位,更换物理网卡后问题仍可复现,因此排除硬件故障,初步判定根因在业务代码侧,但暂不清楚业务逻辑如何影响网卡对TX描述符DONE状态的置位。

根因与修复

最终定位问题根因:2个CPU核心共用同一个TX队列ID发送数据包,导致TX描述符状态损坏

  • 核心1:负责常规业务数据处理与TX发送的业务核心
  • 核心2:负责RX侧处理ARP请求、构造ARP响应并发送的核心

DPDK PMD驱动原生无多核心并发访问同一个RX/TX队列的保护逻辑,跨核同时操作同一个TX队列时,会出现TX ring读写指针错乱、描述符元数据被覆盖的问题,直接导致网卡硬件无法正常识别描述符、置位发送完成DONE标记,最终描述符回收失败、所有可用TX描述符被占满,发包完全中断。

修复方案:为ARP消息单独分配独立的TX队列,严格保证每个TX队列仅被一个CPU核心访问。修复后业务连续运行2小时以上未复现问题。

开发提示:DPDK队列设计为单生产者/单消费者模型,所有RX/TX队列的操作必须严格绑定到单个CPU核心执行,跨核共享队列会触发不可预期的收发异常、内存错误。

内容的提问来源于stack exchange,提问作者nmurshed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:36:23