xiedeacc
发布于 2025-06-13 / 0 阅读
0
0

最近技术积累

特性

libaio

io_uring

架构

传统的异步 I/O,使用 io_submitio_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>


评论