DPDK启用后收包中断、rx_missed_errors激增的丢包定位咨询
DPDK收包中断故障排查与问题解答
丢包位置定位方法
- 首先查询端口扩展统计:执行
dpdk-proc-info -- --xstats -p 0x1,查看队列级丢包指标rx_queue_[队列号]_dropped,确认丢包是否发生在网卡硬件队列层面。 - 在应用代码中增加埋点统计:分别统计每次
rte_eth_rx_burst调用的收包总数、rte_pktmbuf_free调用的释放mbuf总数,对比两个数值的差值,确认是否存在收包后未释放mbuf的情况。 - 故障发生时查询收包mempool的空闲元素数量:调用
rte_mempool_free_count接口查看对应mempool的剩余空闲mbuf,若空闲数为0则可确认是mbuf耗尽导致的问题。
问题解答
1. 每收到1个报文是否对应占用1个rx_desc?
是。每个收到的报文都会占用1个rx_desc,网卡将报文DMA到rx_desc关联的mbuf后,该rx_desc会被标记为已使用,只有当软件释放对应mbuf、将rx_desc重新归还给网卡后,该rx_desc才能用于接收新报文。
2. 该故障是否可能是报文处理耗时过长、或rx_desc未被主动释放导致?
两种情况均可能引发该故障,且完全匹配你观测到的现象:
- rx_desc未主动释放:如果应用收包后未调用
rte_pktmbuf_free释放mbuf,或者将mbuf长期缓存在业务队列中未处理、未释放,可用rx_desc的数量会随运行时间逐渐减少,全部耗尽后网卡没有空余资源接收新报文,就会直接丢包并上涨rx_missed_errors计数。你调大rx_desc数量后故障发生时间延后,本质就是增加了可被占用的rx_desc总配额,耗尽的时间相应变长。 - 报文处理耗时过长:如果收包线程的处理速度低于网卡的收包速度,
rte_eth_rx_burst拉取报文、释放rx_desc的速度赶不上网卡占用rx_desc的速度,也会逐渐耗光所有rx_desc,触发同样的丢包问题。
补充说明
你观测到故障时dpdk-pdump无法抓包,是因为dpdk-pdump是从PMD驱动的软件收包路径镜像报文,当rx_desc耗尽后新报文会直接在网卡层面被丢弃,根本没有进入软件收包路径,因此pdump无法捕获到任何报文。
内容的提问来源于stack exchange,提问作者nmurshed
相关产品推荐
相关产品推荐

