この項目「Io uring」は翻訳されたばかりのものです。不自然あるいは曖昧な表現などが含まれる可能性があり、このままでは読みづらいかもしれません。(原文:英語版 "io_uring" 21:24, 25 March 2023 (UTC)) 修正、加筆に協力し、現在の表現をより自然な表現にして下さる方を求めています。ノートページや履歴も参照してください。(2023年4月) |
io_uring (旧aioring) はストレージデバイスの非同期IO操作のためのLinuxカーネルのシステムコールインターフェースの一つであり、類似インターフェース(ファイル記述子を介してアクセスされるデータを操作するread()/write()やaio_read()/aio_write()のような関数によって提供されるもの)におけるパフォーマンス問題に対処したものとなっている(p2)。
このインターフェースの開発は進行中であり、主に Meta のジェンス・アクスボーが作業を行っている。
この io_uring は I/O リクエストの提出 (submission) と完了 (completion) それぞれを保存するために2つの「キューリング」と呼ばれるリングバッファを作成することによって機能する。ストレージデバイスの場合、これらキューは「提出キュー (SQ)」と「完了キュー (CQ)」と呼ばれている。これらのバッファをカーネルとアプリケーション間で共有し続けることは、両者の間でバッファをコピーするための余分で高価なシステムコールの発行を不要にし、I/Oパフォーマンスを向上させる。io_uringの設計書によれば、SQバッファは利用アプリケーションによってのみ書き込み可能であり、CQバッファはカーネルによってのみ書き込み可能となっている:3。
元々Linuxカーネルにおいてはバージョン2.5以降より長らく非同期IO APIが搭載されていたが、この古いAPIの使用は難しくかつ非効率であると見られており、また特定のニッチなユースケースにのみに向いたものとなっていた。
2019年、Linuxカーネル バージョン5.1 において独自の非同期APIである io_uring カーネルインタフェースが登場し、またユーザースペースから簡単にカーネルインタフェースとやりとりするためのliburingライブラリも用意されるようになった:12。
その後、2020年代にはこの io_uring を採用したソフトウェアが数々登場した。これには後述のライブラリのほか、Intel Cloud-Hypervisor 0.9以降、Limbo(SQLite互換実装)、PostgreSQL 18 以降(予定)などが存在する。
liburing ソースリポジトリio_uring ソースディレクトリ