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

DPDK模拟报文发送时延 轮询等待方式下报文无法发送问题咨询

DPDK轮询添加模拟传输时延导致发送失败问题

问题描述

需要在DPDK发送报文流程中模拟报文传输时延:

  • 初始方案:调用usleep(10)插入时延,功能可正常运行,但睡眠函数会阻塞线程影响流量发生器性能,原有逻辑代码如下:
usleep(10);
rte_eth_tx_burst(m_repid, queue_id, tx_pkts, nb_pkts);
  • 替换方案:改用忙等轮询机制实现非阻塞时延,替换原有睡眠逻辑,代码如下:
inline void add_latency(float lat) {
    //usleep(lat);
    float start = now_sec();
    float elapsed;
    do {
        elapsed = now_sec() - start;
    } while(elapsed < (lat/1000));
}
  • 故障现象:轮询时延逻辑上线后,报文无法正常发送,rte_eth_tx_burst接口返回发送成功的报文数为0。

环境信息

  • DPDK版本:22.03
  • BIOS版本:2.0.19(通过dmidecode -s bios-version命令查询)
  • 网卡信息:
0000:01:00.0 'I350 Gigabit Network Connection' if=em1 drv=igb unused=igb_uio,vfio-pci,uio_pci_generic *Active*
0000:01:00.3 'I350 Gigabit Network Connection' if=em4 drv=igb unused=igb_uio,vfio-pci,uio_pci_generic 

故障根因

  1. 网卡未绑定DPDK用户态驱动
    从网卡信息可以看到,两块I350千兆网卡当前绑定的是内核原生igb驱动,DPDK专用的igb_uio/vfio-pci/uio_pci_generic驱动均未加载,DPDK没有直接接管网卡硬件。这种场景下rte_eth_tx_burst的发送逻辑依赖内核igb驱动的调度,需要内核相关线程获得CPU时间,才能完成报文写入网卡发送环、清理已发送报文描述符的操作。

  2. 忙等轮询占满CPU,内核无调度机会
    usleep是阻塞类调用,执行时当前线程会主动让出CPU使用权,内核可以正常调度网卡软中断、发送队列处理等任务运行。但实现的忙等轮询逻辑会100%占满所在CPU核心的时间片,如果DPDK进程配置了CPU亲和性绑核、且运行优先级高于内核任务,内核完全没有机会在对应核心上执行网卡发送相关操作,网卡发送环的旧描述符得不到清理,新报文无法入队,最终rte_eth_tx_burst返回0。

  3. 时延单位计算错误,加剧堵塞
    轮询逻辑存在单位换算错误:now_sec()返回的是秒级时间戳,原usleep(10)是等待10微秒,对应秒单位为0.00001秒;但代码里等待阈值计算为lat/1000,如果传入参数lat=10,实际等待时长是0.01秒(即10毫秒),是原有时延的1000倍,长时间占核会进一步加剧发送队列堵塞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:12:20