LWN:io_uring可以自动选择使用哪个buffer了!

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

关注了就能看到更多这么棒的文章哦~

Automatic buffer selection for io_uring

By Jonathan Corbet
March 20, 2020

原文来自:https://lwn.net/Articles/815491/

主译:DeepL(https://www.deepl.com/)

io_uring子系统在过去的一年里重新定义了Linux系统中异步I/O使用方式。随着这个子系统的能力和用户的同步增长,在所支持的types of operations上开始碰到一些限制。这推动了io_uring操作的编程方式发生新的变化。一个例子是在3月初的时候LWN介绍的在多个operation之间传递文件描述符的机制(LWN:更快读出文件内容的两种新方法!)。另一个例子就是如何针对目标operation来选择I/O buffer。

正如 io_uring 开发者 Jens Axboe 在这组新patch set中所描述的那样,对于那些通常需要处理许多文件描述符的程序来说,传统模式是调用 poll()来找出哪些描述符已经准备好进行 I/O,然后逐个调用来实际执行 I/O。在这种模式下,我们可以使用io_uring,但这有违整个功能的一个核心目标:尽可能避免系统调用。如果用上io_uring的话,就是针对每个文件描述符都把这个异步操作加入队列,然后在某个操作完成的时候,来处理一下返回事件即可。

这种方式确实可以减少系统调用——甚至在request ring非常繁忙的情况下,可以将系统调用次数减少到接近零。但它也有缺点,需要为每个队列中的operation都分配一个单独的I/O缓冲区,尽管其中许多operation可能在未来一段时间内肯定无法执行到的。poll()方式则刚好与之相反,它允许应用程序将缓冲区分配推迟到实际需要缓冲区时。失去这种灵活性的话,对于那些需要等待许多operation的应用程序来说,会导致内存使用量大大增加。

这里需要某种机制,允许在operation在ring中排队之后再分配缓冲区。解决方案非常显而易见:在系统中增加一个可以调用BPF program的hook点,从而在某个operation要真正进行的时刻来在内核中管理分配缓冲区。我们应该完全不需要考虑其他解决方案了吧?不过,Axboe说,"I had a hard time imagining how life times of the buffer could be managed through [BPF]",所以这个想法被抛弃了。

幸好还有一个想法作为备选:让应用程序向io_uring提供一个或多个buffer pool,然后当需要缓冲区时,io_uring会从其中的一个buffer pool中选择一个buffer。这就是Axboe最终实现方案。

为了使用这种机制,应用程序开始时,需要先在队列中插入若干个IO_ING_OP_PROVIDE_BUFFERS操作,从而告诉内核我这边提供了哪些I/O buffers。每个操作都提供了缓冲区的基本地址、缓冲区的计数、缓冲区的大小(一次operation中所有缓冲区都是一样大的)、base buffer ID和group ID。如果请求中包含了一个以上的缓冲区,buffer ID将针对每个buffer来递增。虽然没有明确规定说某个buffer group中的所有buffer大小必须相同,不过看来设计者是希望这么使用的。

接下来在队列中插入后续operation的时候就可以不提供buffer,而是使用一个特殊值IOSQE_BUFFER_SELECT。队列中每个entry中新增的buf_group字段应设置为目标buffer group ID。当一个operation具备继续执行的条件时,内核将从指定buffer group中获取一个缓冲区来使用。在选择时并不考虑缓冲区的大小,因此如果缓冲区太小的话operation将无法正常完成。被使用的buffer ID会在operation完成时跟completion status一起返回。

如果所申请的buffer group没法提供buffer,那么operation会报出ENOBUFS错误并退出。一旦某个buffer被某个operation申请去了,内核将不会再使用它,直到有个IORING_OP_PROVIDE_BUFFERS调用来把它送回来。

当前的patch set只给一部分operation增加了buffer选择的能力。也就是read()、readv()、recv()和recvmsg()。早期版本的时候还支持write(),不过LWN编辑得坦诚,当时我看了代码也没看懂是怎么实现的。后来write()的操作在第三版中就移除了。

这项工作还没能合入linux-next中,不过现在离打开5.7 merge window还有不少时间。因此很可能这个buffer-selection功能可以被包含在下个开发周期之中。这一定会增加io_uring操作的灵活性,并且不需要BPF hook。

全文完

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

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

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

相关推荐

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

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

weixin_46935110的博客 2673

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

Linux IO模式之io_uring

作为科普性质的文章,在介绍 io_uring 之前,我们可以先整体看一下 linux 的 IO 模型大体有哪些类型。图 1.1从图 1.1 中可以看出,linux 的 IO 主要可以分为两个大类,而我们今天要介绍的 io_uring 就属于其中的 kernel IO 模型中的 async IO 模式的一种。

大隐隐于野 2287

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

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

Morso的博客 3576

CV领域交叉注意力机制:QKV在图像特征增强中的核心作用解析

本文深入解析了CV领域中交叉注意力机制的核心组件QKV在图像特征增强中的关键作用。通过通俗类比和实战案例,阐述了Q(查询)、K(键)、V(值)如何协同实现动态权重分配,从而在目标检测、图像分割与生成等任务中显著提升模型性能与语义对齐能力。

weixin_29194817的博客 433

COMSOL仿真避坑指南:列管反应器模拟中多孔介质与化学反应设置的5个常见错误

本文详细解析了COMSOL仿真中列管反应器模拟的5个常见错误,包括多孔介质模型选择、化学反应接口配置、对流扩散方程处理、薄层热阻设置及网格独立性验证。特别针对多孔介质与化学反应设置的误区,提供了实用的判断标准和修正方法,帮助工程师避免计算偏差,提升仿真精度。

weixin_29597551的博客 321

高效异步:io_uring 技术解析

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

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

基于STM32的多路火灾报警系统设计

本文设计了一款基于STM32的多路火灾报警系统,利用多个传感器组合(如烟雾传感器、温度传感器等)进行数据采集与处理,精确判断火灾情况,并及时发出报警信号,保障生命与财产安全。本系统设计了一款基于STM32的多路火灾报警系统,通过结合烟雾传感器和温度传感器,提升了火灾检测的准确性和可靠性。未来,系统可以进一步集成更多传感器,如气体传感器、湿度传感器等,进一步提升火灾报警系统的智能化水平。本系统采用STM32F103单片机作为核心处理单元,结合烟雾传感器、温度传感器和报警模块,实现多通道火灾报警功能。

stm32d1219的博客 2028

io_uring简单了解

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

iUcool的博客 3443

技能伤害继承英雄属性【War3地图编辑器】

风暴之锤跟随山丘之王的力量增长

ArYe 2298

HTML5+CSS3+JS小实例:焦点图波浪切换动画特效

实例:焦点图波浪切换动画特效。字体图标库:Font Awesome。技术栈:HTML+CSS+JS。

艾恩小灰灰的博客 907

LWN:kernel通用的ring buffer!

关注了就能看到更多这么棒的文章哦~A generic ring buffer for the kernelBy Jonathan CorbetJune 6, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/976836/内核的用户空间 ABI 中不乏环形缓冲区(ring buffer);在例如BPF、io_uring、perf和...

Linux News搬运工 1523

MTK(camera篇)Camera整体点亮

本文介绍了在MTK平台上添加新Camera Sensor的驱动开发流程。主要内容包括:1)MTK Camera采用HAL3架构,驱动层主要负责sensor电源控制和寄存器操作;2)详细说明了添加新sensor需要在多个文件中进行的修改,包括设备树配置、内核头文件、驱动列表、电源序列等;3)特别指出需要配置I2C地址表,并导入tuning文件和metadata文件以完善ISP处理流程。文章提供了完整的文件修改清单,涵盖了从内核层到HAL层的完整开发过程,为MTK平台Camera Sensor驱动开发提供了具体

weixin_49303682的博客 361

LWN:5.8内核合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~5.8 Merge window, part 1ByJonathan CorbetJune 5, 2020原文来自:https://lwn.net/A...

Linux News搬运工 549

【制作100个unity游戏之22】3DRPG游戏开发01——项目的设置和导入及渲染管线的安装修复

如果你现在存在一些疑惑unity导入素材为什么是粉紫色的?表示他没有适配我们的URP通用渲染管线,要如何适配呢?素材渲染错误丢失要如何解决?如果你有上面3个任意的问题,那这篇文章同样适合你,我将手把手教你如何安装修复渲染管线,看完你就了解了!在Unity中,他们都是渲染管线,它们的主要区别在于性能和功能。LWRP是早期版本的URP,它专门为移动设备和低端PC设计,旨在提供更高的性能。它使用基于顶点的光照和简化的后处理效果,可以在更低的硬件要求下运行。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2427

【异常】OpenAI提示内容有误 Invalid prompt: your prompt was flagged as potentially violating our usage policy.

用户需优先调整提示内容,确保符合OpenAI的使用政策。若问题持续,建议结合请求ID和具体代码示例联系官方支持。同时,可参考腾讯云、Microsoft Q&A等平台提供的错误处理实践(如重试机制、日志记录)优化代码健壮性。

奶爸的编程之路,也就一周冷个三天 2065

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

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

凌桓丶的博客 4173

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

io_uring的使用示例及其解释

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

天使之翼 2267

IEM模型,地表粗糙度模拟

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

架构师尼恩 9850

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【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:理解高效异步 IO 的工作原理与实现细节

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

一枚菜鸡 2122

C++ io_uring介绍

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

琅嬛福地 1574

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

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

极客重生 2484

高性能异步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

异步IO框架 io_uring

1Linux IO 模型分类相比于kernel bypass 模式需要结合具体的硬件支撑来讲,native IO是日常工作中接触到比较多的一种,其中同步IO在较长一段时间内被广泛使用,通常我们接触到的IO操作主要分为网络IO和存储IO。在大流量高并发的今天,提到网络IO,很容易想到大名鼎鼎的epoll 以及reactor架构。但是epoll并不属于异步IO的范畴。本质上是一个同步非阻塞的架构。关...

gaoliang1719的专栏 445
上一篇: LWN:优化内存中经常需要访问的匿名页!
下一篇: LWN:kernel代码执行流程如何确保不被篡改?
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值