【实践】异步I/O技术io_uring的介绍与实践

本文在浪潮信息云峦服务器操作系统KeyarchOS环境下,使用异步I/O技术io_uring技术进行了应用验证。

一. 背景

Linux系统中的绝大部分程序的IO操作都是同步的,最后通过read/write系列的系统调用实现对文件的读写。同步IO的性能受限于文件类型和底层的设备性能,还有可能造成线程阻塞,为此,出现了多种异步IO的实现机制,来解决实时IO的问题。异步IO是一种IO接口类型,调用这种类型的接口进行IO操作,可以在IO操作实际完成之前就返回,而不会阻塞等待。

二. AIO的缺点

常见的异步IO实现方式有2种:

POSIX AIO:在GLIBC中提供,通过使用PTHREAD库创建用户态多线程的方式实现异步IO的接口,最后仍然是调用内核的同步接口,这套机制局限性很大,最显著的一点就是使用多线程实现异步IO的效率和可扩展性太差。

LINUX AIO:LINUX内核提供的接口,需要通过专门的LIBAIO库进行调用。与POSIX AIO相比,LIBAIO具有更丰富的 API 和功能集。但是,AIO只能在Direct I/O下使用,用不了页缓存;其次,用户的数据地址空间起始地址和大小必须也大小对齐;但是仍然可能因为文件系统、页缓存、同步发生阻塞。

三. IO_URING为什么好

2019年IO_URING应运而生,它是来自资深内核开发者 Jens Axboe 的想法。IO_URING的设计目标是提供一个统一、易用、可扩展、功能丰富、高效的网络和磁盘系统接口,统一了 Linux 异步 I/O 框架。

下图中左边部分为AIO的简化示意图,所有的操作都是通过系统调用完成的;右边部分为IO_URING简化示意图,IO_URING 只是将请求放入队列,保证了应用永远不会阻塞;为了最大程度的减少系统调用过程中的内存拷贝,IO_URING采用了将内核态地址空间映射到用户态的方式。用户态程序可以直接操作这两个队列来向内核发送IO请求,接收内核完成IO的事件通知,不需要通过系统调用传递。

除了性能方面的优势,IO_URING还有以下两个优点:

  1. 支持任何类型的I/O
  2. 灵活、可扩展
    四. KeyarchOS 的IO_URING实践
    1. 配置KeyarchOS的yum源后,执行yum install fio -y 安装测试工具fio。
    2. 利用fio分别针对raid0(6个SSD)测试IO_URING下的SSD裸设备的I/O性能与AIO下的SSD裸设备的I/O性能,然后进行对比。
    注:性能与SSD硬件SPEC能力强相关(硬件能力过低会影响IO_URING的发挥),本结果仅代表本测试环境。


测试结果:顺序读/写时,数据块在4K、8K、16K、32K、64K情况下,会随着数据块的增大而性能提升而降低,但IO_URING对比AIO性能在4K、8K时有明显提升。


测试结果:随机写时,数据块在4K、8K、16K、32K、64K情况下,会随着数据块的增大而性能提升而降低,但IO_URING对比AIO性能在4K时有明显提升;随机读时,数据块不会随着数据块的增大而性能提升而发生明显变化,但性能基本持平。

  1. 利用fio分别测试IO_URING下的NVME单块裸设备的I/O性能与AIO下的单块NVME裸设备的I/O性能,然后进行对比。

注:性能与NVME硬件SPEC能力强相关(硬件能力过低会影响IO_URING的发挥),本结果仅代表本测试环境。

测试结果:顺序读/写时,数据块在4K、8K、16K、32K、64K情况下,会随着数据块的增大而性能提升效果降低,但IO_URING对比AIO在4K、8K时有明显提升。

测试结果:随机读/写时,数据块4K、8K、16K、32K、64K情况下,会随着数据块的增大而性能提升效果降低,但IO_URING对比AIO在4K、8K时有性能提升。

五. KeyarchOS的IO_URING应用适配

应用若需要使用IO_URING,则首先需要安装KeyarchOS提供的liburing库;其次,需要对应用的API进行一定的改造,使其使用liburing库提供的API。对于少量的改造成本,相信在绝对的性能优势面前,没有人能扛得住诱惑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值