LWN: 为了io_uring重新设计workqueue

异步IO -- io_uring io_uring是一种高效的 Linux 输入/输出(I/O)子系统,用于提高异步I/O的性能和灵活性。它提供了一种比传统的 POSIX 异步 I/O 接口更高效和可扩展的方法来执行文件操作、网络通信等任务。 阅读详情

点击上方蓝色“Linux News搬运工”关注我们~

Redesigned workqueues for io_uring

By Jonathan Corbet
October 25, 2019

本文译自:https://lwn.net/Articles/803070/

异步I/O近期有了一个新的interface,名为io_uring,出现在5月份的5.1 kernel之中。后来它的功能以及用户继续快速增长。成长过快也带来一些问题,导致一些支持io_uring的kernel功能模块无法跟上。因此Jens Axboe (io_uring maintainer) 提出了一个针对io_uring的新的workqueue子系统,似乎能给我们将来的发展方向一些有趣的提示。

Workqueue在kernel里面广泛应用于在进程上下文执行异步任务。过去多年来,workqueue进行了非常多的修改,完善对kernel里面应用场景的需求,能够让放到队列里的work request可以在同一个处理器上并发执行,互相竞争CPU时间。近来这方面的实现已经比较稳定了,也就是说大多数需要的功能都已经实现好了。

io_uring机制主要是允许user space创建异步线程来分别执行,因此毫无疑问workqueue在这种场景下应用得也非常广泛。不过随着时代发展,workqueue在这种场景下的一些限制变得越来越明显了。Workqueue主要解决的是何时何地来执行work function,而io_uring则可以从更高层的角度来管控这个任务是如何完成的。因此,新的机制被称为"io-wq"。

可以用下面函数来创建这种新的workqueue(也就是"io_wq"):

 struct io_wq *io_wq_create(unsigned concurrency, struct mm_struct *mm);

这里的concurrency是指在一个给定的NUMA node上所能够执行的worker线程的最大数量,而mm是跟这个queue关联在一起的memory-management context(内存管理上下文)。io_uring中,针对每一次io_uring_setup()调用,都会创建这些workqueue的其中之一,然后mm会指向调用者进程的mm_struct结构。把mm_struct跟io_wq关联起来能够更加简单的解决一些内存管理问题。现有的workqueue机制就没有这种mm关联关系,哪怕创建的是private workqueue也没有。

io_wq可以传递给io_wq_destroy()来销毁之。

如果想把某个work放进io_wq从而延后执行,就可以先填好下面这个结构:

    struct io_wq_work {
struct list_head list;
void (*func)(struct io_wq_work **);
unsigned flags;
};

这里主要做的事情是填好func,指向后面要完成这个任务的函数;flags则应该初始化为0,然后把此结构用下面的函数来加入队列:

    void io_wq_enqueue(struct io_wq *wq, struct io_wq_work *work);
void io_wq_enqueue_hashed(struct io_wq *wq, struct io_wq_work *work,
void *val);

调用io_wq_enqueue()就能把work加到queue里,从而后续会得到运行。io_wq_enqueue_hashed()这个变种函数,其实是我们之所以要创建这一新机制的原因之一,它能够确保拥有相同val值的两个任务不会同时执行。假如某个应用程序提交了很多buffered I/O request来访问(LWN评论中作者澄清这里特指写入操作)同一个文件,那么很明显这些操作不应该同时进行,否则就会因为拿锁竞争从而导致互相阻碍。而针对不同文件的buffered I/O操作则可以(也应该)同时执行。采用"Hashed"方法处理过的work任务就能够让io_uring更容易采用优化方法来管理并发访问。

以io_wq为参数来调用io_wq_flush()则会让本线程进入阻塞状态,直到queue队列的所有work任务都离开队列为止。请牢记,这并不代表这些work都已经完成操作了,而只是说明它们都已经开始执行了。

引入io-wq的另一个原因就是能做更好的取消操作。io_uring机制必须能允许user space来取消pending request,也就是说必须要能采用可控的方式来取消一个io-wq work request。目前kernel中,如果取消network socket上的一个request的话,有概率可能会导致死锁。这太不让人放心了,因此一定需要一个新方案。新的取消函数是下面这样:

    void io_wq_cancel_all(struct io_wq *wq);
enum io_wq_cancel io_wq_cancel_work(struct io_wq *wq,
struct io_wq_work *cwork);

调用第一个函数的话,会取消指定io_wq上的所有操作。第二个函数则会只取消指定的work request。总之,这都是通过对每个正在运行的worker thread发送SIGINT信号来实现的。当信号发出去之后,此函数就会返回,不会去等worker thread的相应。针对io_wq_cancel_work()来说,返回值可能是IO_WQ_CANCEL_OK(work request在开始执行之前就被取消了),IO_WQ_CANCEL_RUNNING(work request正在执行中,SIGINT已经发给它),IO_WQ_CANCEL_NOTFOUND(没找到这个work request,应该早就已经执行完了)。

上述就是这些新增的io-wq API了。不是很确定,如果其他kernel subsystem也迁移到这个机制的话,会不会有些什么好处。可能io_uring会是今后一段时间内的唯一用户了。不过io_uring能得到改善的话,很多用户都会奔走相告双手赞同了。

并且,这其实还意味着一些更好的苗头。LWN的长期读者可能还记得2007年的一系列讨论,不论是被称为fibrils, threadlets, 还是syslet,其实都是同一种机制。这个机制的目的就是希望能改善异步I/O支持的,不过同时也有另一个目标:允许user space来异步地调用任何系统调用(system call)。上述这些方案没有能达到合入kernel的程度,不过看来它们也并没有被大家所遗忘。在io-wq的第二版patch set中,Axboe就评论说在io_uring中使用io-wq的话“会让我们比起以前期望的异步执行任意系统调用的想法走近了一步”。因此,我们可以认为io_uring会能有助于我们获得13年前就期待着的功能了。大家拭目以待吧。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议修改再创作~

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

网络编程(六):io_uring异步io机制 io_uring异步io适用于更高效proactor模式、window下的异步机制iocp 阅读详情

相关推荐

Linux异步IO之 io_uring 详解及使用代码示例

Linux异步IO之 io_uring 详解及使用代码示例

weixin_46935110的博客 2673

文件系统:3. io_uring-io_wq原理

文件系统:3. io_uring-io_wq原理

苟浩的博客 1136

python使用TensorRT报错,多线程或多进程中使用问题

python使用TensorRT报错,Cuda Runtime问题

qq_44224801的博客 747

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

lxzhong1的博客 5269

同花顺API实战指南:从零搭建股票数据自动化采集系统

本文提供了一份详尽的同花顺API实战指南,手把手教你从零开始搭建股票数据自动化采集系统。内容涵盖API权限申请、Python环境配置、数据采集与存储脚本编写、自动化定时任务实现以及数据清洗等核心环节,旨在帮助量化交易与数据分析爱好者构建稳定可靠的数据源,解放双手,提升研究效率。

weixin_29200741的博客 2398

MATLAB实战:手把手教你用三频四步相移法搞定结构光三维重建(附完整代码)

本文详细介绍了如何使用MATLAB实现三频四步相移法进行高精度结构光三维重建。通过光栅图像预处理、相位计算、多频外差与相位解包裹等步骤,结合完整代码示例,帮助读者掌握从二维图像到三维点云的关键技术。该方法在工业检测和逆向工程中具有抗干扰能力强、高分辨率和鲁棒性等优势。

weixin_29201933的博客 338

高效异步:io_uring 技术解析

io_uring是 Linux 内核中的一种高效异步 I/O 框架,于 Linux 5.1 版本引入,旨在提高大规模并发 I/O 操作的性能。与传统的异步 I/O 接口(如epollselectpoll)相比,io_uring提供了更低的延迟和更高的吞吐量。

人心有反复,好在山水有重逢。 3278

【MATLAB-app】系列教程(含视频)第4、5、6课:实战_制作简单的图像处理软件

写作时间: 2020-12-27 我的教程目录 第1课:初步了解appdesigner 第2课:学会制作一个计算器 第3课:学习更多的控件(重点!) 第4课:实例1:制作一个图像处理软件 第5课:学习APPdesigner的设计精髓,框架 第6课:结合使用多种控件,函数等,丰富我们的实例1 第7课:app设计打包,完成工程应用导出 标题: 第4课:我的实例_学会制作一个图像处理软件 本文目录: 1.先看看我之前的一个工程 2.常用的基本组件控件 3.最常用且实用的控件的用法 -3.1 editfilel

wind 4052

【高性能网络(4)】异步io机制——io_uring

本文将介绍io_uring,在设计上它是真正异步的,支持任何类型的I/O,甚至可以重写Linux的每个系统调用。

Morso的博客 3576

Android 车载开发深度解析:CarPropertyManager 核心机制与实践指南

摘要: Android Automotive OS中,CarPropertyManager作为车载信息娱乐系统的核心组件,连接应用层与车辆硬件(如车速、油量等),其架构基于分层设计(App→CarAPI→VHAL→ECU),采用发布-订阅模式实现高效数据通信。通过HIDL/AIDL跨进程交互及共享内存优化,延迟可降至2ms以下。安全机制包括分级权限控制(VISIBLE/PROTECTED/SYSTEM_RESTRICTED)和HMAC防篡改。开发时需注意监听器生命周期管理、事件合并降负载及低功耗适配。

郑伟强dev的专栏 344

MIKE水动力笔记3_岸线及水深数据之根据遥感影像绘制岸线的方法

通过遥感影像自己绘制岸线来制作岸线数据,这种方法获取的岸线及水深数据精度很高,且可以根据自己的研究需要进行灵活处理。

晏长街的博客 1万+

io_uring简单了解

当我们进行一个系统调用,用户层的应用程序调用内核,它在内核空间中复制数据。在内核完成执行之后,它将结果复制回用户空间缓冲区。然后它返回。在这段时间内,系统调用仍然被阻塞那么如何解决多次复制和同步问题呢由此便引出了io_uringio_uring是2019年Linux5.1内核首次引入的高性能异步IO框架,能显著带来加速IO密集型应用的性能但相比正确使用的AIO可能最多只有5%的提升io_uring来自于Jens Axboe的观察——随着设备越来越快,中断驱动效率已经低于轮训模式。............

iUcool的博客 3443

apollo自动驾驶进阶学习之:如何实现施工路段限速绕行及其参数调试

首先需要理解Planning模块是基于Scenario、Stage、Task这样的层次来进行的,即场景->步骤->具体的决策方法。Apollo可以应对自动驾驶所面临的不同道路场景,都是通过Scenario统一注册与管理。Scenario通过一个有限状态机来判断选择当前行车场景,每个Scenario下又有多个Stage,指当前场景下需要执行的粗略步骤。.........

qq_41593516的博客 6596

干翻 nio ,王炸 io_uring 来了 !!(图解+史上最全)

40岁老架构师尼恩,持续深化自己的3高架构知识宇宙,当然首先要去完成一次牛逼的全链路异步模式 微服务实操,下面是尼恩的实操过程、效果、压测数据(性能足足提升10倍多)。

架构师尼恩 9850

Android AICore的核心组件工作原理解析

AICore通过LoRA实现个性化适配Gemini Nano提供多模态智能Safety Features保障可信运行,构建了端侧AI的完整生态。这种设计不仅让手机等移动设备能处理复杂AI任务(如实时多模态交互),还通过隐私保护机制打破了传统云端AI的数据依赖,为未来“设备即AI基础设施”的愿景奠定了基础。输入触发:用户输入“刚提交了代码,等审核”→ 进入TEE加密处理。Gemini Nano基础生成:通过原始权重W_q生成初始回复候选。LoRA个性化微调:通过A'和B'计算ΔW,更新W_q。

1551

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

高性能异步IO机制:IO_URING

高性能异步IO机制:IO_URING 一、前言 1.1 异步IO机制 Linux内核提供的IO机制大都是同步实现的,如常规的read/write/send/recv等系统调用。同步IO机制存在着一定的弊端,例如:(1)IO的实现都是在当前进程上下文的系统调用中完成的,会阻塞当前进程,降低系统的实时性;(2)性能较低。 异步IO指的是用户程序将IO请求提交后,无需等待IO操作的完成,而是可以继续处理别的事情。当IO操作完成后,会以某种方式通知用户程序。Linux系统下现有的异步IO机制的实现主要为两种: P

qq_17045267的博客 6419

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

新时代异步 IO 框架:IO_URING 的原理、用法、业界示例分析

I/O 模型同步 I/O 是目前应用最广的 I/O 模型,其缺点非常明显:大量内存拷贝、系统调用导致上下文切换频繁;随着设备性能越来越高,这种方式已经无法有效利用设备的全部性能。AIO 的优点就是通过异步方式和 Linux Kernel 交互,减少了对用户态应用程序的阻塞,提高了并发度,但其最大的缺点就是仅支持 Direct I/O,无法有效利用文件系统和 Page Cache。

凌桓丶的博客 4173

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

io_uring的使用示例及其解释

这几个系统调用接口都在io_uring.c文件中。liburing 是io_uring的实现者Jens Axboe为了简化用户使用io_uring所实现的一个用户空间的 C 库,用于简化在 Linux 系统上使用 io_uring 的开发。它提供了一组简洁而强大的 API,使开发者可以更轻松地利用 io_uring 的高性能异步 I/O 功能,而无需深入了解 io_uring 的内部工作原理。

天使之翼 2267

探索 io_uring:理解高效异步 IO 的工作原理与实现细节

io_uring 是一个 Linux 内核提供的高性能异步 I/O 框架,最初在 Linux 5.1 版本中引入。它的设计目标是解决传统的异步 I/O 模型(如 epoll 或者 POSIX AIO)在大规模 I/O 操作中效率不高的问题。关键特点和优势包括:零拷贝操作:io_uring 允许应用程序直接将数据从用户空间提交给内核,而无需在用户空间和内核空间之间进行额外的数据拷贝操作,从而减少了系统调用的开销。

一枚菜鸡 2122

【io_uring】简介和使用

io_uring 文章目录io_uring简介使用系统调用liburing样例代码流程实现系统调用`io_uring_setup``io_uring_enter``io_uring_register`参考资料 简介 io_uring 是 Linux 在 5.1 版本引入的一套新的异步 IO 实现。相比 Linux 在 2.6 版本引入的 AIO,io_uring 性能强很多,接近 SPDK[1],同时支持 buffer IO io_uring 的作者 Jens Axboe 是 Linux 内核块层和其他块设

乐园 3597

新一代异步IO框架 io_uring | 得物技术

得益于精妙的设计,io_uring的性能基本超越linux 内核以往任何软件层面的IO解决方案,达到了与硬件级解决方案媲美的性能。io_uring 需要较高版本的内核支持,目前还没有大面积普及,但可以预料他是 linux 内核 IO未来的核心发展方向。

SmartCodeTech的博客 1399

一文详细讲解 io_uring

Linux内核5.1支持了新的异步IO框架iouring,由Block IO大神也即Fio作者Jens Axboe开发,意在提供一套公用的网络和磁盘异步IO,不过io_uring目前在磁盘方面要比网络方面更加成熟。熟悉Linux系统编程的同学都清楚,Linux并没有提供完善的异步IO(网络IO、磁盘IO)机制。

youzhangjing_的博客 2149

深入理解Linux异步I/O框架 io_uring

、来源:云原生实验室hi,大家好,今天分享一篇Linux异步IO编程框架文章,对比IO复用的epoll框架,到底性能提高多少?让我们看一看。译者序本文组合翻译了以下两篇文章的干货部分,作...

极客重生 2484

C++ io_uring介绍

C++ io_uring 是 Linux 高性能编程的未来。真正的异步 I/O、减少系统调用、减少内存拷贝、统一了网络和磁盘 I/O 接口。高并发网络服务器(HTTP/RPC)、高性能数据库、分布式存储系统。如果你在编写通用的业务代码,建议使用 Boost.Asio 等封装好的库;如果你在开发底层的存储引擎或极致性能的网关,深入学习并直接使用liburing是非常有价值的。

琅嬛福地 1574

文件系统:3. io_uring-io_uring_setup系统调用

文件系统:3. io_uring-io_uring_setup系统调用

苟浩的博客 891
上一篇: LWN: GNU项目谁在管理?
下一篇: LWN:统一kernel tracing处理!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值