簡體   English   中英

同時等待 epoll 和 io_uring

[英]Waiting for epoll and io_uring simotaniously

我正在將我的項目遷移到 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? 即一些 function 一旦 epoll 或 io_uring 有事情要處理就會解除阻塞。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM