2012-01-17 4 views
13

RAID 5(4 x 7.2k @ 3TB)システムに2TBの読み取り専用(書き込みは作成されていません)ファイルがあります。2TBファイルからのファイルオフセットによってランダムに多くの300バイトのチャンクを読み込む最速の方法はありますか?

今、私はそのファイルの一部を読みたいスレッドをいくつか持っています。 すべてのスレッドに必要なチャンクの配列があります。 すべてのチャンクは、読み込むファイルのオフセット(位置)とサイズ(主に約300バイト)によってアドレス指定されます。

このデータを読み取る最も早い方法は何ですか。 CPUサイクルは気にしませんが、(ディスクの)待ち時間は重要です。 可能であれば、私はハードディスクのNCQを利用したいと思います。

ファイルは非常に圧縮されており、ランダムにアクセスされ、正確に位置を知っているため、私はそれを最適化する方法が他にありません。

  • ファイルを1つのスレッドにプールする必要がありますか?
  • ファイルを開いたままにする必要がありますか?
  • すべてのスレッド(約30個)は、すべてのファイルを同時に開いておく必要がありますか?新しいスレッドは(Webサーバーから)来ていますか?
  • 私は100ms待って、ファイルのオフセット(最低のもの)で読み値を並べ替えると役に立ちますか?

データを読み取る最も良い方法は何ですか?経験、ヒント、ヒントはありますか?

答えて

4

並列リクエストの最適な数は、ディスクの数= 4、NCQの深さ=?、ドライバのキューの深さ=?...など、アプリケーション外の要因によって大きく異なるため、システムを使用することができます。適応するか適応させる。私の推薦は次のとおりです。

  • 書き込み
  • は、N個のスレッドを持って要求しているスレッドに通知することを可能にするいくつかのメタデータと一緒にキューに、すべての読み取り要求は、要求しているスレッドに通知し、同期チャンクを読んで、そのキューからデキュー
  • あなたがヒットするまで、上下
  • スライドN CPUはあなたの問題ではないので、あなたのワーカースレッドが(自分のニーズに応じて、および/または最大)浮動待ち時間の平均値を計算することができますNランタイム・変更
  • くださいスイートポイント

なぜ同期読み取りですか?彼らはascyncの読み込みよりも待ち時間が短くなっています。 キューの廃棄待ち時間はなぜですか?良いロックレスキューの実装が10nsの遅延時間未満、2つのスレッド・スイッチよりもはるかに少ない

アップデート開始時刻:いくつかのQ/

読み取りスレッドが開いているファイルを保持すべきか? はい、間違いなくそうです。

FileOptions.RandomAccessでFileStreamを使用しますか? はい

"同期してチャンクを読み込む"と書いてください。これは、すべての読み取りスレッドが、チャンクを読み取るために注文をデキューするとすぐに、ディスクからチャンクを読み始めることを意味しますか? はい、そういう意味です。読み取り要求のキューの深さは、スレッド数によって管理されます。

+0

読み取りスレッドはファイルを開いたままにする必要がありますか?私はイエスと思う。 FileOptions.RandomAccessでFileStreamを使用しますか?あなたは "同期してチャンクを読む"と書いています。これは、すべての読み取りスレッドが、チャンクを読み取るために注文をデキューするとすぐに、ディスクからチャンクを読み始めることを意味しますか? – Chris

+0

あなたのコメントに答えるために私の答えを編集しました。 –

+0

私は忘れて、あなたは書いています:「良いロックレスキューインプリメンテーションは、10ns未満のレイテンシから始まります。あなたは特別なクラス/プロジェクトを念頭に置いていますか? – Chris

0

ディスクはヘッドが1つしかないため、「シングルスレッド」です。どれだけ多くのスレッドを使用していても、速く進まないでしょう...実際には、スレッド数が増えれば遅くなるかもしれません。ちょうど自分自身のリストを取得し、アプリで並べ替えることができます。

もちろん、NCQを使用するほうが効率的ですが、アプリケーションに配置して1つのスレッドを使用すると、よりうまくいくはずです。

ファイルが断片化している場合、NCQと2つのスレッドを使用すると、ディスク上の正確な位置を知ることができないため、NCQだけが読み込みを最適化できます。それはcontignousの場合 - ソートを使用します。

OSのキャッシュをバイパスし、ファイル全体を順番に読み取るようにダイレクトI/Oを試すこともできます。特に、このアレイに他の負荷がない場合は、高速化することがあります。

+0

-1部分的に。複数のthjreadsがある場合は、複数のRequetsがディスクにヒットします。良質のディスク(SAS、SATA)は、ディスクをより効率的にするためのリネーム(「ネイティブコマンドキューイング」)を可能にし、結果を順番に配信します。これにより、通常の同期シングルスレッドIOと比較して大幅に向上します。 – TomTom

+0

さらに私はRAID 5を持っています。したがって、すべてのディスクは他の位置から読み取ることができます。 – Chris

+0

また、reuqestedチャンクは非常に小さいので、RAID5とほとんどのコントローラが一度に完全なストライプを読み取ると、別のチャンクが既にRAMに入っている可能性があります。 –

関連する問題