新一代异步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

相关文章

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作