当前位置: 首页 > news >正文

Linux异步I/O新宠io_uring登场,对比epoll优势显著!

Linux中的epoll与io_uring

2026年6月20日,编程领域聚焦于Linux上处理异步I/O的不同方案。去年,开发者和学生们构建了名为TinyGate的反向代理服务器,这是一个基于工作线程的简单教学项目,虽基本运行良好,但存在架构限制,性能比不上nginx和haproxy。学生们因此拉着开发者一起研究底层工作原理和异步I/O处理方式,基于epoll开发了TinyGate的第二个版本,性能有显著提升,但epoll并非完美,最终改用io_uring,需从头重写项目。

epoll的由来

开发者刚开始为Linux开发程序时,epoll是管理异步执行的唯一选择。然而,epoll严重依赖系统调用,每次I/O事件需要两个系统调用,加上一次性的epoll_ctl注册调用,处理大量连接时开销巨大。2002年引入epoll,约17年后的2019年,io_uring出现,它不再告知何时可进行I/O操作,而是告知I/O操作何时完成,无需轮询循环,系统调用大大减少。内核从应用程序和内核共享的环形缓冲区内存中获取提交任务并反馈完成信息。默认需调用 `io_uring_enter()` 检查提交队列,一次调用可提交一批操作并获取一批完成结果;使用 `IORING_SETUP_SQPOLL` 可在稳定状态下几乎不进行系统调用,但会消耗CPU资源。

简单对比

在基本架构方面,epoll在I/O操作可行时通知,io_uring在I/O操作完成时通知。epoll让每个I/O操作跨越内核边界,io_uring只需一次性创建环形缓冲区的“设置费用”和每批操作的 `io_uring_enter()` 调用费用,处理大量I/O操作时可节省大量系统调用。在支持io_uring的较新系统(2019年发布的内核v5.1+)上,通常无需使用epoll,从就绪模型到完成模型的转变将大部分工作从应用程序转移到内核。

代码示例

epoll

以下是一个简单的epoll工作示例,使用C语言,创建epoll实例,注册标准输入文件描述符,处理传入事件。代码总共使用三个系统调用:`epoll_ctl` 一次性注册,`epoll_wait` 和 `read` 处理事件,每次实际I/O事件需两个系统调用。

#include <stdio.h>#include <unistd.h>#include <sys/epoll.h>#include <stdlib.h>#define MAX_EVENTS 8int main() { // 创建epoll实例 int epoll_fd = epoll_create1(0); if (epoll_fd == -1) { perror("epoll_create1"); return 1; } // 注册文件描述符(这里是标准输入) struct epoll_event ev, events[MAX_EVENTS]; ev.events = EPOLLIN; ev.data.fd = STDIN_FILENO; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1) { perror("epoll_ctl"); return 1; } // 阻塞直到有数据可读 int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); if (n == -1) { perror("epoll_wait"); return 1; } // 为每个文件描述符单独发起系统调用进行I/O操作 for (int i = 0; i < n; i++) { if (events[i].data.fd == STDIN_FILENO) { char buf[256]; ssize_t count = read(STDIN_FILENO, buf, sizeof(buf)); printf("read %zd bytes\n", count); } } // 清理资源 close(epoll_fd); return 0;}
io_uring

用io_uring实现同样功能的示例,同样使用C语言。实例创建步骤类似,但无需epoll_ctl注册步骤,提交前无需就绪检查,完成时无需单独调用read(),消耗资源更少。不过,除非使用SQPOLL,`io_uring_submit()` 和 `io_uring_wait_cqe()` 内部仍会隐藏一个 `io_uring_enter()` 调用。测试示例时,为简单起见省略了部分重要内容,如标准输入无数据时程序会永远阻塞,io_uring示例未检查 `io_uring_get_sqe()` 是否返回 `NULL`。

#define _GNU_SOURCE#include <stdio.h>#include <unistd.h>#include <liburing.h>#include <stdlib.h>int main() { struct io_uring ring; char buf[256]; // 设置环形缓冲区 if (io_uring_queue_init(8, &ring, 0) < 0) { perror("io_uring_queue_init"); return 1; } // 准备对标准输入进行READ操作 struct io_uring_sqe *sqe = io_uring_get_sqe(&ring); io_uring_prep_read(sqe, STDIN_FILENO, buf, sizeof(buf), 0); // 提交读取操作 io_uring_submit(&ring); // 等待操作完成 struct io_uring_cqe *cqe; if (io_uring_wait_cqe(&ring, &cqe) < 0) { perror("io_uring_wait_cqe"); return 1; } if (cqe->res < 0) { fprintf(stderr, "read failed: %d\n", cqe->res); } else { printf("read %d bytes\n", cqe->res); } // 标记已处理并清理资源 io_uring_cqe_seen(&ring, cqe); io_uring_queue_exit(&ring); return 0;}

关于io_uring的补充说明

io_uring有以下特点:一是零拷贝,提前使用 `io_uring_register_buffers()` 注册缓冲区可避免内核重新映射内存,网络发送使用 `IORING_OP_SEND_ZC`(内核6.0+)可完全避免复制缓冲区到内核;二是SQPOLL会消耗CPU,`IORING_SETUP_SQPOLL` 会让内核线程持续轮询,虽有空闲超时时间,但仍有代价;三是异步错误处理,错误以异步方式返回,需作为 `cqe` 的 `res` 字段一部分处理。

总结

在现代Linux世界中,io_uring是异步I/O的新标准。在支持io_uring的系统上,无需再使用epoll。对于现代Linux服务器上从头开始的项目,如重写TinyGate,io_uring是首选。开发者支持尽快放弃对旧系统的支持,运行7年前发布的内核并非明智之举。那么,未来是否会有更多项目采用io_uring呢?

http://www.jsqmd.com/news/1054453/

相关文章:

  • 如何高效清理C盘空间:WindowsCleaner智能系统优化解决方案
  • Robot Framework自定义关键字设计:从脚本到工程化的自动化测试进阶
  • i.MX 93平台工业编码器接口实战:从EnDat到HIPERFACE DSL的快速评估与集成
  • 化妆品成分、标签和出口单证对不上,会有什么风险?问题出在哪 | 根因分析与合规路径 - 欢欢在创业
  • 3步掌握NBTExplorer:轻松编辑我的世界游戏数据的终极指南
  • 速收藏!2026 寿县凤台田家庵初三落榜出路,低分公办技校完整推荐 - 我叫小周
  • 互联网大厂 Java 求职者面试:构建微服务与安全框架
  • 隆回新能源用车服务全测评:江铃集团新能源4S店及本地同行门店横向对比盘点 - 百航
  • 河源黄金回收全攻略六家靠谱门店推荐附避坑指南 - 余生黄金回收
  • G-Helper:华硕笔记本性能控制革新,告别Armoury Crate的智能解决方案
  • Ubuntu 20.04 Node.js 环境构建与 nvm 排障指南
  • 济南市中区黄金回收实测:6家机构谁家秤准价实在 - 上门黄金回收
  • Django+GraphQL构建生产级URL缩短服务
  • 终极魔兽争霸3兼容性修复工具:3步解决现代系统闪退问题
  • B站抢票终极指南:如何用biliTickerBuy告别抢票烦恼
  • NBTExplorer终极指南:5分钟掌握我的世界数据编辑神器
  • 重磅发布|2026年6月浪琴官方售后网点全面核验专项报告,官方维修服务网点全新营业地址投入运营 - 浪琴中国服务中心
  • 3个关键步骤让魔兽争霸3在现代系统上流畅运行
  • WarcraftHelper:让经典魔兽争霸3在现代电脑上焕发新生的终极方案
  • 3个高级技巧深度解析iStore软件中心架构
  • 泉州鲤城区黄金回收行情与6家正规机构服务全解析 - 上门黄金回收
  • 国内AI服务合规开通指南:微信支付宝订阅实操与资质识别
  • E-Hentai漫画下载器:一键打包收藏的终极解决方案
  • 如何用biliTickerBuy突破B站会员购抢票瓶颈:从手动失败到自动化成功的完整指南
  • 苏州虎丘区黄金回收实测,六家店真实到店体验全记录 - 上门黄金回收
  • 终极FGO自动化指南:如何用Fate/Grand Automata告别重复刷本
  • 如何用WELearn网课助手实现高效学习:从技术架构到实际应用的全方位指南
  • Full Page Screen Capture:一键捕获完整网页截图的Chrome扩展解决方案
  • 2026黄金回收正规店惠州推荐:六家实体门店实测与避坑指南 - 余生黄金回收
  • OpenClaw+Qwen3本地智能体实战:从零部署可联网Agent