特性 | libaio | io_uring |
---|
架构 | 传统的异步 I/O,使用 io_submit 和 io_getevents 系统调用完成请求提交和获取结果。 | 基于环形缓冲区(ring buffer),用户态和内核态共享数据结构,减少系统调用。 |
内核态/用户态切换 | 每次提交和获取事件都需要系统调用,开销较大。 | 提交和完成请求只需极少的系统调用,甚至可以完全避免切换。 |
批量操作支持 | 支持,但性能有限(每次批量操作仍需系统调用)。 | 原生支持批量提交和完成操作,显著提升性能。 |
支持的操作类型 | 主要用于文件和块设备的异步 I/O。 | 支持文件、网络、管道、超时、信号等多种异步操作类型。 |
性能 | 较传统,但在高并发场景下性能可能受限。 | 性能更高,特别是在高并发或大批量 I/O 请求场景中表现更优。 |
内存注册/缓冲区管理 | 不支持直接注册缓冲区,内存拷贝开销较大。 | 支持注册缓冲区(IORING_REGISTER_BUFFERS ),减少内存分配和拷贝的开销。 |
内核版本要求 | 几乎所有现代 Linux 发行版都支持。 | 需要 Linux 内核版本 >= 5.1,更多功能需要更高版本(如 5.13+)。 |
blktrace统计读裸盘过程中的请求,计算每个d2c的延迟,发现大量小于10us的延迟,这个不正常,读取这些LBA,实际上没有数据(返回0),而100us的LBA是有数据的,这个延迟与ext4差不多
测试fuse时,需要把默认的队列大小调大,例如128,这2个参数决定了最大的IO并发度,默认只有12/9。
sudo echo 128 > /sys/fs/fuse/connections/56/max_background
sudo echo 128 > /sys/fs/fuse/connections/56/congestion_threshold
fio --group_reporting --name=fiotest -filename=<./block/nvme> --rw=randread --bs=4k --direct=1 --numjobs=1 --ioengine=io_uring --iodepth=<1/32>