io_uring
![]() | この項目「Io uring」は翻訳されたばかりのものです。不自然あるいは曖昧な表現などが含まれる可能性があり、このままでは読みづらいかもしれません。(原文:英語版 "io_uring" 21:24, 25 March 2023 (UTC)) 修正、加筆に協力し、現在の表現をより自然な表現にして下さる方を求めています。ノートページや履歴も参照してください。(2023年4月) |
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]。
出典
[編集]- ^ a b c d e f g “Linux Kernel Getting io_uring To Deliver Fast & Efficient I/O - Phoronix”. Phoronix. 2021年3月14日閲覧。
- ^ ジェンス・アクスボー (October 15, 2019). “Efficient IO with io_uring”. 2023年4月閲覧。
- ^ a b “Getting Hands-on with io_uring using Go” (英語). developers.mattermost.com. 2021年11月20日閲覧。
- ^ a b “The rapid growth of io_uring [LWN.net]”. lwn.net. 2021年11月20日閲覧。
- ^ “Faster IO through io_uring | Kernel Recipes 2019” (英語). 2021年3月14日閲覧。
- ^ Corbet, Jonathan. “Ringing in a new asynchronous I/O API”. LWN.net. 2021年3月14日閲覧。
- ^ “What's new with io_uring”. 2022年6月1日閲覧。
- ^ seastar::reactor_options Struct Reference - reactor_backend ScyllaDB
- ^ a b Introducing Glommio, a Thread-per-Core Crate for Rust & Linux Datadog
- ^ 120 Million I/O Per Second with a Standard 2U Intel® Xeon® System SDPK 2023年2月1日
- ^ Understanding Modern Storage APIs: A systematic study of libaio, SPDK, and io_uring Diego Didonaら 2022年
- ^ Block Device User Guide SPDK
外部リンク
[編集]- Efficient I/O with io_uring(io_uringの背後にある動機、インタフェース(データ構造など)、およびパフォーマンス評価についての詳細な説明)
liburing
ソースリポジトリ- Linuxカーネルリポジトリ内の
io_uring
ソースディレクトリ