发布时间:2026/6/21 10:59:14
Linux异步I/O新宠io_uring登场,对比epoll优势显著!
Linux中的epoll与io_uring2026年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()消耗资源更少。不过除非使用SQPOLLio_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.hint 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会消耗CPUIORING_SETUP_SQPOLL 会让内核线程持续轮询虽有空闲超时时间但仍有代价三是异步错误处理错误以异步方式返回需作为 cqe 的 res 字段一部分处理。总结在现代Linux世界中io_uring是异步I/O的新标准。在支持io_uring的系统上无需再使用epoll。对于现代Linux服务器上从头开始的项目如重写TinyGateio_uring是首选。开发者支持尽快放弃对旧系统的支持运行7年前发布的内核并非明智之举。那么未来是否会有更多项目采用io_uring呢

相关新闻

Mermaid Live Editor:3步掌握免费在线图表编辑的终极技巧
2026/6/21 10:59:14

Mermaid Live Editor:3步掌握免费在线图表编辑的终极技巧

Mermaid Live Editor:3步掌握免费在线图表编辑的终极技巧 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edi…

阅读更多
XXMI Launcher:一站式游戏模组管理器终极指南
2026/6/21 10:59:14

XXMI Launcher:一站式游戏模组管理器终极指南

XXMI Launcher:一站式游戏模组管理器终极指南 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 还在为管理不同游戏的模组而手忙脚乱吗?每次切换游戏都要重…

阅读更多
QLoRA微调大模型实战:用100条工艺数据训一个“半导体专家“一、问题背景:通用大模型不懂FAB,微调也太贵
2026/6/21 10:59:14

QLoRA微调大模型实战:用100条工艺数据训一个“半导体专家“一、问题背景:通用大模型不懂FAB,微调也太贵

今年年初,我在FAB内部署了ChatGPT做工艺参数推荐。效果只能说一般。问它:"ETCH工艺温度超出规格了,怎么调回去?"ChatGPT给的答案比较通用——"检查功率设置"、"看看气体流量"——都是正确的废话。问…

阅读更多
AI智能体与形式化验证:重塑GDPR合规的自动化实践
2026/6/21 12:59:15

AI智能体与形式化验证:重塑GDPR合规的自动化实践

1. 从合规“黑盒”到可验证“白盒”:为什么GDPR需要自动形式化?如果你在负责一个面向欧洲用户的互联网产品,那么“GDPR”这三个字母大概率是你的噩梦。它不仅仅是法务部门需要处理的一堆条款,更是悬在产品、研发、数据团队头上的达…

阅读更多
抖音评论采集工具:5分钟快速获取全量评论数据的实用指南
2026/6/21 12:59:15

抖音评论采集工具:5分钟快速获取全量评论数据的实用指南

抖音评论采集工具:5分钟快速获取全量评论数据的实用指南 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 想要轻松获取抖音视频的所有评论数据吗?无论你是运营人员、内容创作者还是市…

阅读更多
Cesium 视角切换教程
2026/6/21 12:59:15

Cesium 视角切换教程

视角切换 Switch View ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 Cesium 相机定位 API …

阅读更多
Adobe-GenP 3.0:免费激活Adobe全家桶的终极指南,3分钟搞定Photoshop、Premiere Pro等专业软件
2026/6/21 12:59:15

Adobe-GenP 3.0:免费激活Adobe全家桶的终极指南,3分钟搞定Photoshop、Premiere Pro等专业软件

Adobe-GenP 3.0:免费激活Adobe全家桶的终极指南,3分钟搞定Photoshop、Premiere Pro等专业软件 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP …

阅读更多
高并发下写竞争解决方案:CAS与低延迟读写架构实践
2026/6/21 12:59:15

高并发下写竞争解决方案:CAS与低延迟读写架构实践

1. 从一次线上事故说起:当“库存”变成“烫手山芋”去年双十一,我负责的一个核心交易系统差点崩了。那是一个典型的秒杀场景,我们为某个热门商品准备了10万件库存。活动开始瞬间,流量洪峰涌来,监控面板上的QPS瞬间冲到…

阅读更多
Ubuntu 18.04 下安全可控的 Node.js 多版本管理方案
2026/6/21 11:59:15

Ubuntu 18.04 下安全可控的 Node.js 多版本管理方案

1. 项目概述:为什么在 Ubuntu 18.04 上装 Node.js 还值得专门讲?Node.js 不是“一个软件”,它是一套让 JavaScript 能脱离浏览器、直接操作文件系统、网络端口、进程调度的运行时环境。你在终端里敲node -v看到的版本号,背后是 V8…

阅读更多
嵌入式语音编解码实战:G.726 ADPCM库集成与优化指南
2026/6/21 0:59:13

嵌入式语音编解码实战:G.726 ADPCM库集成与优化指南

1. 项目概述与G.726 ADPCM技术背景在嵌入式语音处理领域,带宽和存储资源往往是寸土寸金的。如果你做过对讲机、VoIP网关或者早期的数字录音设备,一定对如何在有限的比特率下保住语音可懂度这件事深有感触。我当年接手一个车载调度系统的项目,…

阅读更多
ITU656格式化器寄存器配置实战:VBI数据处理与VCR特技播放兼容性
2026/6/21 0:59:13

ITU656格式化器寄存器配置实战:VBI数据处理与VCR特技播放兼容性

1. 项目概述与核心挑战在数字视频处理领域,将原始的视频数据、同步时序以及各种辅助信息打包成一个标准、稳定的串行数据流,是确保设备间互联互通的基础。ITU-R BT.656标准(常简称为ITU656)正是为此而生的一套“交通规则”。它定义…

阅读更多
嵌入式GUI开发实战:emWin环境搭建、配置优化与性能调优指南
2026/6/21 0:59:13

嵌入式GUI开发实战:emWin环境搭建、配置优化与性能调优指南

1. 项目概述与emWin核心价值解析在嵌入式系统开发领域,人机交互(HMI)的设计正从简单的LED指示灯和按键,快速向全彩图形化界面演进。无论是智能家电上的触摸屏、工业PLC的操作面板,还是医疗设备的参数显示,一…

阅读更多
嵌入式语音编解码实战:G.726 ADPCM库集成与优化指南
2026/6/21 0:59:13

嵌入式语音编解码实战:G.726 ADPCM库集成与优化指南

1. 项目概述与G.726 ADPCM技术背景在嵌入式语音处理领域,带宽和存储资源往往是寸土寸金的。如果你做过对讲机、VoIP网关或者早期的数字录音设备,一定对如何在有限的比特率下保住语音可懂度这件事深有感触。我当年接手一个车载调度系统的项目,…

阅读更多
ITU656格式化器寄存器配置实战:VBI数据处理与VCR特技播放兼容性
2026/6/21 0:59:13

ITU656格式化器寄存器配置实战:VBI数据处理与VCR特技播放兼容性

1. 项目概述与核心挑战在数字视频处理领域,将原始的视频数据、同步时序以及各种辅助信息打包成一个标准、稳定的串行数据流,是确保设备间互联互通的基础。ITU-R BT.656标准(常简称为ITU656)正是为此而生的一套“交通规则”。它定义…

阅读更多
嵌入式GUI开发实战:emWin环境搭建、配置优化与性能调优指南
2026/6/21 0:59:13

嵌入式GUI开发实战:emWin环境搭建、配置优化与性能调优指南

1. 项目概述与emWin核心价值解析在嵌入式系统开发领域,人机交互(HMI)的设计正从简单的LED指示灯和按键,快速向全彩图形化界面演进。无论是智能家电上的触摸屏、工业PLC的操作面板,还是医疗设备的参数显示,一…

阅读更多
GIT修改用户名
2026/6/20 3:11:17

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/19 20:40:12

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/20 7:34:01

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多