概要
- 研究目的: 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コアの配置で高いスケーラビリティを示す。