2

我正在将我的项目迁移到 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?即,一旦 epoll 或 io_uring 有东西要处理,某些功能就会解除阻塞。

4

1 回答 1

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

于 2021-12-27T18:29:09.950 回答