web-dev-qa-db-ja.com

Linuxカーネルは非同期I / O(AIO)要求をどのように処理しますか?

Rawブロックデバイスファイルから直接読み取ることにより、SSDドライブからデータを読み取るCプログラムを作成しています。

Linux AIOを試しています(Linux AIO API、つまりPOSIX AIO APIではなく、io_submit(...)などのlinuxaio.hによって提供される関数について話しています)。 O_DIRECTフラグを使用してブロックデバイスファイルを開き、バッファーへの書き込みがブロックサイズに合わせられていることを確認します。

Linux AIOは、同期IOもO_DIRECTフラグを使用するよりもかなり高速であることに気付きました。

私が最も驚いたのは、Linux AIOでそれぞれ数KBの小さなランダム読み取りを多数発行することによって達成されるスループットが、同期I/OとO_DIRECTを使用して数MBの大きな(順次)読み取りを実行することによって達成されるスループットよりも著しく高いことです。 。

では、知りたいのですが、LinuxAIOが同期I/Oよりも優れているのはなぜですか。 AIOを使用すると、カーネルは何をしますか?カーネルはリクエストの並べ替えを実行しますか? Linux AIOを使用すると、同期I/Oを使用するよりもCPU使用率が高くなりますか?

よろしくお願いします

19
rob6ll

短い答え: AIO実装は、複数のIOを並列に送信するため、「高速」である可能性がありますが、同期実装では、実行中のI/Oが0または1つです。これは、メモリへの書き込みや、同期I/Oのオーバーヘッドが追加されたカーネルI/Oパスとは関係ありません。

これは、iostat -x -d 1を使用して確認できます。 avgqu-sz(平均キューサイズ=実行中のI/Oの平均数)とを見てください%util(使用率=デバイスに少なくとも1つのI/Oが発行された時間の割合)。

長い答え:

  • I/Oについて話すとき、「より速い」という概念は注意が必要です。 「速い」とは帯域幅が広いことを意味しますか?それとも待ち時間が短いのでしょうか?または、特定の要求サイズでの帯域幅?または、特定のキューの深さでのレイテンシー?または、レイテンシ、帯域幅、リクエストサイズ、キューの深さ、その他多くのパラメータまたはワークロードの組み合わせですか?ここでは、スループット/帯域幅について検討していると仮定しますが、ストレージデバイスのパフォーマンスは単一のディメンションメトリックではないことを覚えておくとよいでしょう。

  • SSDは高度に並列化されたデバイスです。 SSDは多くのフラッシュチップで構成されており、各チップには独立して読み取り/書き込みが可能な複数のダイがあります。 SSDはこれを利用して、応答時間を著しく増加させることなく、多数のI/Oを並行して実行します。したがって、スループットの観点から、SSDが認識する同時I/Oの数は非常に重要です。

  • スレッドが同期I/Oを送信するとどうなるかを理解しましょう:a)スレッドはI/O要求の準備(データの生成、オフセットの計算、データのバッファーへのコピーなど)にCPUサイクルを費やします。b)システム呼び出しは実行(例:pread())、実行がカーネルスペースに渡され、スレッドブロック、c)I/O要求がカーネルによって処理され、さまざまなカーネルI/Oレイヤーを通過する、d)I/O要求が送信されるデバイスに接続し、相互接続(PCIeなど)を通過します。e)I/O要求はSSDファームウェアによって処理されます。f)実際の読み取りコマンドは適切なフラッシュチップに送信されます。g)SSDコントローラーはデータを待機します。 h)SSDコントローラーはフラッシュチップからデータを取得し、相互接続を介して送信します。この時点で、データはSSDを離れ、ステージe-a)は逆に発生します。

  • ご覧のとおり、同期I/OプロセスはSSDでリクエストピンポンを再生しています。上記の多くの段階では、フラッシュチップから実際にデータが読み取られることはありません。さらに、SSDは数十から数百のリクエストを並行して処理できますが、任意の時点で最大で1つのリクエストを認識します。したがって、実際にはSSDを実際に使用していないため、スループットは非常に低くなります。

  • 非同期I/Oは、2つの方法で役立ちます。a)プロセスが複数のI/O要求を並行して送信できるようにする(SSDにはビジー状態を維持するのに十分な作業がある)、b)さまざまな処理段階でI/Oをパイプライン化できる(したがって、ステージのレイテンシをスループットから切り離します)。

  • 非同期I/Oが同期I/Oよりも高速であると考える理由は、リンゴとオレンジを比較するためです。同期スループットは、指定された要求サイズ、低いキュー深度で、パイプライン処理なしで実行されます。非同期スループットは、要求サイズが異なり、キューの深さが深く、パイプライン化されています。あなたが見た数は比較できません。

  • I/Oを多用するアプリケーションの大部分(つまり、データベース、Webサーバーなどのほとんどのアプリケーション)には、同期I/Oを実行する多くのスレッドがあります。各スレッドは常に最大で1つのI/Oを送信できますが、カーネルとSSDデバイスは、並行して処理できる多くのI/O要求を認識します。複数の同期I/O要求は、複数の非同期I/O要求と同じ利点をもたらします。

    非同期I/Oと同期I/Oの主な違いは、I/Oとプロセスのスケジューリング方法とプログラミングモデルにあります。非同期I/Oと同期I/Oはどちらも、正しく実行されれば、ストレージデバイスから同じIOPS /スループットを引き出すことができます。

26
Radu