toshiki

LinuxのI/O革命: epollとio_uringの違いを理解する

· Hacker News #130

Linux非同期I/Oの2大手法epollとio_uringを比較。Rustシステム開発者が知るべきカーネルI/Oの進化と選択基準を解説。

  • #linux
  • #systems
  • #rust
  • #performance
  • #async

#なぜ今日これを選んだか

RustでシステムプログラミングやEmbedded開発に進む上で、LinuxのI/Oモデルの理解は避けて通れない。epollは長年の定番だが、io_uringはカーネル5.1で登場した次世代の非同期I/Oで、tokioやasync-stdといったRustの非同期ランタイムも内部で使い始めている。「なぜRustの非同期が速いのか」の答えがここにある。

#要点

  • epollはファイルディスクリプタの準備状態を監視するイベント駆動モデル。ネットワークサーバーの定番だが、システムコール回数が多い
  • io_uringはリングバッファを共有しカーネルとユーザー空間のコピーを最小化。大量I/Oでepollより大幅に高速
  • Rustのtokioランタイムはio_uringバックエンド(tokio-uring)を持ち、#130の組み込み以外でも応用できる

#自分にとっての示唆

Rust The Bookを読み進める中で「非同期処理」の章が出てきたとき、「なぜasync/awaitが必要なのか」を理解するにはI/Oブロッキングの問題を知ることが前提になる。今日の記事はその底層にあるカーネルの仕組みを解説しており、tokio等を使いこなす際の「なぜそう設計されているのか」がスッと腑に落ちる。Rustでシステムツールを作るM2段階(CLIツール)から意識しておくと、後のEmbedded移行でも「CPUを止めないI/O」の設計判断に直結する。次のRust学習時間にepollのサンプルコードを眺めてみることを勧めたい。