【问题标题】:Waiting for epoll and io_uring simultaneously同时等待epoll和io_uring
【发布时间】: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?即,一旦 epoll 或 io_uring 有东西要处理,某些功能就会解除阻塞。

【问题讨论】:

    标签: linux network-programming polling 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

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2017-06-03
      • 2017-06-04
      相关资源
      最近更新 更多