C++ 怎么利用内核旁路技术(如 Solarflare EF_VI)实现微秒级网络收发

云瑶酱_9732

云瑶酱_9732

2026-11-01

736人浏览

原创

ef_vi必须预分配recv buffer,因其采用零拷贝DMA直写机制,未注册足够对齐buffer会导致静默丢包;需用posix_memalign分配、调用ef_vi_receive_init注册,并严格绑定CPU核与NUMA节点。

c++ 怎么利用内核旁路技术(如 solarflare ef_vi)实现微秒级网络收发

ef_vi 为什么必须预分配 recv buffer

ef_vi 不是 socket,它不帮你管理内存。网卡收到 UDP 包后,直接通过 DMA 写入你提前注册的 recv buffer,中间零拷贝、无内核介入。如果你没预先分配并注册足够数量的 buffer,ef_vi 就会丢包——不是报错,而是静默丢弃,连日志都不打。

常见错误现象:ef_vi_receive_get() 返回 NULL,但 ef_eventq_poll() 却持续返回 EF_EVENT_TYPE_RX 事件,说明包到了、buffer 却空了。

  • 每个 recv queue 的 buffer 数量建议 ≥ 1024,小包场景(如行情)建议 2048+,避免 burst 时耗尽
  • buffer 必须用 posix_memalign() 分配,对齐到 64 字节(X2522 要求),不能用 new 或 malloc
  • 注册前需调用 ef_vi_receive_init() 填充 buffer 描述符链表,漏掉这步等于没注册

UDP 接收必须轮询 eventq,不能 sleep 或 epoll 等待

ef_vi 是纯轮询模型。你得在 tight loop 里反复调用 ef_eventq_poll() 检查是否有 EF_EVENT_TYPE_RX,然后立刻用 ef_vi_receive_get() 取数据。任何阻塞(usleep、epoll_wait、甚至 sched_yield())都会引入微秒级抖动,直接破坏低延迟目标。

使用场景:行情接收线程必须绑定到独占 CPU 核(taskset -c 3 ./app),关闭该核的 timer 中断(echo 0 > /proc/sys/kernel/timer_migration),否则中断抢占会让 poll 延迟飙升。

  • 每次 ef_eventq_poll() 最多处理 1 个事件,别指望批量;想提吞吐就靠提高 poll 频率(但注意 CPU 占用)
  • 收到包后,立刻调用 ef_vi_receive_return() 把 buffer 归还队列,否则下一轮没 buffer 可用
  • 不要在 poll 循环里做复杂解析——把 raw packet 指针和长度放进无锁队列,交给另一个线程处理

发送 UDP 一定要复用 frame,不能每包构造 header

ef_vi 发送走的是 ef_vi_transmit() + ef_vi_transmit_pio()(CTPIO)路径。X2522 的 CTPIO 要求你把整个以太网帧(L2 header + IP + UDP + payload)预先写死在内存里,发送时只传一个指针和长度。如果每次发包都动态拼 header,光是 memcpy 和 checksum 计算就吃掉 200+ ns。

C++14
C++14

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

下载

性能影响:实测同一台机器直连,复用预填充 frame 可将单包发送延迟压到 ~960ns;动态构造则跳到 ~2.1μs,差了一倍多。

  • 初始化阶段就用 memcpy 把固定 header(含 src/dst MAC、IP、UDP port)写进一块对齐内存
  • payload 部分用指针偏移方式填入,避免移动 header 数据
  • UDP checksum 必须手动计算并写入 header,ef_vi 不代劳;用 cksum 工具验证初始值是否正确

为什么不能混用 onload 和 ef_vi 在同一个进程

onload 会劫持所有 socket 调用,并接管进程的内存管理、中断处理逻辑;而 ef_vi 要求完全独占 VI 资源、绕过一切内核调度。两者共存时,onload 的信号处理、timer 注册、甚至 fd 表操作都会干扰 ef_vi 的 eventq 轮询节奏,导致 ef_eventq_poll() 延迟毛刺从几十 ns 涨到几 μs。

容易踩的坑:你以为只链接了 libefvi.a 就安全了,但只要进程里加载了 libonload.so(比如某个第三方库隐式 dlopen),onload 就会自动激活——哪怕你一个 socket 没开。

  • 启动前检查:lsof -p $PID | grep onload,确认无相关 so 加载
  • CMake 中显式设置 LINK_FLAGS "-Wl,--no-as-needed",防止 linker 自动拉入 onload
  • 绝对不要在同一个二进制里同时调用 socket() 和 ef_vi_open();功能隔离必须做到进程级

实际工程中最容易被忽略的,是 buffer 生命周期管理与 CPU 亲和性的耦合:recv buffer 分配在哪颗 NUMA node,eventq poll 线程绑在哪颗 core,TX frame 内存映射到哪个 socket,三者必须严格一致,否则跨 socket 访问会引入额外 100+ ns 延迟。这不是理论值,是 X2522 实测结果。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2024.03.14

2288

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

347

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++ 手册教程
C++ 手册教程

共41课时 | 78.5万人学习

尚学堂ios初级视频教程
尚学堂ios初级视频教程

共77课时 | 21.4万人学习

C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习