同时等待epoll和io_uring

Posted

技术标签:

【中文标题】同时等待epoll和io_uring【英文标题】:Waiting for epoll and io_uring simultaneously 【发布时间】:2021-11-27 07:22:59 【问题描述】:

我正在将我的项目迁移到 io_uring 以获得更好的性能。但是,系统的某些部分依赖于 epoll 作为事件系统并且不能移动到 io_uring (例如:数据库驱动程序,它们在内部写入套接字,我收到通知读/写事件,从未看到写入原始套接字的内容)。强迫我同时使用 epoll 和 io_uring。出于各种原因,创建两个线程,一个用于 epoll,另一个用于 io_uring 不是一种选择。

我的计划是在我的事件循环中在 epoll 之后轮询 io_uring,如下所示

while(keep_running) 
    epoll_wait();
    io_uring_peek_batch_cqe();

    ... // handle events

事实证明这是不可行的。很可能没有正在进行的数据库活动,导致epoll_wait 阻塞直到超时,因此 io_uring 上的所有操作都在等待相同的超时。也不要颠倒顺序并致电io_uring_wait_cqe 更好。可能有数据库流量但没有提交给 io_uring。导致epoll等待io_uring超时。

到目前为止,我已经考虑过减少超时。但这不是一个优雅的解决方案。它会增加 CPU 使用率并增加不必要的延迟。有没有办法?即,一旦 epoll 或 io_uring 有东西要处理,某些功能就会解除阻塞。

【问题讨论】:

【参考方案1】:

io_uring 可以使用 IORING_OP_POLL_ADD 监控文件描述符的准备情况。一旦有一些事件未决,epoll fd 就会变为 read-ready。一种解决方案是使用 io_uring 作为主要的事件通知工具。 epoll fd 应该被 io_uring 监控。

也可以反过来——使用 epoll 作为主要的事件通知工具。配置 io_uring 以使用 eventfd 发布就绪通知并将其添加到 epoll:https://unixism.net/loti/tutorial/register_eventfd.html

【讨论】:

以上是关于同时等待epoll和io_uring的主要内容,如果未能解决你的问题,请参考以下文章

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

EPOLL

epoll_wait() 是不是一次返回一个事件?

从经典网络IO模型到新异步IO框架io_uring《重制版》

从经典网络IO模型到新异步IO框架io_uring《重制版》

select,poll,epoll总结