Io uring

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

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

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

歴史
元々Linuxカーネルにおいてはバージョン2.5以降より長らく非同期IO APIが搭載されていたが、この古いAPIの使用は難しくかつ非効率であると見られており、また特定のニッチなユースケースにのみに向いたものとなっていたHow io_uring and eBPF Will Revolutionize Programming in Linux ScyllaDB 2020年5月5日。

2019年、Linuxカーネル バージョン5.1 において独自の非同期APIである io_uring カーネルインタフェースが登場し、またユーザースペースから簡単にカーネルインタフェースとやりとりするためのライブラリも用意されるようになった。

その後、2020年代にはこの io_uring を採用したソフトウェアが数々登場した。これには後述のライブラリのほか、Intel Cloud-Hypervisor 0.9以降Intel Cloud-Hypervisor 0.9 Brings io_uring Block Device Support For Faster Performance Phoronix 2020年8月8日、Limbo（SQLite互換実装）Limbo Is An SQLite-Compatible OLTP DBMS Leveraging IO_uring & Rust Phoronix 2024年5月9日、PostgreSQL 18 以降（予定）PostgreSQL Database Lands Initial Support For IO_uring: "Can Be Considerably Faster" Phoronix 2025年3月27日などが存在する。

 io_uringを使用したライブラリ 
 Seastar - C++によるthread-per-coreなサーバーアプリケーション向けフレームワーク。オープンソース。リアクターの実装にlinux-aio、epoll、io_uringの3つのバックエンドが存在するseastar::reactor_options Struct Reference - reactor_backend ScyllaDB。ScyllaDBで使われている。
 glommio - Rustによるthread-per-coreプログラミング向けライブラリ。オープンソース。上記のSeastarに影響を受けて開発されたIntroducing Glommio, a Thread-per-Core Crate for Rust & Linux Datadog。メイン、低レイテンシ用、NVMe IOのポーリング用の3つのリングを作るのが特徴となっている。
 Storage Performance Development Kit - Intelにより開発され、その後オープンソース化されたNVMe SSD向け開発キット120 Million I/O Per Second with a Standard 2U Intel® Xeon® System SDPK 2023年2月1日。独自のNVMeブロックデバイスはio_uringよりも高速とされているUnderstanding Modern Storage APIs: A systematic study of libaio, SPDK, and io_uring Diego Didonaら 2022年が、io_uringをブロックデバイスとして使うこともできるBlock Device User Guide SPDK。

 出典 

 外部リンク 
 Efficient I/O with io_uring（io_uringの背後にある動機、インタフェース（データ構造など）、およびパフォーマンス評価についての詳細な説明）
  ソースリポジトリ
 Linuxカーネルリポジトリ内の  ソースディレクトリ

Category:Linux

Category:入出力