LWN:io_uring 可以不用文件描述符了!

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

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

Descriptorless files for io_uring

By Jonathan Corbet
July 19, 2021
DeepL assisted translation
https://lwn.net/Articles/863071/

文件描述符(file descriptor )这个底层信息是 Linux 系统中的基本对象之一。文件描述符,是一个简单的整数,可以指代一个打开的文件,或者代表一个网络连接、一个正在运行的进程、一个加载了的 BPF 程序或一个命名空间。多年来,使用文件描述符来指代一个临时对象的做法已经广泛应用,甚至人们都不觉得使用其他方案的 API 是合理的了。但有趣的是,io_uring 子系统看起来似乎正在逐步使用自己的数字空间(number space),而不是直接使用文件描述符了。

Io_uring 是为了解决异步 I/O 问题而开发出来的,异步 I/O 在 Linux 中一直未能按用户希望的那样完美支持起来。用户空间可以往一个直接与内核共享的内存区域中的队列内来加入一些操作,然后发起这些操作,许多情况下都不需要系统调用,于是能减少相关开销。同样地,有另一个共享内存区域中放置了这些操作完成后的结果。起初的时候,io_uring 只专注于一些简单操作(例如读写操作),但它后来很快就支持了许多其他系统调用。它正在逐渐发展成为 Linux 系统所一直缺乏的一套通用的异步操作 API。

Fixed files

读写操作必须要指定其需要操作的目标文件描述符,以及放置数据的 buffer。不过,在操作进行之前,内核中必须进行大量的配置工作。其中包括获取这个打开了的文件的引用技术(以防止在操作进行时文件消失)并且把这部分 buffer 相关内存落实(lock down)下来。很多情况下这部分操作的开销会占到整个操作的开销的很大一部分,因为程序往往会对相同的文件描述符和相同的 buffer 进行多次操作,而这部分开销就会为同一个资源耗费很多次,不断增加。

从一开始,io_uring 就提供了一种减少这种开销的方法,那就是 io_uring_register() 系统调用:

int io_uring_register(unsigned int fd, unsigned int opcode,
                      void *arg, unsigned int nr_args);

如果 opcode 是 IORING_REGISTER_BUFFERS,那么 io_uring 子系统将为 arg 所指向的 nr_args 个 buffer 进行准备工作,并保留结果。之后这些 buffer 就可以多次使用了,不必每次都需要重新耗费时间来进行配置。如果 opcode 是 IORING_REGISTER_FILES,那么 arg 将被解释为一个 nr_args 个文件描述符数组。该数组中的每个文件都会增加引用计数并保持打开状态,这样,它同样可以在后续多个操作中有效地使用起来。在 io_uring 的行话中将这些文件描述符称为 "fixed" 状态(已固定的状态)。

fixed 文件有几个有趣的特性。其一是应用程序就可以对这个 fixed 文件相关的文件描述符调用 close(),但 io_uring 中的引用技术将保留,并且文件仍然可以使用。另一个特性是,在后续的 io_uring 操作中, fixed 文件不会被其文件描述符的数字编号所引用。取而代之的是使用当初调用 io_uring_register()时该文件描述符在 args 阵列中的偏移量位置。因此,如果文件描述符 42 被放在 args[13]中,它随后将在 io_uring 中被称为 fixed file 13。

效果上来说,io_uring 子系统其实是重新建立了一套描述符用来引用之前打开过的文件,但它跟常规的文件描述符数字并不一致。不过,在当前内核中,仍然需要先为一个文件获得一个常规的文件描述符,并完成 register 流程,这样之后该文件才会出现在 io_uring 的 fixed-file space 中。然而,如果某个应用程序从来不会在 io_uring 之外对文件进行操作的话,那么创建常规的文件描述符这个操作实际上就没有任何实际作用了。

事实上是可以在 io_uring 中创建、使用和关闭一个文件描述符的。如上所述,这个子系统并不局限于简单的 I/O 操作,它也可以通过 io_uring 操作来打开文件或者接受网络连接。不过目前来说,用户空间必须在文件描述符的创建和使用之间进行一些干预,才能将其改为 fixed file。这部分工作的开销并不大,但是如果这个应用程序要处理大量的文件描述符的话,这个开销也会累计起来。

No more file descriptors

为了解决这个问题,Pavel Begunkov 发布了一组 patch,增加了一个 open 操作,可以直接进入 fixed file 状态。这个用来创建文件描述符的 io_uring 操作(类似于 openat2()和 accept() 这些系统调用)获得了这样的能力:根据用户提供的偏移量来直接将其结果存储为 fixed file table。当选择了这个选项时,根本就没有创建出常规的文件描述符,要引用文件的时候,只能使用 io_uring 中的这种特殊描述符。

这个功能最可能的用例就是网络服务端了。一个繁忙的服务端程序可以在短时间内创建(使用 accept() 系统调用)并使用大量的文件描述符。虽然 io_uring 操作是异步的,通常都是可以按任何顺序执行的,但也有可能有一些连锁操作,也就是在前一个操作成功完成之前不会开始另一个操作。利用这个功能,网络服务端程序就可以将一系列操作都加到队列中去来接受后续传入的连接(并将其存储在 fixed-file table 中),然后给对端按照标准的问候语来回复回去,然后开始从对端来读取第一个数据。只有当数据到达并准备好等待处理时,用户空间才需要参与进来。

这显然是一种有趣的功能,它显示了 io_uring 是如何迅速发展成为 Linux 系统的另一种编程接口的。与传统的文件描述符的分离只是朝着这个方向又迈出了一步。随着未来加入 BPF 支持(仍在开发中),这种分离趋势将变得更加明显。有些应用程序的用户空间部分的工作会变得更少。io_uring API 的使用,对于大多数应用程序来说可能是没有必要的,但对于某些应用程序来说则可以带来很大的变化。很期待看到它今后的发展方向。

全文完
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

mrloop:使用io_uring的C事件循环

卢普先生 使用C事件循环,需要Linux内核5.4.1+ 建造 安装 make sudo make install 基准测试 使用基准测试的Echo服务器 Echo server ( examples/echo_server.c ) mrloop 288,169 responses/sec epoll 191,011 responses/sec 密钥值存储区 10B gets per second mrcache (io_uring) 5.7m redis 1.3m memcached 700k 用法 一个简单的计时器。 在示例中查看更多代码/ #include "mrloop.h" static mr_loop_t *loop = NULL; static int cnt = 0; // R

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

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

Morso的博客 3576

Liburing:这是围绕Liburing C库的Python + CFFI包装器,它是设置和拆除io_uring实例的辅助工具

自由化 这是围绕Liburing C库的Python + CFFI包装器,它是设置和拆除io_uring实例的辅助io_uring 。 阅读如何使用 (pdf) 好的文档 需要 Linux 5.1以上版本(建议使用5.11以上版本) Python 3.6+ 包括 解放2.0 安装,更新和卸载(Alpha版) 使用安装,升级和卸载Python包装器: python3 -m pip install --user liburing python3 -m pip install --user --upgrade liburing python3 -m pip uninstall liburing 直接从GitHub安装: python3 -m pip install --user --upgrade git+https://github.com/YoSTEALTH/Liburing 要

OAI数据集申请下载全攻略:从个人NDA账号注册到数据包下载的保姆级避坑指南

本文提供OAI数据集申请下载的完整指南,涵盖从个人NDA账号注册到数据包下载的全流程。重点解析login.gov验证陷阱、浏览器兼容性问题、NDA权限申请技巧及nda-tools高效使用方法,帮助医学影像研究者避开常见技术障碍,快速获取全球骨关节炎研究数据库OAI的宝贵数据资源。

weixin_28698059的博客 749

LWN: io_uring的快速成长!

关注了就能看到更多这么棒的文章哦~The rapid growth of io_uring ByJonathan CorbetJanuary 24, 2020 一年前的时候,io_u...

Linux News搬运工 1629

用GraphPad Prism直出单细胞亚群堆叠柱状图

用GraphPad Prism直出单细胞亚群堆叠柱状图

fivehuge的博客 4195

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

关注了就能看到更多这么棒的文章哦~Automatic buffer selection for io_uringByJonathan CorbetMarch 20, 2020原文来自...

Linux News搬运工 1009

【3D Slicer】的小白入门使用指南一

3D Slicer 是一个免费的开源软件平台,用于医学、生物医学和其他 3D 图像的可视化、处理、分割、配准和分析。Slicer 的功能包括:读/写。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 5553

Python实战日志_P4_图书馆Web API服务

目标:使用Flask将图书馆系统升级为RESTful API服务,掌握Web开发基础难度:⭐⭐⭐⭐☆预计学习时间:75分钟前置要求:已完成第3篇《个人图书馆管理系统》

qq_39436086的博客 83

LWN: 为了io_uring重新设计workqueue

Redesigned workqueues for io_uringByJonathan CorbetOctober 25, 2019本文译自:https://lwn....

Linux News搬运工 1216

EfficientNet 改进:StripCGLU模块的创新与应用

本文提出了一种改进的EfficientNet-b0模型,核心创新是通过引入StripCGLU模块来提升网络性能。StripCGLU结合了水平/垂直条带卷积和GLU激活机制,具有参数效率高、计算量少的优点。改进策略包括选择性替换部分MBConv为StripCGLU模块(每隔3个块插入),同时保留早期层结构。测试表明该模型适用于移动端视觉任务,在保持效率的同时提升性能。代码实现包含模块定义、模型构建及测试部分,展示了如何通过精心设计的模块改进现有网络架构。

Henry的博客 241

io_uring 使用教程| io_uring 完全指南 | io_uring 实践指导 | io_uring 资料参考

io_uring 完全指南地图 背景 io_uring 是 2019 年做的,与 kernel 5.1 发布。后续打了很多补丁,比较重要的在 2020年5月之后基本达到了一个很好的可用性。学习这个东西和学习 epoll 系列的、学习 UNP 和 linux 网络编程其实没有什么区别,都是利用已有的工具解决问题,其实不涉及像学 OS、DBMS、分布式系统等这种系统方向技术上的东西,但是有一些惯常做法还是需要记录一下,如何利用工具,以及在工具的限制下解决问题也是一门形式化技术。本文只是提供一个使用 io_uri

锐龙处理器 1万+

YOLO系列算法改进 | C2PSA改进篇 | 融合BinaryAttention二值化注意力 | 轻量化与效率双提升,适用于高分辨率图像检测与边缘部署场景 | CVPR 2026

YOLO系列算法改进 | C2PSA改进篇 | 融合BinaryAttention二值化注意力 | 轻量化与效率双提升,适用于高分辨率图像检测与边缘部署场景 | CVPR 2026 (以YOLO26最新目标检测模型为基础,利用C2PSA_BinaryAttention创新模块进行改进)

2502_91881744的博客 163

NetSuite软件二次开发:NetSuite二次开发最佳实践与案例分析

SuiteScript是NetSuite提供的一种用于二次开发的脚本语言,它基于JavaScript,但添加了特定的API和框架,以支持NetSuite平台的业务逻辑开发。SuiteScript有两种版本:SuiteScript 1.0和SuiteScript 2.0,后者提供了更现代的面向对象编程模型,增强了代码的可读性和可维护性。NetSuite允许用户自定义字段以满足特定的业务需求。这些字段可以添加到现有的记录类型中,也可以用于自定义记录。自定义字段可以是文本、数字、日期、下拉列表等多种类型。

kkchenjj的博客 1465

LWN:GDB 与 io_uring!

关注了就能看到更多这么棒的文章哦~GDB and io_uringBy Jake EdgeMarch 31, 2021DeepL assisted translationhttps://l...

Linux News搬运工 272

AutoCAD中圆弧折线化方法与实现

在AutoCAD中,圆弧折线化是将圆弧曲线转换为由一系列线段组成的折线曲线的过程。本文将介绍如何使用LISP编写代码来实现圆弧折线化,并提供相应的源代码。上述示例代码将生成一个以坐标原点为圆心、起点为(5.0, 0.0, 0.0)、终点为(0.0, 5.0, 0.0)、半径为5.0、角度为90度的圆弧的折线表示。通过使用上述的LISP代码,你可以在AutoCAD中实现将圆弧转换为折线的功能。你可以根据需要修改代码中的参数来适应不同的圆弧转换需求。函数,并传入圆弧的起点、终点、圆心、半径和角度参数。

VcuOcaml的博客 1417

LWN:对io_uring中能做的操作进行限制!

关注了就能看到更多这么棒的文章哦~Operations restrictions for io_uringByJonathan CorbetJuly 15, 2020From:htt...

Linux News搬运工 353

IEM模型,地表粗糙度模拟

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LWN:BPF与io_uring的结合!

关注了就能看到更多这么棒的文章哦~BPF meets io_uringBy Jonathan CorbetMarch 4, 2021DeepL assisted translationht...

Linux News搬运工 324

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

io_uring 用法分析 II :io_uring 原理和系统调用初步介绍

这个为了方便,之后还要总结一下这个全部的用法摘要,方便查阅。所以分为 3 篇内容(其实前面还有一篇讲异步 IO 的也算吧),第一个是 io_uring 的简单原理分析和 raw interfaces,第二篇是讲 liburing 以及高性能 polling 机制,第三篇是接口以及各选项的总结摘要(这之前先参考 manual 和 liburing 的头文件吧,liburing 也自带了 system call 的 manual)。 主要的 io_uring 的资料有这些:io_uring.pdf ...

锐龙处理器 4024

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

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

LWN: io_uring中的ioctl()!

关注了就能看到更多这么棒的文章哦~ioctl() for io_uringBy Jonathan CorbetFebruary 4, 2021DeepL assisted translat...

Linux News搬运工 496

LWN:使用io_uring进行零拷贝的网络传输!

关注了就能看到更多这么棒的文章哦~Zero-copy network transmission with io_uringBy Jonathan CorbetDecember 30, 20...

Linux News搬运工 1428

LWN:给 io_uring 添加 audit 支持!

关注了就能看到更多这么棒的文章哦~Auditing io_uringBy Jonathan CorbetJune 3, 2021DeepL assisted translationhttp...

Linux News搬运工 163

LWN: 基于io_uring的用户空间块设备驱动!

关注了就能看到更多这么棒的文章哦~An io_uring-based user-space block driverBy Jonathan CorbetAugust 8, 2022DeepL assisted translationhttps://lwn.net/Articles/903855/在 6.0 合并窗口期间,很容易会忽略掉新加入的 ublk 驱动;它被深埋在 io_uring 的 pu...

Linux News搬运工 973

LWN:任务级 io_uring 限制

内核中有两个版本的 BPF,即近来通常简称为 BPF 的扩展 BPF (Extended BPF, eBPF),以及早期的、源自 BSD 的变体、旨在用于数据包过滤的经典 BPF (Classic BPF, cBPF)。至少,在补丁集的第二个 RFC 版本中,情况是这样的。除此之外,它目前只能正确过滤 IORING_OP_SOCKET 操作,这是 io_uring 中等效于 socket() 系统调用的操作。然而,显而易见的是,很快就能在以前无法实现的水平上控制对 io_uring 的访问。

Linux News搬运工 78
上一篇: LWN: Audacity 的又一个错误举动!
下一篇: LWN:让 GitHub 帮我编程!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值