Io uring

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処理に新たな可能性を開くシステムコールインターフェースです。その効率的なデータ管理やリクエスト処理により、特に高いパフォーマンスが求められる現代のアプリケーションにおいて、重要な役割を果たすことが期待されています。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。