io_uring: Linuxカーネルの非同期IOインターフェース
概要
io_uring(旧称aioring)は、
Linuxカーネルにおける非同期入出力(IO)操作のための新しい
システムコールインターフェースです。この技術は、従来の入出力操作で見られたパフォーマンスの問題を解決することを目的とされています。従来のAPIでは、
ファイル記述子を経由したデータ処理に関して(たとえば、`read()`や`write()`、`aio_read()`や`aio_write()`等)、多くの課題が存在しましたが、io_uringはそれを改善することを目指しています。主にMetaのジェンス・アクスボーが開発を進めています。
インターフェースの構造
io_uringは、I/Oリクエストの提出と完了を管理するために、2つの
リングバッファ、通称「キュー」を利用します。これらは「提出キュー(SQ)」と「完了キュー(CQ)」と呼ばれ、それぞれI/Oリクエストの管理を行ないます。このキューの設計において、カーネルとアプリケーション間でバッファを共有することが可能になるため、不要なバッファのコピーを避けることができ、
システムコールの発行を減少させることができます。特に、SQはアプリケーション専用で書き込みが可能で、CQはカーネル専用とすることで、効率的なデータ処理が行えるのです。
歴史
Linuxカーネルにおける非同期IOは、バージョン2.5以降から存在していましたが、古いAPIは使いづらく非効率的でした。そのため、特定のニッチな
ユースケースにのみ適したものでした。2019年には、
Linuxカーネルバージョン5.1で新たにio_uringが実装され、同時にユーザースペースからカーネルインターフェースにアクセスするための`liburing`ライブラリも提供されました。これにより、使いやすさが大幅に向上し、2020年代以降にはio_uringを利用するさまざまなソフトウェアが登場しました。具体的には、Intel Cloud-Hypervisor 0.9、Limbo(
SQLite互換実装)、および将来的な
PostgreSQL 18などがあります。
io_uringを用いたライブラリ
- - Seastar: C++で開発されており、スレッド毎にコアを使うサーバーアプリケーション向けのフレームワークです。Linux-aio、epoll、io_uringなど複数のバックエンドを持っています。ScyllaDBでも利用されています。
- - glommio: Rustによるスレッド毎のコアプログラミングをサポートするライブラリで、Seastarから影響を受けて開発されました。特に、3つのリングを作成する機能があり、低レイテンシでのNVMe IOのポーリングが可能です。
- - Storage Performance Development Kit: Intelが開発し、オープンソース化されたキットで、NVMe SSD向けの開発が行えます。独自のNVMeブロックデバイスはio_uringよりも高速ですが、io_uringをブロックデバイスとして利用することもできます。
まとめ
io_uringは、ストレージデバイスの非同期I/O処理に新たな可能性を開く
システムコールインターフェースです。その効率的なデータ管理やリクエスト処理により、特に高いパフォーマンスが求められる現代のアプリケーションにおいて、重要な役割を果たすことが期待されています。