どの時点でディスクI / Oの非同期読み取りが同期より効率的ですか?


22

複数のコンシューマー向けにファイルを読み取るコードが少しあり、ファイルのサイズは任意であると仮定します。ファイルを非同期で読み取る方がどのサイズで効率がよくなりますか?別の言い方をすれば、同期的に読み取るためだけにファイルを高速化するには、ファイルをどれだけ小さくする必要がありますか?

私は、非常に小さなファイルを読み取るとき、同期(特に.NET)よりも非同期で読み取るのに時間がかかることに気付きました(そしておそらく私は間違っています)。これは、I / O完了ポート、スレッドなどのセットアップ時間に関係していると思います。

ここに役立つ経験則はありますか?それとも、システムと環境に依存していますか?


ベンチマークに使用するコードを教えてもらえますか?これは、ファイルサイズがストリームリーダーの内部バッファサイズよりも小さい場合にのみ発生すると考えられます。しかし、多くの小さなファイルを読み取る必要がある場合は、おそらくディスクI / Oで他の問題が発生するでしょう
ダニエルイアンコフ

コードが手元にないのではないかと心配です。それは私がしばらく前に出くわしたものであり、それはそれ以来私の心にありました。コードは、forループで)(.NETであったと本質的に直線File.ReadAllBytes(た)FileStream.BeginRead VS
blesh

効率を表す曲線が交差し、非同期IOが同期IO曲線よりも高い値で交差を出るとき。
トーマスエディング

回答:


14

残念ながら、答えは「依存します」です。非同期読み取りと同期読み取りの両方の時間を経験的に決定する小さなプログラムを作成するのは簡単です。

それは多くの要因に依存します。回転ディスク、SSD、またはネットワークドライブに保存されていますか?どのようなCPUを使用していますか?ソケット/コアはいくつですか?VMまたはベアメタルで実行していますか?古代のOSを実行していますか、それとも現代のOSを実行していますか?


1
ええ、私は同じくらい考えました。私は、ガイドまたは経験則として使用する何らかの研究があることを望んでいたと思います。
blesh

9

非同期には3つの主な利点があります。

  1. CPU使用率が低下します。これは、読んだばかりのデータでCPUを大量に使用する操作を行う場合にも便利です。
  2. 何らかの非同期インフラストラクチャを使用すると、コードを簡単に並列化できます。特に、多くのファイルを読んでいる場合。
  3. 複数の読み取り/書き込み要求をOSに送信することにより、OSとHWはこれらの操作を並べ替えて、より速く完了することができます。SATA2にはそのような機能があります。

非同期読み取りの主な利点は、大量のファイルを操作しているとき、または大量のCPUパワーが必要なときです。


ポイント2については、I / O操作がボトルネックである場合は何も最適化しないことに注意してください。RAIDまたはネットワークを介して、異なるディスクにあるファイルに並行してアクセスしている場合、状況は異なります。
アルセニムルゼンコ

5
うーん、私はあなたが#1で何を意味するのか理解できない。私はそれが実際には他の方法だと思います。非同期の場合、スレッドをblocked waiting for I/O(0%CPU)からcontinue normal processing(> 0%CPU)に変更しているためです。
イサクサボ

3

場合によります

心に留めておくべきことの1つは、プロセス間のコンテキストスイッチがどれほど高価かということです。Node.JSは、コンテキストスイッチの実行に非常にコストがかかり、そうしないとIEで多くのプロセスが待機し、コンピューターが動かなくなることを想定しているため、そのように設計されています。

一方、Erlangはプロセスコンテキストの切り替えを非常に安価にするため、すべてを同期でき、Erlangランタイムは全体を追跡できます。

考慮すべき要因:

  • コンテキスト切り替え操作のコスト
  • シーク操作用のディスクの速度
  • 読み取り操作用のディスクの速度
  • キャッシュ内のファイルは

そして、私は半ダースの要因を除外していると確信しています


2

特定の「ポイント」があるかどうかはわかりませんが、多くのスレッドが動作している場合は、I / Oを他の作業とオーバーラップできるため、最も意味があります。予備のスレッドがアイドル状態になっている場合、非同期での読み取りは利点をもたらしません。非同期ファイルアクセスが利点をもたらすのは、作業キューがいっぱいになり、スレッドがI / Oを待つのではなく、他の作業を有効に実行できる場合のみです。


うん、それがマルチスレッドのポイントです!
Vlad

1

ここでの問題は、読み取り速度ではなく、レイテンシーだと思います。

ネットワークドライブ、またはキューが長い低速の機械的ハードディスクドライブからデータを読み取る場合、パフォーマンスが低下する可能性があります。また、アプリがGUIスレッドで読み取りを行っている場合、その場合は非常に悪いアプリケーションであり、ユーザーにとってはひどいものになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.