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
故障根因
网卡未绑定DPDK用户态驱动
从网卡信息可以看到,两块I350千兆网卡当前绑定的是内核原生igb驱动,DPDK专用的igb_uio/vfio-pci/uio_pci_generic驱动均未加载,DPDK没有直接接管网卡硬件。这种场景下rte_eth_tx_burst的发送逻辑依赖内核igb驱动的调度,需要内核相关线程获得CPU时间,才能完成报文写入网卡发送环、清理已发送报文描述符的操作。忙等轮询占满CPU,内核无调度机会
usleep是阻塞类调用,执行时当前线程会主动让出CPU使用权,内核可以正常调度网卡软中断、发送队列处理等任务运行。但实现的忙等轮询逻辑会100%占满所在CPU核心的时间片,如果DPDK进程配置了CPU亲和性绑核、且运行优先级高于内核任务,内核完全没有机会在对应核心上执行网卡发送相关操作,网卡发送环的旧描述符得不到清理,新报文无法入队,最终rte_eth_tx_burst返回0。时延单位计算错误,加剧堵塞
轮询逻辑存在单位换算错误:now_sec()返回的是秒级时间戳,原usleep(10)是等待10微秒,对应秒单位为0.00001秒;但代码里等待阈值计算为lat/1000,如果传入参数lat=10,实际等待时长是0.01秒(即10毫秒),是原有时延的1000倍,长时间占核会进一步加剧发送队列堵塞。
内容的提问来源于stack exchange,提问作者rashi
相关产品推荐
相关产品推荐

