Io uring

ウィキペディアから、無料の百科事典

io_uring (旧aioring) はストレージデバイスの非同期IO操作のためのLinuxカーネルのシステムコールインターフェースの一つであり、類似インターフェース(ファイル記述子を介してアクセスされるデータを操作するread()/write()やaio_read()/aio_write()のような関数によって提供されるもの)におけるパフォーマンス問題に対処したものとなっている[1][2](p2)。

このインターフェースの開発は進行中であり、主に Meta のジェンス・アクスボーが作業を行っている[1]。

インターフェース

この io_uring は I/O リクエストの提出 (submission) と完了 (completion) それぞれを保存するために2つの「キューリング」と呼ばれるリングバッファを作成することによって機能する。ストレージデバイスの場合、これらキューは「提出キュー (SQ)」と「完了キュー (CQ)」と呼ばれている[3]。これらのバッファをカーネルとアプリケーション間で共有し続けることは、両者の間でバッファをコピーするための余分で高価なシステムコールの発行を不要にし、I/Oパフォーマンスを向上させる[1][4][3]。io_uringの設計書によれば、SQバッファは利用アプリケーションによってのみ書き込み可能であり、CQバッファはカーネルによってのみ書き込み可能となっている[1]:3。

歴史

このカーネルインタフェースはLinuxカーネル バージョン5.1 で採用された[1][4][5]。liburingライブラリはユーザースペースから簡単にカーネルインタフェースとやりとりするためのAPIを提供している[1][1]:12。Linuxカーネルはバージョン2.5以降非同期IOをサポートしていたが、使用が難しくかつ非効率であると見られていた[6]。この古いAPIは特定のニッチなユースケースのみをサポートしていた[7]。

io_uringを使用したライブラリ

  • Seastar - C++によるthread-per-coreなサーバーアプリケーション向けフレームワーク。オープンソース。リアクターの実装にlinux-aio、epoll、io_uringの3つのバックエンドが存在する[8]。ScyllaDBで使われている。
  • glommio - Rustによるthread-per-coreプログラミング向けライブラリ。オープンソース。上記のSeastarに影響を受けて開発された[9]。メイン、低レイテンシ用、NVMe IOのポーリング用の3つのリングを作るのが特徴となっている[9]。
  • Storage Performance Development Kit - Intelにより開発され、その後オープンソース化されたNVMe SSD向け開発キット[10]。独自のNVMeブロックデバイスはio_uringよりも高速とされている[11]が、io_uringをブロックデバイスとして使うこともできる[12]。

出典

外部リンク