io_uring (非同期I/O API)(アイオーユーリング)
Jens Axboe 開発のLinux 非同期I/O API。Linux 5.1 (2019) で導入、Submission/Completion Queue ペアでシステムコール削減、高性能ストレージ / ネットワークI/O 革新。
概要
io_uring はJens Axboe (元Facebook・現Meta・Linux Block Layer maintainer) が主導開発したLinux 非同期I/O API。2019年5月Linux 5.1 で導入、Submission Queue (SQ) / Completion Queue (CQ) のリングバッファペアでカーネル↔ユーザ空間のシステムコールを大幅削減、従来 POSIX AIO / Linux AIO / epoll / select に代わる新世代非同期I/O 機構。
主要マイルストーン
| 年月 | Linux | 主要追加 |
|---|---|---|
| 2019-05 | 5.1 | 初期io_uring (read/write/poll) |
| 2019-11 | 5.4 | SQPOLL カーネルスレッド |
| 2020-04 | 5.6 | recv / send / connect等のソケット対応 |
| 2020-10 | 5.10 | sqe_flags 拡張 |
| 2021-05 | 5.13 | Multishot poll / accept |
| 2022-03 | 5.17 | io_uring_register_buf_ring |
| 2022-11 | 6.0 | Multishot recv |
| 2023-04 | 6.3 | Network Zerocopy 強化 |
| 2024-Q1 | 6.7+ | DirectIO 強化・futex 対応 |
主要機能
| 機能 | 説明 |
|---|---|
| Submission Queue (SQ) | アプリ → カーネルへ操作リクエスト送信 |
| Completion Queue (CQ) | カーネル → アプリへ完了通知 |
| SQPOLL | カーネルポーリングスレッド (高性能モード) |
| IORING_OP_* | 60+ の操作種 (read/write/poll/send/recv等) |
| Buffer Registration | 事前buf 登録で領域参照高速化 |
| FixedFiles | 事前fd 登録 |
| LinkedSQEs | 複数操作の連結 (cp / read+write 等) |
| Multishot | 1 SQE で複数完了 (accept ループ等) |
| MSG_RING | 別io_uring 間メッセージ送信 |
性能比較
| ベンチマーク | epoll | Linux AIO | io_uring |
|---|---|---|---|
| 4KB Random Read IOPS | 240k | 280k | 1.7M |
| nginx シングルスレッド | 95k req/s | - | 145k req/s |
| RocksDB GET QPS | 1.0× | 1.1× | 1.4× |
| Network ECHO | 80k qps | - | 200k qps |
主要採用
| ソフトウェア | io_uring 採用 |
|---|---|
| RocksDB | optional backend |
| Ceph | RBD client |
| QEMU | virtio-blk async |
| nginx | (実験的) |
| SQLite | optional backend |
| Docker / containerd | 一部 |
| ScyllaDB | 標準 |
| io_uring-cp (cp utility) | あり |
セキュリティ問題
| CVE | 年 | 内容 |
|---|---|---|
| CVE-2022-32250 | 2022 | sqe_flags 競合状態 |
| CVE-2023-2598 | 2023 | fixed buffer の use-after-free |
| CVE-2023-1872 | 2023 | poll cancel UAF |
Google Project Zero / kernelCTF で多数の脆弱性発見、Linux 6.1+ で大幅修正・現在は安定化。Google ChromeOS / Android はio_uring を無効化 (セキュリティ重視)。
関連用語との違い
- vs Linux AIO: 旧 / 新・Linux AIO はDirect I/O 専用
- vs epoll: ファイルI/O 対応 (io_uring) / イベント通知 (epoll)
- vs Windows IOCP: 同様コンセプト・カーネル横並び
FAQ
Q1: 一般アプリで使うべき? A: 標準ライブラリ統合進行中 (rust async-std / tokio・C liburing)。直接利用は専門用途で。
Q2: WindowsからLinux 性能差? A: io_uring 採用Linux でWindows IOCP を上回るスループット報告増・SQLPolling 採用環境で1M+ IOPS 達成可能。
Q3: Android で動く? A: Linux カーネル 5.10+ ベース Android 12+ で動くが Google が無効化推奨。アプリレベル直接使用は限定的。