liburing项目中的IO轮询性能对比分析:io_uring vs epoll
引言
在现代高性能服务器开发中,I/O多路复用技术是核心组件之一。传统的epoll系统调用已经服务我们多年,而io_uring作为Linux内核提供的新一代异步I/O接口,正在逐渐被广泛采用。本文将基于liburing项目的实际测试数据,深入分析io_uring与epoll在文件描述符轮询方面的性能差异。
测试环境与方法
测试采用了两种不同的轮询模式:
- 定时等待模式:使用1秒超时的等待方式(如
io_uring_wait_cqes()或epoll_wait()) - 忙轮询模式:无阻塞的紧密循环检查(如
io_uring_peek_cqe()或epoll_wait(0))
测试平台包括Intel i9-12900F和AMD EPYC 7763处理器,内核版本为6.1。测试程序通过管道进行进程间通信,测量从写入到唤醒的完整延迟周期。
性能数据对比
在Intel i9-12900F平台上,核心测试结果如下(单位纳秒):
| 模式 | 平均延迟 | 中位数 | 90%分位 | 99%分位 |
|---|---|---|---|---|
| io_uring定时等待 | 4058 | 3773 | 4876 | 7336 |
| io_uring忙轮询 | 1988 | 1936 | 2110 | 2827 |
| epoll定时等待 | 4331 | 4035 | 5448 | 7575 |
| epoll忙轮询 | 1316 | 1294 | 1499 | 1986 |
当使用IORING_SETUP_COOP_TASKRUN | IORING_SETUP_TASKRUN_FLAG标志时,io_uring的忙轮询性能提升至1505纳秒(平均),接近epoll的水平。
关键发现
-
常规场景性能相当:在定时等待模式下,io_uring和epoll表现出相似的性能特征,平均延迟差异在可接受范围内。
-
忙轮询模式差异:epoll在忙轮询模式下表现出约10-20%的性能优势(约100-200纳秒)。这是由于io_uring需要处理任务工作(taskwork),要么通过中断,要么通过系统调用。
-
CPU亲和性影响:当生产者和消费者线程被固定到隔离的"无滴答"核心上时,两种技术的延迟都显著降低,但相对性能趋势保持不变。
io_uring标志位的影响
测试中探索了多个io_uring标志位的组合效果:
IORING_SETUP_COOP_TASKRUN:避免IPI中断,但不强制用户空间任务进入内核处理任务工作IORING_SETUP_TASKRUN_FLAG:与上述标志配合使用IORING_SETUP_DEFER_TASKRUN:将任务工作保持私有,仅在等待事件或调用io_uring_get_events()时运行
值得注意的是,COOP_TASKRUN和DEFER_TASKRUN不应同时使用,正确的组合应该是COOP_TASKRUN | TASKRUN_FLAG或DEFER_TASKRUN | SINGLE_ISSUER。
实际应用建议
-
选择合适的轮询模式:对于主要使用共享内存环进行通信但仍需轮询文件描述符的场景,io_uring的忙轮询模式表现良好。
-
谨慎使用忙轮询:虽然忙轮询可以减少延迟,但会显著增加CPU使用率,应根据实际需求权衡。
-
考虑CPU亲和性:对于延迟敏感型应用,将相关线程绑定到特定核心可以显著提高性能。
-
文件描述符类型选择:管道虽然便于测试,但不能完全代表网络工作负载的唤醒特性,实际应用中应根据使用场景选择合适的IPC机制。
结论
io_uring作为epoll的替代方案,在基本文件描述符轮询功能上表现出与epoll相当的性能。在大多数场景下,两者的差异可以忽略不计。对于特定高性能场景,通过合理配置io_uring的标志位,可以获得接近甚至优于epoll的性能表现。开发者应根据具体应用场景和性能需求,选择最适合的I/O多路复用技术。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0448
源启盛夏_AtomGit暑期开发者成长计划「源启盛夏」暑期校园开发者成长计划旨在激活校园开源力量,通过积分激励、认证扶持、资源倾斜等形式,引导高校组织和开发者完成「入驻 — 建项目 — 做贡献 — 获认证 — 得资源」的完整闭环。无论你是想带领社团入驻平台的组织者,还是希望用代码贡献证明自己的开发者,都能在这里找到属于你的成长路径。Markdown00
jiuwenswarmJiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0769
Hy3Hy3 是由腾讯混元团队研发的快慢思考融合的混合专家模型,总参数量 295B,激活参数 21B,MTP 层参数 3.8B。4 月底发布 Hy3 Preview 后,我们在 50 多个业务中获得了广泛的反馈,修复了各种体验问题,进一步提升了后训练的质量和规模。今天,我们发布 Hy3。它展现出显著强于同尺寸并比肩旗舰(参数规模往往是 Hy3 的 2~5 倍)开源模型的智能水平,显著提升了在各类产品和生产力任务中的实用价值。Python00
AscendNPU-IRAscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优C++0312
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00