【論文】A systematic study of libaio, SPDK, and io_uring

投稿者: | 2024年9月1日

概要

  • 研究目的: io_uring、libaio、SPDKの性能比較と設計ガイドラインの提供。
  • 主要発見: ポーリング設計が性能に大きく影響し、io_uringは十分なCPUコアがあればSPDKに近い性能を発揮する。→十分なCPUコアがあれば、io_uringでカーネルsubmissionポーリングとユーザ空間のcompletion pollingに使える。これにより、システムコールを不要とできるためSPDKに近い性能がだせる。ただしユーザ空間とカーネル空間の両方でポーリングが必要となり、ユーザ空間だけでとじるSPDKに対し2倍のコアが必要となる。※アプリごとにポーリングする想定。
  • 貢献: 各APIの詳細な評価と高性能アプリケーションの設計ガイドライン。

背景

  • NVM技術: FlashやOptane SSDなどの最新のNVMストレージ技術は、非常に低いレイテンシーと高い帯域幅を提供。
  • CPU性能の停滞: CPUの性能向上が停滞しているため、CPU効率の良いストレージAPIの開発が求められている。
  • io_uringの登場: 2019年に導入されたio_uringは、高性能ストレージとネットワーキングのアイデアを取り入れたAPI。

従来技術

  • libaio: 柔軟性と高性能を持つが、システムコールのオーバーヘッドが課題。
  • SPDK: ユーザースペースでのポーリングを採用し、非常に高い性能を発揮するが、複雑で使いにくい。
  • io_uring: libaioの柔軟性とSPDKの高性能を兼ね備えたAPI。
  • systemコールを非同期で処理する。
  • ブロックデバイスの割込みを契機にsystemコール応答するiou、ブロックデバイスを完了をポーリングするiou_c、スレッドで完了ポーリングするiou_sの3つのがある。

課題

  • ポーリングの設計: ポーリングの方法が性能に大きく影響する。例えば1コアだとカーネルスレッドとユーザスレッドがシングルコアを交互に使うためiou+kは性能がでない。2コアだとiou+kがio_uringの中では一番性能がでる。

  • CPUコアの利用: io_uringは十分なCPUコアがないと性能が低下する。

解決方式

  • io_uringの設計: 共有メモリマップされたキューを使用し、システムコールのオーバーヘッドを最小限に抑える。
  • ポーリングの種類: 完了通知のポーリングとカーネルスレッドによるサブミッションポーリングの2種類を提供。
  • ハイブリッドアプローチ: CPUコアとデバイスの数に応じたハイブリッドなアプローチを推奨。

効果

  • 性能向上: io_uringはSPDKに近い性能を発揮し、特に低から中程度のスループットで優れたレイテンシーを実現。
  • スケーラビリティ: io_uringは適切なCPUコアの配置で高いスケーラビリティを示す。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です