首页 >> 评测 >> 一篇文章带你懂 io_uring 的接口与实现

一篇文章带你懂 io_uring 的接口与实现

2025-08-19 12:16:01

io_uring 可以执行多种 I/O 涉及的劝告。比如:

份文件涉及:read, write, open, fsync, fallocate, fadvise, close 因特网涉及:connect, accept, send, recv, epoll_ctl 等等

下面以 fsync 为例,参考指派这个操则有方法中都似乎来作的结构上微和表达式。

操则有方法的定义与借助于

io_op_def io_op_defs[] 数组中都定义了 io_uring 默许的操则有方法,以及它在 io_uring 中都的一些变量。3 比如 IORING_OP_FSYNC:

static const struct io_op_def io_op_defs[] = { ... [IORING_OP_FSYNC] = { .needs_file = 1, }, ...

io_uring 中都几乎每个操则有方法都有近似于的马上和指派表达式。比如 fsync 操则有方法就近似于 io_fsync_prep 和 io_fsync表达式。

static int io_fsync_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);static int io_fsync(struct io_kiocb *req, unsigned int issue_flags);

除了 fsync 这种同步(阻断)操则有方法,操则有系统中都还默许一些异步(非阻断)codice_的操则有方法,比如 Direct I/O 方式将下的份文件识字。对于这些操则有方法,io_uring 中都还才会有一个近似于的异步马上表达式,以 _async 结尾。比如:

static inline int io_rw_prep_async(struct io_kiocb *req, int rw);

这些表达式就是 io_uring 对某个 I/O 操则有方法的包装。

操则有方法接收者的发送至

其他用户将必需开展的操则有方法只读 io_uring 的 SQ 中都。在 CQ 中都,其他用户可以收成使命的收尾似乎会。这里,我们参考 SQE 和 CQE 的编码器。

include/uapi/linux/io_uring.h 4 中都定义了 SQE 和 CQE。SQE 是一个 64B 微小的结构上微,全都都有了所有操则有方法似乎来作的接收者。

io_uring_sqe的定义

CQE 是一个 16B 微小的结构上微,都有操则有方法的指派结果。

struct io_uring_cqe { _u64 user_data; /* sqe->data submission passed back */ _s32 res; /* result code for this event */ _u32 flags;};

此后以 fsync 为例。要在 io_uring 中都收尾 fsync 操则有方法,其他用户必需将 SQE 中都的 opcode 设为为 IORING_OP_FSYNC,将 fd 设为为必需同步的份文件,并去除 fsync_flags。其他操则有方法也是近似于,设为 opcode 并将操则有方法所必需的变量并只读 SQE 亦可。

并不一定来说,常用 io_uring 的程序都必需来作 64 位的 user_data 来唯一标识一个操则有方法 5。user_data 是 SQE 的一部分。io_uring 指派再来某个操则有方法后,才会将这个操则有方法的 user_data 和操则有方法的C#一起只读 CQ 中都。

涉及视频延揽

io_uring 新的起之秀的linux io方式将,是如何媲美epoll的

因特网原理tcp/udp,因特网编程epoll/reactor,面谈中都固执“八股文”

学习地址:

必需C/C++ Linux服务器架构师学习资料加qun812855908借助(资料除此以外C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒微,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),付费透过

使命的审批与收尾

io_uring 通过外壁数据资料流和其他用户交互。

我们的再以其他用户审批使命为例,参考 io_uring 的操则有系统其他用户交互方式将。其他用户审批使命的过程如下:

将 SQE 只读 SQEs 周边,而后将 SQE 英文字母只读 SQ。(近似于布中都深蓝色第一步) 更换其他用户中性详细描述的队头。(近似于布中都深蓝色第二步) 如果有多个使命必需同时审批,其他用户不断重复纸片的过程。 将之后的队头英文字母只读与操则有系统涉及联的 io_uring 表达式。(近似于布中都深蓝色第三步)

在此之后我们简要参考操则有系统借助使命、操则有系统收尾使命、其他用户收成使命的过程。

操则有系统中性借助使命的方式将是,从队尾只读 SQE,并更换 io_uring 表达式的 SQ tail。 操则有系统中性收尾使命:往 CQ 中都只读 CQE,更换表达式 CQ head。 其他用户中性收成使命:从 CQ 中都只读 CQE,更换表达式 CQ tail。 io_uring 的借助于

参考再来 io_uring 的其他用户中性终端后,我们就可以详细参考 io_uring 在操则有系统中都是如何借助于的了。

io_uring 在创始人时有两个可选,近似于着 io_uring 执行使命的不同方式将:

开端 IORING_SETUP_IOPOLL 后,io_uring 才会常用轮询的方式将指派所有的操则有方法。 开端 IORING_SETUP_SQPOLL 后,io_uring 才会创始人一个操则有系统寄存器的机构用来收成其他用户审批的使命。

这些可选的设定才会影响不久其他用户与 io_uring 交互的方式将:

都不开端,通过 io_uring_enter 审批使命,收成使命不必 syscall。 只开端 IORING_SETUP_IOPOLL,通过 io_uring_enter 审批使命和收成使命。 开端 IORING_SETUP_SQPOLL,不必任何 syscall 亦可审批、收成使命。操则有系统寄存器在长时长无操则有方法后才会暂时性,可以通过 io_uring_enter 引导。 基于操则有系统寄存器的使命指派

每个 io_uring 都由一个轻量级的 io-wq6 寄存器池默许,从而借助于 Buffered I/O 的异步指派。对于 Buffered I/O 来说,份文件的以下内容似乎在 page cache 里,也似乎必需从盘上只读。如果份文件的以下内容并未在 page cache 中都,这些以下内容可以反之亦然在 io_uring_enter 的时候只读到,并在送回其他用户中性时收成。否则,识字操则有方法才会在 workqueue 里指派。

如果没有人在创始人 io_uring 时所选 IORING_SETUP_IOPOLL 可选,io_uring 的操则有方法就才会放上 io-wq 中都指派。

上布其余部分了停止 IOPOLL 方式将下,其他用户通过 io_uring 指派操则有方法的整个codice_时序。其他用户审批的 SQE 经过一系列执行后,才会在 io_queue_sqe 中都试探着指派一次。

如果在 SQE 中都所选了 IOSQE_ASYNC 可选,该操则有方法才会反之亦然被倒入 io-wq 数据资料流。 如果没有人所选 IOSQE_ASYNC 可选,io_uring 才会后用非阻断方式将尝试指派一次 SQE 中都都有的操则有方法。举个范例:指派 io_read 时,如果数据资料并未在 page cache 全都,非阻断方式将的 io_read 操则有方法就才会急于。如果急于,则反之亦然送回。如果不急于,倒入 io-wq 中都。

所有的操则有方法都被审批到操则有系统数据资料流后,如果其他用户设为了 IORING_ENTER_GETEVENTS flag,io_uring_enter 在送回其他用户中性在此之前才会等待所选个数的操则有方法收尾。

不久,Linux 随时才会调度 io-wq 的操则有系统寄存器指派。此时,io_wq_submit_work 表达式才会不断用阻断方式将指派其他用户所选的操则有方法。某个操则有方法再来整指派后,它的C#就才会被只读 CQ 中都。其他用户通过 io_uring 表达式中都的 CQ 队尾右方就能知道操则有系统执行好了哪些操则有方法,不必再次codice_ io_uring_enter。

通过闪电布可以通过观察到,在停止 IOPOLL 时,操则有系统才会花大量时长执行只读操则有方法。

基于轮询的使命指派

创始人 io_uring 时所选 IORING_SETUP_IOPOLL 可选亦可开端 I/O 轮询方式将。并不一定来说,用 O_DIRECT 方式将打开的份文件默许常用轮询方式将识字以下内容,指派 read / write 操则有方法。

在轮询方式将下,io_uring_enter 只督导把操则有方法审批到操则有系统的份文件识字数据资料流中都。不久,其他用户必需多次codice_ io_uring_enter 来轮询操则有方法到底收尾。

在轮询方式将下,io-wq 不才会被常用。审批使命时,io_read 反之亦然codice_操则有系统的 Direct I/O 终端向设备数据资料流审批使命。

如果其他用户设为了 IORING_ENTER_GETEVENTS flag,在送回其他用户中性在此之前,io_uring_enter 才会通过 io_iopoll_check codice_操则有系统终端轮询使命到底收尾。

通过闪电布可以看到,io_uring_enter 在审批使命这石头只花了一小部分时长。极少时长都在轮询 I/O 操则有方法到底收尾。

io_uring 的使命贫乏管理者

在实际上生产环境污染中都,我们往往才会有这样的需求:往份文件中都只读 n 次,然后用 fsync 落盘。在常用 io_uring时,SQ 中都的使命不一定才会按左至右指派。给操则有方法设定 IO_SQE_LINK 可选,就可以设立使命相互间的曾于联系。IO_SQE_LINK 不久的第一个使命一定在当在此之前使命收尾后指派。7

io_uring 内外常用数据资料流来管理者使命的贫乏联系。每一个操则有方法在经过 io_submit_sqe 的执行后,都才会变为一个 io_kiocb 对象。这个对象有似乎才会被倒入数据资料流中都。io_submit_sqe 8 才会对含有 IO_SQE_LINK 的 SQE 则有特殊执行,执行过程如下:

当在此之前数据资料流为空(之在此之前的使命都没有人 IO_SQE_LINK,或执行刚才一个链),当在此之前使命 IO_SQE_LINK,则创始人一个新的数据资料流。 数据资料流并未被创始人,新的来的使命直到现在是 IO_SQE_LINK,则将当在此之前使命放上数据资料流。 数据资料流并未被创始人,当在此之前执行的使命没有人 IO_SQE_LINK,将当在此之前使命倒入数据资料流,并开始按左至右执行整个数据资料流的操则有方法。

由此看来,SQ 中都周内的 IO_SQE_LINK 详细描述才会按曾于联系依次执行。在 io_submit_sqes 之在此之前在此之前,所有的使命都才会被审批。因此,如果使命有曾于联系,它们必需在同一个 io_uring_enter syscall 中都批量审批。

其他应用于压制 io_uring 使命贫乏的可选除此以外 IOSQE_IO_DRAIN 和 IOSQE_IO_HARDLINK,这里才才会展开。

概括与神性 io_uring 大抵可以包含默认、IOPOLL、SQPOLL、IOPOLL + SQPOLL 四种方式将。可以根据操则有方法到底必需轮询选择开端 IOPOLL。如果必需很低实时性、增加 syscall 花销,可以考虑到开端 SQPOLL。 如果只是常用 Buffered I/O,io_uring 远比于其他用户中性反之亦然codice_ syscall,并不一定不才会有特别大的性能大幅提高。io_uring 内外通过 io-wq 指派 Buffered I/O 操则有方法,和反之亦然在其他用户中性codice_ syscall 在本质上没有人来得大区别,勉强减小其他用户中性操则有系统中性预设的花销。io_uring 审批使命要在此之前行一遍 io_uring_enter syscall,延迟和吞吐量某种程度胜过 mmap 之类的份文件 I/O 操则有方法方法。 如果不该在审批时赶紧尝试指派一次使命(比如之在此之前引用的份文件以下内容并未在 page cache 的似乎会),可以以致于 IOSQE_ASYNC flag,允许在此之前行 io-wq。 常用 IO_SQE_LINK, IOSQE_IO_DRAIN 和 IOSQE_IO_HARDLINK 可以压制使命的贫乏联系。 附录 常用 fio 的 io_uring 方式将开展测试

# 开端 SQPOLL + IOPOLLfio -size=32G -bs=1m -direct=1 -rw=randread -name=test -group_reporting -filename=./io.tmp -runtime 60 ---ioengine=io_uring ---iodepth=512 ---sqthread_poll 1# 开端 SQPOLLfio -size=32G -bs=1m -direct=0 -rw=randread -name=test -group_reporting -filename=./io.tmp -runtime 60 ---ioengine=io_uring ---iodepth=512 ---sqthread_poll 1# 开端 IOPOLLfio -size=32G -bs=1m -direct=1 -rw=randread -name=test -group_reporting -filename=./io.tmp -runtime 60 ---ioengine=io_uring ---iodepth=512# 停止 IOPOLLfio -size=32G -bs=1m -direct=0 -rw=randread -name=test -group_reporting -filename=./io.tmp -runtime 60 ---ioengine=io_uring ---iodepth=512# 而后常用 bcc (eBPF) 跟踪操则有系统表达式codice_,生成闪电布/usr/share/bcc/tools/profile -p `pidof fio` -f# 也可以常用 trace-cmd 跟踪操则有系统表达式codice_ (Thanks @YangKeao)trace-cmd record -p function_graph -F [command]。

武汉治白癜风去哪里
成都哪里治疗白癜风
宁德白癜风医院
医院库
心绞痛
中药如何起到止咳化痰作用
痛经原因
哪种止咳糖浆止咳比较好

上一篇: 红楼梦:薛宝钗让史湘云住进稻香村,暗喻湘云的悲剧结尾,守寡的命运

下一篇: 要不要禁止进口阿塞拜疆石油?美国内部也充满了争议

相关阅读
特变电工(600089.SH)拟投资8.44亿元建设人机电缆产业园项目

智通财经APP讯,特变电工600089,股吧600089.SH发布公告,为了减慢日本公司电线、电话线产品市场竞争力,消除日本公司伊宁地区电线现有产能偏低、生产自动化水平低的现状,日本公司

2025-08-23 00:16:04
KTV涉黄20多名青年组正表演,13人观看

河南商报记者从信阳公安部门获悉,近日,该局按照向阳街道公安部门部署,组织起来100多名员警,在向阳街道七区尝试盗走了杂货店为生黄色杂耍的娱乐场所。自“平安守城护”专项实际行动

2025-08-23 00:16:04
儒竞科技闯关创业板:毛利率低于随行均值 客户高度集中 海尔为第一大客户

中都华网电视新闻12同年10日讯 中都华网电视新闻了解到,日从前,上海和文四场高科技股份有限的公司(简称“和文四场高科技”)创业板上市核发已获提起。海通证券600837,股吧为保荐机构。拟募

2025-08-23 00:16:04
长江口一男子从15层坠楼身亡 警方介入调查

12月22日20时许,海南省龙华区文明西路富顺大厦发生四人坠楼事件,一男子从大厦颇高四楼坠落,当场身亡。迄今,海口嫌犯已介入追查。记者由中山派出所说明了,死者今年24岁,迄今已确认其身份,并与其

2025-08-23 00:16:04
常州天宁4.2级大地震周边未发现因大地震致公路损毁情况

新京报快讯 据交通网运输部路网监测与备用不作为的中心官方微博消息,经当地道路部门全面排查,江苏省扬州市天宁区4.2级山崩邻近地区仍未挖掘出因山崩造成的道路损毁情况,震中及邻近地区路网运行正常。

2025-08-23 00:16:04