新一代异步I/O:io_uring介绍

2023-11-09 22:10
文章标签 介绍 异步 新一代 io uring

本文主要是介绍新一代异步I/O:io_uring介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


Linux 异步API:io_uring介绍


io_uring:

高性能异步I/O框架

  • 能显著提高IO密集型应用的性能。

  • linux5.1内核正式引入,取缔传统的AIO。

  • 作者Jens Axboe也是CFQ、Noop、Deadline、Fio等的作者

  • 性能接近SPDK,并支持buffer IO


width:800px


应用

一些项目开始做尝试性应用:

  • RocksDb实现了MultiRead(),使用io_uring进行批量下发读io。
  • TiKV扩展了WAL、SSTable等写入使用io_uring。
  • SPDK在通用块层加入了io_uring支持
  • cephredis

linux io系统调用发展历程

(同步接口:)

➔ read(2)/write(2)

➔ pread(2)、readv(2)、preadv(2)、preadv2(2)

(异步接口:)

➔ aio_read(2)/aio_write(2)

➔ io_uring since Linux Kernel 5.1


1. 同步读写流程

device
kernel
user
Buffer IO
Direct IO
设备
Page Cache
VFS: vfs_read()
文件系统
块IO层
read()

1. 同步读写流程

  • 发出IO后,程序进入sleep状态,直到IO操作完成width:600px

  • 可想,随着存储设备越来越快,程序越来越复杂,该阻塞方式不够用了。


2. 异步IO:aio

  • aio实现了一套异步IO框架(since linux 2.5)。

width:600px

  • 相对同步阻塞IO,提高了性能。

2. 异步IO:aio

但是!

aio一直被认为难以使用效率低下

  • 只支持Direct IO。不支持Buffer IO,对大部分常规应用无用处。
  • 部分内部实现仍然会阻塞。
  • 未考虑扩展性,改动极其复杂。

3. io_uring

解决了aio的问题,统一了接口。

  • 真正异步,不会发生阻塞。
  • 支持所有IO模式。
  • 支持轮询模式(poller)等高级特性,针对不同场景,性能更好。
  • 灵活、可扩展。

io_uring基本原理

  • 每个io_uring有两个环形队列(ring),app和kernel共享,(类似NVMe):

    1. 提交队列:submission queue(SQ

    2. 完成队列:completion queue(CQw:600px


使用ring buffer(SQ、CQ)好处

  • 省去应用和内核间的内存拷贝。

  • 无锁操作,通过几个简单头尾指针移动就能完成交互。

  • 内核轮询模式下,无需系统调用。

    ​ 内核线程轮询处理SQ,应用只需监控CQ即可。image-20220506163532753


使用

三个系统调用
  • io_uring_setup(2):设置上下文,创建SQ、CQ等
  • io_uring_register(2):注册文件、缓存区
  • io_uring_enter(2):初始化和完成IO,支持很多操作

使用起来还是比较复杂,Jens Axboe提供了封装好的liburing库,简化了使用。


总结


谢谢

参考:

[译] Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测(2020

异步IO引擎——io_uring设计与实现

【io_uring】简介和使用_ywang_wnlo的博客

这篇关于新一代异步I/O:io_uring介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378717

相关文章

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程