C++如何通过Solarflare网卡EF_VI API实现超低延迟网络直通

风宇大大_5411

风宇大大_5411

2026-10-28

483人浏览

原创

EF_VI API初始化失败主因是efx驱动与libefvi版本不匹配;发包延迟突增因未及时ef_vi_poll()回收TX描述符;收包丢帧因未ef_vi_receive_pop()释放RX缓冲区;多线程共享VI实例会导致未定义行为。

c++如何通过solarflare网卡ef_vi api实现超低延迟网络直通

EF_VI API 初始化失败:ef_vi_init() 返回 -1

常见现象是 ef_vi_init() 直接返回 -1,日志里看不到具体原因。这通常不是权限问题(root 已满足),而是 EF_VI 依赖内核驱动 efx 和用户态库 libefvi 的版本严格匹配。Solarflare 官方不保证跨 minor 版本兼容——比如你装了 ONLOAD 8.0.0 驱动,却用 8.1.0 的 libefvi.so,ef_vi_init() 就会静默失败。

实操建议:

  • 运行 modinfo efx 确认内核模块版本,再用 ldd your_app | grep efvi 和 objdump -s -j .comment /usr/lib/libefvi.so(或查看其所在 deb/rpm 包名)核对用户态库版本是否完全一致
  • ef_vi_init() 前必须调用 ef_driver_handle_create() 获取有效句柄;漏掉这步或传入 NULL 句柄,也会返回 -1
  • 确保网卡已绑定到 efx 驱动(非 sfc 或 igb),用 lspci -k -s $(ethtool -i ethX | awk '/bus-info/ {print $NF}') 验证

发包延迟突增:ef_vi_transmit() 后未及时 ef_vi_poll()

EF_VI 不自动回收完成的 TX 描述符,必须靠 ef_vi_poll() 扫描完成队列(TXQ CQ)。如果只发包不轮询,TXQ 很快填满,后续 ef_vi_transmit() 会阻塞或失败(返回 -EAGAIN),造成毫秒级抖动——这和“直通”预期完全相悖。

实操建议:

  • 不能把 ef_vi_poll() 放在发包循环外;推荐每发 N 个包(N ≤ 16)后调用一次,或用 ef_eventq_next() + ef_vi_transmit_done() 做事件驱动式回收
  • 注意 ef_vi_transmit_pio() 虽快但受限于 PIO buffer 大小(通常 128B),超长包强制 fallback 到 DMA,反而更慢;判断包长是否 ≤ vi->vi_piobuf_len 再选路径
  • 避免在 tight loop 中反复调用 ef_vi_transmit() 却不检查返回值——-EAGAIN 必须处理,否则逻辑卡死

收包丢帧:ef_vi_receive_push() 后未同步更新 RX 环指针

EF_VI 的 RX 环是生产者-消费者模型,应用负责推进环上“已提交”位置(ef_vi_receive_push()),但内核负责推进“已完成”位置。若应用 push 后不调用 ef_vi_receive_pop() 或 ef_vi_receive_unbundle() 清空已收包,RX 环缓冲区会被占满,新包直接被网卡丢弃,ethtool -S ethX 里 rx_nodesc_drop_cnt 会上升。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

  • ef_vi_receive_push() 是预分配 RX 描述符,真正释放 buffer 给网卡重用的是 ef_vi_receive_pop() ——二者必须成对出现,且 pop 必须在包处理完之后
  • 不要用 ef_vi_receive_unbundle() 处理单包(它为 multi-segment 设计),简单场景用 ef_vi_receive_pop() 更稳
  • 检查 ef_vi_receive_space() 返回值,若接近 0,说明 RX 环快满,需加快 pop 频率或增大 ring size(初始化时设 vi_attr.rx_ring_size ≥ 2048)

多线程竞争 VI:共享 ef_vi 实例引发 undefined behavior

EF_VI 的 ef_vi 结构体**不是线程安全的**。多个线程并发调用 ef_vi_transmit() 或 ef_vi_poll() 会破坏内部状态(如 CQ 指针、DMA 描述符索引),导致随机丢包、内存越界甚至段错误——这种问题在线上高负载时才暴露,复现困难。

实操建议:

  • 一个 ef_vi 实例只绑定一个线程;需要多线程收发,就创建多个 VI(每个绑独立 RX/TX queue),用 ef_vi_set_evq() 显式指定 event queue
  • 绝对不要在信号处理函数中调用任何 EF_VI API(包括 ef_vi_poll()),SIGIO/SIGPOLL 的上下文不可控
  • 如果必须跨线程传递数据,用 lock-free ring buffer(如 SPSCQueue)中转 payload,VI 操作始终留在专属线程内

EF_VI 的“低延迟”前提是零拷贝 + 内核旁路,但它的 API 表面简洁,底层状态机耦合极深。最容易被忽略的是:所有 VI 操作都隐含对硬件寄存器和共享内存的读写,一旦时序错乱(比如 poll 和 transmit 交叉、pop 和 push 错位),错误不会立刻报出,而是延后表现为吞吐骤降或延迟毛刺——这时候得回过头一行行核对 init → push/pop → poll → done 的闭环是否完整。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2268

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1039

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1429

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1237

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习