6

私は、ファイル コピー ルーチンをコーディングして大きなファイルを RAID 5 ハードウェアにコピーする最速の方法を見つけようとしています。

平均ファイル サイズは約 2 GB です。

2 つの Windows ボックスがあります (どちらも win2k3 を実行しています)。最初のボックスは、大きなファイルが配置されているソースです。2 番目のボックスには RAID 5 ストレージがあります。

http://blogs.technet.com/askperf/archive/2007/05/08/slow-large-file-copy-issues.aspx

上記のリンクは、Windows コピー、robocopy、およびその他の一般的なコピー ユーティリティの書き込みパフォーマンスが低下する理由を明確に説明しています。したがって、CreateFile、ReadFile、および WriteFile API のNO_BUFFERING&WRITE_THROUGHフラグを使用する C/C++ プログラムを作成しました。プログラムは ESEUTIL.exe をシミュレートします。つまり、読み取り用と書き込み用の 2 つのスレッドを使用します。リーダー スレッドは、ソースから 256 KB を読み取り、バッファーをいっぱいにします。16 個の 256 KB ブロックがいっぱいになると、ライター スレッドはバッファ内の内容を宛先ファイルに書き込みます。ご覧のとおり、ライター スレッドは 1 ショットで 8MB のデータを書き込みます。プログラムはこのような 8MB ブロックを 32 個割り当てます。したがって、書き込みと読み取りを並行して行うことができます。ESEUtil.exe の詳細については、上記のリンクを参照してください。注: を使用する際のデータ配置の問題に対処してNO_BUFFERINGいます。

ATTO などのベンチ マーキング ユーティリティを使用したところ、8 MB のデータ チャンクを書き込むときに、RAID 5 ハードウェアの書き込み速度が 1 秒あたり 44 MB であることがわかりました。これは1 分あたり約 2.57 GBです。

しかし、私のプログラムは毎分 1.4 GBしか達成できません。

誰でも問題が何であるかを特定するのを手伝ってもらえますか? より高速な API はCreateFileありReadFileますWriteFileか?

4

7 に答える 7

7

最高のパフォーマンスを得るには、非同期 IO を使用する必要があります。つまり、WriteFileFILE_FLAG_OVERLAPPEDの引数を使用してファイルを開きます。LPOVERLAPPEDを使用すると、パフォーマンスが向上する場合とされない場合がありますFILE_FLAG_NO_BUFFERING。確認するには、テストする必要があります。

FILE_FLAG_NO_BUFFERING一般に、より安定した速度とより優れたストリーミング動作が得られ、ディスク キャッシュが不要なデータで汚染されるのを回避できますが、全体的に必ずしも高速であるとは限りません。

また、テストして、IO の各ブロックに最適なサイズを確認する必要があります。私の経験では、一度に 4k のファイルをコピーする場合と、一度に 1Mb のファイルをコピーする場合では、パフォーマンスに大きな違いがあります。

これに関する私の過去のテスト (数年前) では、約 64kB 未満のブロック サイズはオーバーヘッドが支配的であり、約 512KB までのより大きなブロック サイズで合計スループットが向上し続けることがわかりました。今日のドライブで、最大のスループットを得るために 1MB を超えるブロック サイズを使用する必要があったとしても、私は驚かないでしょう。

現在使用している数値は適切に見えますが、最適ではない可能性があります。また、FILE_FLAG_WRITE_THROUGH がオンディスク キャッシュの使用を妨げているため、かなりのパフォーマンスが犠牲になることは確かです。

また、CreateFile/WriteFile を使用してファイルをコピーしても、NTFS のタイムスタンプや代替データ ストリームなどのメタデータはコピーされないことにも注意する必要があります。これらのことは自分で対処する必要があります。

実際に独自のコードに置き換えるCopyFileのはかなりの作業です。

補遺:

WindowsNT 3.0 のソフトウェア Raid 0 でこれを試したとき (約 10 年前) に言及する必要があります。速度は、バッファのメモリ内の配置に非常に敏感でした。当時、DMA がメモリの 16 物理領域 (64Kb) を超える場合、SCSI ドライバは、スキャッター/ギャザー リストから DMA を実行するために特別なアルゴリズムを使用する必要があったことが判明しました。最適なパフォーマンスを保証するには、物理​​的に連続した割り当てが必要です。これは、ドライバーのみが要求できるものです。これは基本的に、当時の一般的なチップセットの DMA コントローラのバグに対する回避策であり、現在も問題になる可能性は低いです。

しかし - 32kb から 32Mb までの 2 のべき乗すべてのブロック サイズをテストして、どちらが高速かを確認することを強くお勧めします。また、一部のバッファーが他のバッファーより一貫して高速であるかどうかをテストすることを検討することもできます。これは前例のないことではありません。

于 2010-01-12T21:33:36.067 に答える
2

しばらく前に、非同期ファイル I/O と、すべてを適切に行わないと実際に同期になってしまう傾向があることについてのブログ投稿を書きました ( http://www.lenholgate.com/blog/2008/02/when- are-asynchronous-file-writes-not-asynchronous.html )。

重要なポイントは、使用しているときでもFILE_FLAG_OVERLAPPEDFILE_FLAG_NO_BUFFERINGファイルを事前に拡張する必要があるため、非同期書き込みでファイルを拡張する必要がありません。セキュリティ上の理由から、ファイル拡張子は常に同期的です。事前拡張するには、次のことを行う必要があります。

  • SE_MANAGE_VOLUME_NAME特権を有効にします。
  • ファイルを開きます。
  • で目的のファイル長にシークしますSetFilePointerEx()
  • でファイルの終わりを設定しますSetEndOfFile()
  • ファイル内の有効なデータの末尾を設定しますSetFileValidData()
  • ファイルを閉じます。

それで...

  • 書き込むファイルを開きます。
  • 書き込みを発行する
于 2010-01-12T22:02:04.340 に答える
0

書き込み速度がそれほど重要な場合は、ハードウェア構成に RAID 0 を検討してみませんか?

  • お客様は RAID 5 を希望しています。
  • フォールト トレランスが優れているため、RAID 0 よりも優先されます。
  • 顧客は、RAID 5 が提供できる機能に満足しています。ここでの問題は、ATTO を使用してハードウェアのベンチマークを実行すると、毎分 2.57 GB の書き込み速度 (8 MB のチャンク書き込み) が示されることです。コピー ツールがそれに近い値を達成できないのはなぜですか? 1 分あたり 2 GB のようなものが、私たちが見ているものです。これまでのところ、1 分あたり最大 1.5 GB しか達成できていません。
于 2010-01-09T03:23:48.350 に答える
0

これを行う正しい方法は、バッファなしの完全非同期 I/O を使用することです。キューを維持するには、複数の I/O を発行する必要があります。これにより、ファイル システム、ドライバー、および Raid-5 サブシステムが I/O をより最適に管理できるようになります。

複数のファイルを開き、複数のファイルに read と wites を発行することもできます。

ノート!未処理の I/O の最適な数と、読み取りと書き込みをインターリーブする方法は、ストレージ サブシステム自体に大きく依存します。プログラムは、調整できるように高度にパラメータ化する必要があります。

注 - Robocopy は改善されていると思います。試してみましたか? 私

于 2010-01-12T03:41:12.770 に答える
0

私はいくつかのテストを行い、いくつかの結果を得ました。テストは 100Mbps および 1Gbps NIC で実行されました。ソース マシンは Win2K3 サーバー (SATA) で、ターゲット マシンは Win2k3 サーバー (RAID 5) です。

私は3つのテストを実行しました:

1) Network Reader -> このプログラムは、ネットワーク経由でファイルを読み取るだけです。このプログラムの目的は、最大 n/w 読み取り速度を見つけることです。CreateFile と ReadFile を使用して、バッファリングされていない読み取りを実行しています。

2) Disk Writer -> このプログラムは、データを書き込むことによって RAID 5 の速度をベンチマークします。NON BUFFERED 書き込みは、CreateFile と WriteFile を使用して実行されます。

3) Blitz Copy -> このプログラムはファイルコピーエンジンです。ネットワーク経由でファイルをコピーします。このプログラムのロジックについては、最初の質問で説明しました。NO_BUFFERING Reads & Writes で同期 I/O を使用しています。使用される API は、CreateFile、ReadFile、および WriteFile です。


以下に結果を示します。

ネットワークリーダー:-

100Mbps NIC

チャンク サイズ 8 KB で 768 MB を読み取るのに 148344 ミリ秒かかりました。

チャンク サイズ 64 KB で 768 MB を読み取るのに 89359 ミリ秒かかりました

チャンク サイズ 128 KB で 768 MB を読み取るのに 82625 ミリ秒かかりました

チャンク サイズ 256 KB で 768 MB を読み取るのに 79594 ミリ秒かかりました

チャンク サイズ 512 KB で 768 MB を読み取るのに 78687 ミリ秒かかりました

チャンク サイズ 1024 KB で 768 MB を読み取るのに 79078 ミリ秒かかりました

チャンク サイズ 2048 KB で 768 MB を読み取るのに 78594 ミリ秒かかりました

チャンク サイズ 4096 KB で 768 MB を読み取るのに 78406 ミリ秒かかりました

チャンク サイズ 8192 KB で 768 MB を読み取るのに 78281 ミリ秒かかりました

1Gbps NIC

チャンク サイズ 8 KB で 5120 MB (5 GB) を読み取るのに 206203 ミリ秒かかりました

チャンク サイズ 64 KB で 5120 MB を読み取るのに 77860 ミリ秒かかりました

チャンク サイズ 128 KB で 5120 MB を読み取るのに 74531 ミリ秒かかりました

チャンク サイズ 256 KB で 5120 MB を読み取るのに 68656 ミリ秒かかりました

チャンク サイズ 512 KB で 5120 MB を読み取るのに 64922 ミリ秒かかりました

チャンク サイズ 1024 KB で 5120 MB を読み取るのに 66312 ミリ秒かかりました

チャンク サイズ 2048 KB で 5120 MB を読み取るのに 68688 ミリ秒かかりました

チャンク サイズ 4096 KB で 5120 MB を読み取るのに 64922 ミリ秒かかりました

チャンク サイズ 8192 KB で 5120 MB を読み取るのに 66047 ミリ秒かかりました

ディスクライター:-

NO_BUFFERING と WRITE_THROUGH を使用して RAID 5 で実行される書き込み

チャンク サイズ 4MB の 2048MB (2GB) のデータの書き込みには 68328ms かかりました。

チャンク サイズ 8MB の 2048MB のデータの書き込みには 55985ms かかりました。

チャンク サイズ 16MB で 2048MB のデータを書き込むには 49569ms かかりました。

チャンク サイズ 32MB の 2048MB のデータの書き込みには 47281ms かかりました。

NO_BUFFERING のみを使用して RAID 5 で実行される書き込み

チャンク サイズ 4MB の 2048MB (2GB) のデータを書き込むには、57484ms かかりました。

チャンク サイズ 8MB の 2048MB のデータの書き込みには 52594ms かかりました。

チャンク サイズ 16MB で 2048MB のデータを書き込むには 49125ms かかりました。

チャンク サイズ 32MB の 2048MB のデータの書き込みには 46360ms かかりました。

チャンク サイズが減少するにつれて、書き込みパフォーマンスは直線的に低下します。また、WRITE_THROUGH フラグによってパフォーマンスが低下します

ブリッツコピー:-

1 Gbps NIC、NO_BUFFERING で 60 GB のファイルをコピー

コピーの完了にかかった時間: 2236735 ミリ秒。つまり、37.2 分です。速度は〜97 GB /あたりです。

100 Mbps NIC、NO_BUFFERING で 60 GB のファイルをコピー

コピーの完了にかかった時間: 7337219 ミリ秒。つまり、122分です。速度は~30GB/あたり。

NO_BUFFERING で Async-IO を使用する Jeffrey Ritcher による 10-FileCopy プログラムを使用してみました。でも、結果はイマイチでした。その理由は、チャンクサイズが 256 KB である可能性があると思います... RAID 5 での 256 KB の書き込みは非常に遅いです。

ロボコピーとの比較:

100 Mbps NIC : Blitz Copy と robocopy は、1 時間あたり ~30 GB で実行されます。

1 GBps NIC : Blitz Copy は 1 時間あたり最大 97 GB で、robocopy は 1 時間あたり最大 50 GB です。

于 2010-02-02T08:07:24.160 に答える
0

ハードディスクは、プラッターから来てプラッターに送られるデータをバッファリングすることを覚えておいてください。ほとんどのディスク ドライブは、プラッターの回転を維持し、ヘッドの動きを最小限に抑えるために、読み取り要求を最適化しようとします。ドライブは、ホストをできるだけ早く切断できるように、プラッタに書き込む前にホストからできるだけ多くのデータを吸収しようとします。

パフォーマンスは、PC の I/O バス トラフィックと、ディスクとホスト間のトラフィックにも依存します。「同時に」実行されるシステム タスクやプログラムなど、考慮すべき他の代替要因があります。測定器としての正確な性能を発揮できない場合があります。また、これらのタイミングには、前述のオーバーヘッドによる誤差要因があることに注意してください。

プラットフォームに DMA コントローラーがある場合は、これらを使用してみてください。

于 2010-01-08T22:38:41.853 に答える
0

宛先を書き込まない場合、どのくらいの速さでソース ファイルを読み取ることができますか?

ソースファイルが断片化されていませんか? 断片化された読み取りは、連続した読み取りよりも桁違いに遅くなる可能性があります。「contig」ユ​​ーティリティを使用して、連続させることができます。

http://technet.microsoft.com/en-us/sysinternals/bb897428.aspx

2 台のマシンを接続するネットワークの速度は?

ATTO のように、最初に読み取らずにダミー データを書き込んでみましたか?

一度に複数の読み取りまたは書き込み要求が進行中ですか?

RAID-5 アレイのストライプ サイズは? 一度にフル ストライプを書き込むのが、RAID-5 に書き込む最速の方法です。

于 2010-01-08T05:28:32.050 に答える