LabVIEW で高速にストレージ - ベンチマークの巻

前回まででストレージの高速読み書きが完了しました。

では一体何を持って完了とするのか?

まずは、

    1. ベンチマークとの乖離を出来る限り少なくする
    2. ストレージのスペック上の転送レートとの乖離を出来る限り少なくする
      の2つを基準にして、納得できる目標に達成したかどうかを見極めました。
    なお RamDisk / RAID とも読み書きは、1分間連続して行なったもので、出来るだけキャッシュの影響(キュー) をなくしています。

一度に読み書きするデータサイズ

と、その前にデータサイズの関連を整理しておきます。

HDDにデータを書き込む際にはセクタ単位でデータを書き込みます。で、1セクタは通常 512バイトです。1バイトを書き込むのも、512バイトを書き込むのも1セクタ分の書き込み時間がかかるので、同じ時間で書き込めます。

と言うことは 1セクタで割り切れるデータ量を書き込むのが一番高速なわけです。

例えば 513バイトずつ書き込むと、2セクタ分の書き込み時間がかかるため効率が良くありません。

(※実際には OS のキャッシュなどあるから、そう簡単な計算じゃないと思うけど)

で、今回 LabVIEW で書き込むデータは U64 配列なので、

1セクタ == 512バイト == (512 / 8 (U64) ) = 64ヶ単位で U64 を書き込む

のが一番効率が良さそうです。

と言うわけで以下のベンチマークでは、1度のデータの読み書き個数を64ヶの倍数で測定しました。

RamDisk 上の転送レート

まずは高速な方から行きます。

CrystalDiskMark では私のメインマシンの RamDisk のレートは以下のようになっています。

Write で 5GB/sec 近く出ているのは驚きですね。

clip_image001

RamDisk 上での読み込みレート

ではこのベンチマークにどの程度近づいたでしょうか?

じゃーん。

ベンチマークを上回りました!4640.91MB/sec です!

LabVIEW 早いじゃん!

clip_image002

clip_image003

あ、ちなみにこの数値はまっとうな値じゃないです。

というのもメインマシンの RamDisk は 2GB の容量。どんどんデータを書いていったら直ぐにあふれてしまいます。

このベンチマークではデータを書いたらファイルポジションをファイルの先頭に戻しています(ファイルの位置を設定関数で) これで再帰的に書き込むことで、ディスク溢れを防止しています。

と言うわけで正確な値ではないですが、まあ良しとします。

RamDisk 上での書き込みレート

次は書き込みです。

これは 4088.54MB/sec と言うことで、ベンチマークには及びませんでしたが相当早いレートで書き込めています。

clip_image004

clip_image005

RAID 上の転送レート

いよいよ本番の RAID 上の転送レートに行きます。

今回使っている RAID は NI HDD-8264 相当品で、カタログスペック上では 600MB/sec の転送レートが出ると謳われています。

clip_image006

こちらがベンチマークの結果。

Read はカタログスペック通りですが Write が少し落ちています。が、かなりカタログスペックに近づいている良い値ではないでしょうか。

clip_image007

RAID 読み込みレート

では RAID で読み込みを試してみます。

やったー!!

カタログスペックに近い 593.97MB/sec を達成しました!ベンチマークに若干負けましたが、誤差の範囲でしょう。

clip_image008

clip_image009

RAID 書き込み

さあ書き込みはどのくらい出るでしょうか?

571.2MB/sec。ベンチマークを超える数値が出ました。

image

clip_image011

まとめ

LabVIEW でも正しくプログラミング&データサイズを指定して実行することで、カタログスペックに近い転送レートが出ることが分かりました。

今回はテスト的な VI を作成してベンチマークしましたが、実際には SCOPE から取得したデータを書き込んだり、データを加工しながら書き込んだりすると思います。

このようなときは如何に CPU 負荷を高いスレッドと、ストレージと読み書きするスレッドを分けるかが肝になると思います(あたりまえですが)

と言うわけでストレージの件、一件落着。

コメント