用 io_uring 替代 epoll 实现高速 polling

栏目: 后端 · 发布时间: 6年前

内容简介:前面的文章说到使用第一个参数就是前面获得的 sqe 指针;第二个参数是你要 poll 的文件描述符;第三个是标志位,这里 io_uring 没有引入新的标志(宏),而是沿用了

前面的文章说到 io_uringLinux 中最新的原生异步 I/O 实现,实际上 io_uring 也支持 polling,是良好的 epoll 替代品。

API

使用 io_uring 来 poll 一个 fd 很简单。首先初始化 io_uring 对象(io_uring_queue_init),拿到 sqe(io_uring_get_sqe)是所有 io_uring 操作都必要的,前文已经介绍这里不做过多说明。拿到 sqe 之后,使用 io_uring_prep_poll_add 初始化 sqe 指针。

static inline void io_uring_prep_poll_add(struct io_uring_sqe *sqe, int fd,
                      short poll_mask);

第一个参数就是前面获得的 sqe 指针;第二个参数是你要 poll 的文件描述符;第三个是标志位,这里 io_uring 没有引入新的标志(宏),而是沿用了 poll(2) 定义的标志,如 POLLIN、POLLOUT 等。

如其他 I/O 请求一样,每个 sqe 都可以设置一个用户自己的值在里面,使用 io_uring_sqe_set_data

可以看到一次只能添加一个 poll 请求。如果有多个 fd,那么重复调用 io_uring_get_sqe 获取多个 sqe 指针分别 io_uring_prep_poll_add 即可。 io_uring_get_sqe 不是系统调用不会进入内核, io_uring_prep_poll_add 则是简单的结构体参数赋值,所以没有速度问题。

添加完需要的请求后使用 io_uring_submit 统一提交、使用 io_uring_peek_cqe 获取完成情况等操作与标准异步 I/O 请求一致。

使用 io_uring 做 polling 与 epoll、poll 的默认模式有一个很大的区别就是 io_uring 的 polling 始终工作在 one-shot 模式下(等同于 epoll 的 EPOLLONESHOT ),即一旦某个 poll 操作完成,用户必须重新提交 poll 请求否则不会触发新的事件,这样保证每个 poll 请求有且只有一个响应。然后既然是 one-shot 模式,也就没有类似 epoll 中的 LT、ET 模式之分

清除进行中的 polling 请求使用 io_uring_prep_poll_remove

static inline void io_uring_prep_poll_remove(struct io_uring_sqe *sqe,
                         void *user_data);

也是需要 sqe 然后 submit。可以看到这个函数很特别的直接需要 user_data 参数。内核是在用之前提交的 user_data 和你现在指定的 user_data 做对比,删除值相等的请求。

示例

在网络编程中最开始的需求就是异步监听客户端接入(O_NONBLOCK accept),这也是好多 epoll 的代码示例。用 io_uring 如下:

int sockfd = socket(...);
bind(...);
listen(...);

struct io_uring ring;
io_uring_queue_init(32, &ring, 0);

struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
io_uring_prep_poll_add(sqe, sockfd, POLLIN);
io_uring_submit(&ring);

struct io_uring_cqe *cqe;
io_uring_wait_cqe(&ring, &cqe);

int clientfd = accept(sockfd, ...);

个人感觉如果拿 io_uring 纯做 polling 的话没有什么优势。拿 io_uring 做 polling 最有用的一点是把 polling 和 aio 的完成事件做统一监听和处理。想象拿到 clientfd 之后就可以立即使用 io_uring_prep_readv 读取请求体,同时又可以再使用 io_uring_prep_poll_add 接受其他客户端接入,这样才是真正的异步编程。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java性能优化权威指南

Java性能优化权威指南

Charlie Hunt、Binu John / 柳飞、陆明刚 / 人民邮电出版社 / 2014-3 / 109.00 元

Java性能优化圣经!Java之父重磅推荐! 本书由曾任职于Oracle/Sun的性能优化专家编写,系统而详细地讲解了性能优化的各个方面,帮助你学习Java虚拟机的基本原理、掌握一些监控Java程序性能的工具,从而快速找到程序中的性能瓶颈,并有效改善程序的运行性能。 Java性能优化的任何问题,都可以从本书中找到答案!一起来看看 《Java性能优化权威指南》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具