如何运行dpdk-dumpcap 22.11.1且避免主进程崩溃?
问题背景
运行dpdk-dumpcap 22.11.1捕获单接口数据包,低负载场景正常,但在2Gbps高负载下主进程持续崩溃,崩溃栈指向bucket_enqueue/bucket_dequeue、rte_pcapng_copy等函数,且主进程要求纳秒级时间精度。
崩溃栈信息
#0 0x00000000046585b1 in bucket_enqueue () #1 0x0000000004ce8b38 in rte_pcapng_copy () #2 0x0000000004c5319a in pdump_copy () #3 0x0000000004c53d7f in pdump_tx () #4 0x0000000004d78b02 in rte_eth_call_tx_callbacks () #5 0x000000000454f602 in rte_eth_tx_burst #0 0x00000000046585b1 in bucket_dequeue () #1 0x0000000004ce8b38 in rte_pcapng_copy () #2 0x0000000004c5319a in pdump_copy () #3 0x0000000004c53d7f in pdump_tx () #4 0x0000000004d78b02 in rte_eth_call_tx_callbacks () #5 0x000000000454f602 in rte_eth_tx_burst
可行解决方案
调整PDUMP内部缓存与内存参数
高负载下默认bucket队列可能因溢出导致入队/出队崩溃,启动dpdk-dumpcap时增大--ring-size参数扩展队列容量;同时提高主进程和抓包进程的内存池配置,通过--mbuf-size增大单个mbuf尺寸,--total-memory增加总内存分配,避免内存不足引发的非法访问。优化抓包回调开销
关闭pcapng元数据写入,使用--no-metadata参数(若支持)或切换为raw格式抓包,减少rte_pcapng_copy的计算压力;通过--snaplen限制捕获包长度,降低内存拷贝的数据量,同时保证纳秒级时间戳不受影响。分离抓包与主进程资源
采用DPDK远程抓包模式,让dpdk-dumpcap作为独立进程运行,避免与主进程共享队列和内存池;通过--lcore参数将抓包进程绑定到单独CPU核心,隔离资源竞争,确保回调处理的实时性。升级DPDK或应用补丁
升级至DPDK 23.03及以上版本,该版本修复了22.11分支中pdump模块高负载下的队列竞争bug;若无法升级,可查找DPDK社区针对bucket_enqueue/bucket_dequeue崩溃的hotfix补丁,直接应用到当前版本。替换为原生DPDK抓包API
若dpdk-dumpcap的封装层成为瓶颈,可在主进程中直接调用rte_pdump原生API,自定义抓包逻辑,减少中间层开销;启用DPDK零拷贝机制,避免回调中的内存拷贝,降低CPU占用和崩溃风险。
内容的提问来源于stack exchange,提问作者user28954110

