【アイオーウリング】

io_uring とは?

最終更新:
💡 I/Oのお願いと結果を、共有キューでやり取り

Linuxの非同期I/Oインターフェース。アプリとカーネルが共有する投入キューSQと完了キューCQで、要求と結果をやり取りする。まとめた投入などで負担を減らせるが、常に高速になるとは限らない。

📌 このページのポイント
お願いはSQへ、完了したらCQへアプリ結果を確認カーネルI/Oを処理共有キューSQ要求を投入CQ完了の結果投入と完了を分け、対応する結果を受け取る
共有する要求・完了キューの役割。通常は投入の呼び出しが必要で、I/Oデータ転送すべてのゼロコピーを示す図ではありません。
ひよこ ひよこ
Linuxで、何をする仕組みなの?
ペンギン先生 ペンギン先生
ファイルの読み書きやソケットの操作などを要求し、完了結果を後から受け取るインターフェースだよ。アプリが投入キューSQへ要求を入れ、カーネルが完了キューCQへ結果を返す。受付窓口と結果の受け取り箱を分けるイメージなんだ。
ひよこ ひよこ
非同期なら、待つことはない?
ペンギン先生 ペンギン先生
要求することと、結果を受け取ることを分けられるという意味だよ。完了まで別の仕事を進められるけれど、結果が必要なら待つこともある。io_uring_enterでは指定した数の完了を待つ使い方もできる。I/O自体の所要時間がなくなるわけではないんだ。
ひよこ ひよこ
共有キューに書けば、勝手に動くの?
ペンギン先生 ペンギン先生
通常は要求を入れてからio_uring_enterなどでカーネルへ投入するよ。SQPOLLでは専用のカーネルスレッドがSQを監視し、投入のシステムコールを減らせる。ただし、監視スレッドが眠った場合は起こす呼び出しが必要。初期設定も含め、システムコールが全部不要という意味ではないんだ。
ひよこ ひよこ
結果は、お願いした順に返るの?
ペンギン先生 ペンギン先生
独立した要求の完了順は、投入した順とは限らないよ。対応する要求をuser_dataなどで識別し、結果やエラーを確認する。順序が必要な処理では、そのための設計や機能が必要。CQはネットワークの受信データ専用のキューではないんだ。
ひよこ ひよこ
どんなアプリでも、すごく速くなる?
ペンギン先生 ペンギン先生
負荷や構成、対応している操作で変わるよ。まとめた投入で呼び出しの負担を減らせても、速度向上は測定が必要。共有するのは要求・結果のキューで、ファイルや通信のデータ転送がすべてゼロコピーになる保証もない。カーネルの対応機能や、利用を制限する設定も確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「io_uring」って出てきたら「LinuxでI/Oの要求と完了結果を、共有キューでやり取りする仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「io_uring」 = I/Oを共有するリングのインターフェース
💬 I/Oは入出力。要求と完了結果にリングバッファを使う名前だよ。「リング」は位置を先頭に戻して再利用する方式で、メモリが物理的に輪になるわけではないんだ

参考資料

← 用語集にもどる