如何利用 异步文件读写 (AIO) 配合内核 Linux native AIO 激活事件循环的文件系统吞吐

千丽大大_6210

千丽大大_6210

2026-05-29

623人浏览

原创

Linux 文件异步 I/O 应优先使用 io_uring 而非 native AIO:io_uring 支持 IORING_OP_POLL_ADD,可将文件 fd 注册为可轮询对象并融入 epoll 事件循环;native AIO(libaio)无事件通知机制,仅提供轮询接口 io_getevents,无法真正对接事件驱动模型,仅适用于专用批处理场景。

如何利用 异步文件读写 (aio) 配合内核 linux native aio 激活事件循环的文件系统吞吐

Linux 上“利用 AIO 配合 native AIO 激活事件循环”这个说法本身存在概念混淆——native AIO(即 io_setup/io_submit/io_getevents)不触发事件通知,也不适配传统事件循环(如 epoll)。它没有就绪通知机制,不能像 socket 那样注册到 epoll_wait 中。所谓“激活事件循环”在文件 I/O 场景下不可行,必须换用真正可集成的异步模型。

别指望 aio_suspend 或信号来“接入 event loop”

POSIX AIO 的 aio_suspend、sigwaitinfo 或 SIGIO 通知方式响应延迟高、易丢失、与主流事件驱动框架(libuv/libevent/boost.asio)难以安全协同。内核 native AIO(libaio)更无任何事件回调能力:它只提供轮询接口 io_getevents,必须主动检查完成队列。强行把 io_getevents 塞进 epoll 主循环会导致忙等或漏事件,破坏事件驱动语义。

真要对接事件循环,只有一条路:io_uring + io_uring_enter 的 poll 模式

Linux 5.1+ 的 io_uring 支持 IORING_SETUP_IOPOLL 和 IORING_SETUP_SQPOLL,并可通过 IORING_FEATURE_SUBMIT_STABLE 与 IORING_FEATURE_EXT_ARG 实现零拷贝提交;更重要的是,它支持 IORING_OP_POLL_ADD,允许将任意 fd(包括普通文件 fd)注册为可轮询对象,并在 CQE 中返回就绪状态——这才是能真正融入 epoll 或自研事件循环的原生异步能力。

  • 调用 io_uring_prep_poll_add 注册文件 fd,指定 POLLIN/POLLOUT
  • 提交后,当文件可读(如 splice 场景中 pipe 可读)或底层设备就绪时,CQE.res 返回对应事件掩码
  • 该 poll 事件可与 socket、timer 等统一 wait,实现单线程全异步调度
  • 无需 O_DIRECT,buffered I/O 同样生效,页缓存优势完整保留

Native AIO(libaio)只适合专用批处理场景,非事件驱动

若坚持使用 io_submit/io_getevents,它适用的是固定工作负载、高吞吐批量操作,例如:日志归档服务按块预读 GB 级文件、备份系统顺序写入镜像。此时应:

CMIC Skill Scanner (BCLinux 21 / 低版本 glibc Linux x64)
CMIC Skill Scanner (BCLinux 21 / 低版本 glibc Linux x64)

使用内置 Rust 引擎审计待安装的 skill 包或归档,可选桥接外部扫描器。

下载
  • 独占一个专用线程轮询 io_getevents,避免阻塞主线程
  • 预注册 fd(io_uring_register_files 的等效做法需自行维护 fd 表)
  • 对齐 buffer 和 offset 到 4K(XFS 推荐),关闭 page cache 影响仅在大顺序 IO 下可接受
  • 绝不混用 sendfile、mmap、普通 read —— 它们与 O_DIRECT 不兼容

小文件 / 混合 I/O?放弃 AIO,回归 epoll + 线程池

对于 HTML、JSON、配置文件等典型小文件随机读,或读写频繁交替的场景:

  • O_DIRECT 失去预读与缓存合并,SSD 寻道放大,吞吐反而下降 30%+
  • native AIO 要求内存对齐、长度对齐、offset 对齐,业务代码侵入性强
  • epoll + 非阻塞 open + 线程池(如 Nginx 的 aio threads)实测更稳更快
  • 现代 glibc 的线程池已优化,配合 io_uring 的 buffered 提交路径,延迟可控

总之,想提升文件系统吞吐又希望保持事件驱动结构,io_uring 是当前唯一可行路径;native AIO 是遗留重型工具,不是事件循环的拼图。内核早已在文档中标记 POSIX AIO 为 legacy,迁移不是可选项,而是必要项。

相关文章

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

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

下载

相关标签:

linux

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

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

457

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

1000

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

3552

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

1156

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

1029

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

554

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

3276

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

6212

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

947

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习