Io uring
From Wikipedia, the free encyclopedia
インターフェース
この io_uring は I/O リクエストの提出 (submission) と完了 (completion) それぞれを保存するために2つの「キューリング」と呼ばれるリングバッファを作成することによって機能する。ストレージデバイスの場合、これらキューは「提出キュー (SQ)」と「完了キュー (CQ)」と呼ばれている[3]。これらのバッファをカーネルとアプリケーション間で共有し続けることは、両者の間でバッファをコピーするための余分で高価なシステムコールの発行を不要にし、I/Oパフォーマンスを向上させる[1][4][3]。io_uringの設計書によれば、SQバッファは利用アプリケーションによってのみ書き込み可能であり、CQバッファはカーネルによってのみ書き込み可能となっている[1]:3。
歴史
元々Linuxカーネルにおいてはバージョン2.5以降より長らく非同期IO APIが搭載されていたが、この古いAPIの使用は難しくかつ非効率であると見られており[5]、また特定のニッチなユースケースにのみに向いたものとなっていた[6][7]。
2019年、Linuxカーネル バージョン5.1 において独自の非同期APIである io_uring カーネルインタフェースが登場し[1][4][8]、またユーザースペースから簡単にカーネルインタフェースとやりとりするためのliburingライブラリも用意されるようになった[1][1]:12。
その後、2020年代にはこの io_uring を採用したソフトウェアが数々登場した。これには後述のライブラリのほか、Intel Cloud-Hypervisor 0.9以降[9]、Limbo(SQLite互換実装)[10]、PostgreSQL 18 以降(予定)[11]などが存在する。
io_uringを使用したライブラリ
- Seastar - C++によるthread-per-coreなサーバーアプリケーション向けフレームワーク。オープンソース。リアクターの実装にlinux-aio、epoll、io_uringの3つのバックエンドが存在する[12]。ScyllaDBで使われている。
- glommio - Rustによるthread-per-coreプログラミング向けライブラリ。オープンソース。上記のSeastarに影響を受けて開発された[13]。メイン、低レイテンシ用、NVMe IOのポーリング用の3つのリングを作るのが特徴となっている[13]。
- Storage Performance Development Kit - Intelにより開発され、その後オープンソース化されたNVMe SSD向け開発キット[14]。独自のNVMeブロックデバイスはio_uringよりも高速とされている[15]が、io_uringをブロックデバイスとして使うこともできる[16]。