io_uring
Keywords
Prerequisites
Related Papers
- What Modern NVMe Storage Can Do, And How To Exploit It(PVLDB 2023)
- DuckDB on xNVMe(arXiv 2025)
Progress
Sign in to track your progress.
在前面我們學過 synchronous 與 asynchronous I/O 的差異,而 Linux 早期的 async I/O 機制(如 libaio)有諸多限制,例如只支援 direct I/O 且 syscall 開銷仍然顯著。io_uring 是 Linux 從 5.1 開始引入的高效能 async I/O 框架,我們將深入探討它如何透過 kernel 與 user space 之間共享的 submission queue 和 completion queue ring buffer,讓應用程式不需要頻繁呼叫 syscall 就能提交與收割 I/O 請求。課程中我們也會介紹 batched submission 如何攤平 syscall 成本、SQPOLL 模式如何讓 kernel thread 持續 polling submission queue 以完全省去 submit 端的 syscall,以及 IOPOLL 模式如何用 polling 取代 interrupt 來降低 completion 延遲。此外,io_uring_cmd 機制允許我們直接下達 NVMe passthrough command,繞過傳統 block layer 的抽象。這些技術結合了我們先前學到的 block I/O 與 NVMe 知識,是目前 Linux 上最重要的高效能 I/O 介面。
Key Concepts
我理解 io_uring 的 shared ring buffer 設計,知道 kernel 與 user space 共享 submission queue 和 completion queue,應用程式透過寫入 SQE 提交請求、讀取 CQE 收割結果,大幅減少 syscall 次數
我理解 batched submission 如何將多筆 I/O 請求一次提交,攤平 syscall 的成本,提升高 IOPS 場景下的效率
我理解 SQPOLL 模式的運作方式,知道它讓一個專屬的 kernel thread 持續 polling submission queue,使應用程式完全不需要呼叫 syscall 就能提交 I/O
我理解 IOPOLL 模式如何用 polling 取代 interrupt 來通知 I/O 完成,降低 completion 端的延遲
我了解 io_uring_cmd 機制如何讓應用程式直接下達 NVMe passthrough command,繞過傳統 block layer 的抽象來操作 NVMe 裝置