【アイオーウリング】

io_uring とは?

公開:
💡 カーネルとアプリが「共有メモ帳」を読み書きするだけでI/Oが飛ぶ
📌 このページのポイント
io_uring のリングバッファ構造 ユーザー空間 (アプリケーション) SQ(送信キュー) I/Oリクエストを書き込む CQ(完了キュー) 完了結果を読み取る 共有 メモリ (コピー 不要) カーネル空間 (io_uring コントローラ) SQ処理 リクエストをI/Oに変換 CQ書き込み 完了結果をキューに返す ▲ ゼロコピー共有バッファでシステムコールを最小化
io_uring のリングバッファ構造(SQとCQをユーザー空間とカーネル空間で共有)
ひよこ ひよこ
ペンギン先生、io_uringって名前が変なんだけど、何するものなの?
ペンギン先生 ペンギン先生
LinuxでI/O処理をすごく速くするための仕組みだよ。ファイルの読み書きやネットワーク通信を「非同期」でまとめて処理できるんだ
ひよこ ひよこ
同期って、待たなくていいってこと?
ペンギン先生 ペンギン先生
そうだよ。普通はファイルを読むたびにカーネルに「お願い」するシステムコールを呼ぶんだけど、io_uringは「リングバッファ」という共有メモリにまとめてリクエストを書いておいて、カーネルが勝手に処理してくれるんだ
ひよこ ひよこ
「リング」って円になってるの?
ペンギン先生 ペンギン先生
その通り!送信用と受信用の2つの「輪っか状のバッファ」を使って、ぐるぐる再利用するよ。SQ(送信キュー)にリクエストを書いて、カーネルがCQ(完了キュー)に結果を書き戻してくれる仕組みだね
ひよこ ひよこ
システムコールが減るとそんなに速くなるの?
ペンギン先生 ペンギン先生
かなり速くなるよ。システムコールカーネルとのやり取りで重いんだ。io_uringなら1回のio_uring_enterで何千ものI/Oをまとめて投げられるし、カーネルモードへの切り替えコストも減るんだ
ひよこ ひよこ
どんなアプリで使われてるの?
ペンギン先生 ペンギン先生
高性能なWebサーバー、データベース(RocksDB、PostgreSQLなど)、ネットワークプロキシなどで使われているよ。Rustのtokioランタイムもio_uringバックエンドをサポートしているんだ
ひよこ ひよこ
じゃあ普通のアプリには関係ないのかな?
ペンギン先生 ペンギン先生
直接使うことは少ないかもね。でもLinuxカーネル5.1以降なら利用可能で、liburing というライブラリ経由で使いやすくなっているよ。将来的には多くのランタイムが内部でio_uringを活用していくと思うんだ
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「io_uring」って出てきたら「Linuxの超高速非同期I/O」と思えればだいたいOK!
📖 おまけ:英語の意味
「io_uring」 = I/Oリング(Input/Output ring buffer)
💬 「io」はInput/Output、「uring」はリングバッファ(ring buffer)の略で、カーネルとアプリの間で円環状のバッファを共有してI/Oをやり取りする仕組みからきているよ
← 用語集にもどる