• 締切済み

RAID0に高速で書き込む方法(補足)

VC++を使って、Windows2000,XPのプログラムを作成しています。 現在、1秒間に70MB程度のデータを書き込む必要があり、RAID0を使っているのですが、RAID0を使っていない、普通のハードディスクの方が書き込みが早いです。 方法としては、 CFile::SetLengthでファイルの大きさを決めて CFile::Writeで書き込んでいます。 RAID0に高速書き込みする方法があれば、教えてください。よろしくお願いします。 使っているマシンのスペックは低くありません。 CPUは2GのXEONが2つついています。 HDBENCHというベンチマーク用ソフトウエアでRAID0のハードディスクを確認したところ、100000KB/sec以上の結果が出ました。 しかし、なぜか私の作ったプログラムでは、RAID0を使っていないHDで、ベンチマークの結果も50000KB/sec程度のHDの方が結果が良かったです。 書き込みブロックも変更して試したのですが、良い結果は出ませんでした。 現状の感じとしては、RAID0に書き込むと、遅延書き込みが起きているけれど、RAID0でない場合は、遅延書き込みの頻度が少ない感じがします。 書き込むたびに、CFile::Flushを呼ぶことで遅延書き込みはなくなるのですが、書き込みは早くありませんでした。

みんなの回答

noname#30727
noname#30727
回答No.4

Win32API の CreateFile と WriteFile を使って、書き込む単位を何種類か(64K、1M、10Mくらい)で計測してみてはどうでしょう。 ソースが公開されていないベンチマークの結果は参考にしかなりません。

kosyoudai
質問者

お礼

確かにソースが公開されていないと、何をやっているんだかわかりませんね。 私が使っているCFile::Writeの中は、下記です。 void CFile::Write(const void* lpBuf, UINT nCount) { ASSERT_VALID(this); ASSERT(m_hFile != (UINT)hFileNull); if (nCount == 0) return; // avoid Win32 "null-write" option ASSERT(lpBuf != NULL); ASSERT(AfxIsValidAddress(lpBuf, nCount, FALSE)); DWORD nWritten; if (!::WriteFile((HANDLE)m_hFile, lpBuf, nCount, &nWritten, NULL)) CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName); // Win32s will not return an error all the time (usually DISK_FULL) if (nWritten != nCount) AfxThrowFileException(CFileException::diskFull, -1, m_strFileName); } 結局WriteFileを使っていました。また、書き込む単位も、クラスターの倍数でいろいろ試してみたので、他に何か問題があるかもしれないと思ってます。 とりあえず、自分がテストしたソースを公開してみます。

  • hssh
  • ベストアンサー率24% (12/49)
回答No.3

#2には、誤字がありましたね。失礼しました ・普通のHDDとRAID用のHDD[は]同型品ですか? ですね RAIDのHDDのキャッシュが少ないのですね。 まあそれでもベンチマークではRAIDの方が早いので影響はないようですね さて、 テストプログラムでは、クラスターの大きさのメモリの書込みということですが 実際はどうやっておられるのでしょうか 小さすぎる可能性はないでしょうか? 他に考えられる原因は、 HDDが異なる型の場合には、たまに同期がとれなくて余分に時間がかかる場合がありますが ベンチマークの結果からしても、そうではないようですね それ以外にRAIDに影響が多い場合というと、ランダムアクセスでは遅くなる可能性はありますが、 大丈夫でしょうか? RAID上には、出力データだけでプログラムファイルなどは無いのですよね? 構成と入力データを聞いたのは、たとえば入力データがRAID上にある場合だと、 今回のような現象がおきる可能性があるためです メモリ上のデータを書き込んでいるのならば、そうではないようですが。 上記で原因が判明しない場合には、 テストプログラムのソースを出せば、他のひとからもっとレスが得られる気がします

kosyoudai
質問者

お礼

ありがとうございます。 テストプログラムを出してみます。

  • hssh
  • ベストアンサー率24% (12/49)
回答No.2

C++は遅いとはいえ、同じプログラムでRAID0が遅いのはおかしな現象ですね ・機器構成(HDDの接続やメモリなど)はどうなっていますか? ・普通のHDDとRAID用のHDDの同型品ですか? 仕様は? ・比較試験の入力元データは何でしょうか?

kosyoudai
質問者

お礼

>・普通のHDDとRAID用のHDDの同型品ですか? 仕様は? 違います。ベンチマークの結果、HDのキャッシュが多い方が書き込みが早かったので、普通のHDDというのには、キャッシュが8Mのものを使っています。 >・比較試験の入力元データは何でしょうか? このデータは何にしても変わりありませんでした。 例えば、テストプログラムで、クラスターの大きさのメモリを確保して、ループを回してそれを書き込んだ場合も、RAID0の方が遅かったです。 HDBENCHというソフトウエアでの書き込みが毎秒100MBを超えているので、構成が悪いとはどうしても思えません。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

RAIDにはソフトウェアRAIDとハードウェアRAIDがありますが、貴殿の環境はソフトウェアRAIDなのではないでしょうか? もし、ハードウェアRAIDであれば、キャッシュの設定(遅延書き込みの有無など)とかが出来る可能性がありますよね。 また、複数のハードディスクを別のバスに繋げ、RAIDチップが制御することでRAID0の高速化が望めるのだと思います。 例えば、IDEのハードディスクを一つのケーブルでプライマリーとオルタネートのように繋いで、ソフトウェアRAIDでRAID0では、高速化は望めないどころか、低速になってしまうのではないでしょうか?

kosyoudai
質問者

お礼

下記のRAIDカードを使用しています。 3ware Escalade 7000 Series ATA RAID Controller ベンチマークソフトでは、結果が出ているので、自分のプログラムが最適化されていないか、問題があるように感じています。

kosyoudai
質問者

補足

”遅延書き込み”と書いたのは、私(質問者)の勘違いでした。 プログラムにバグが存在していました。 結局のところ、ただ、書き込みが遅くなっているというのが現状です。RAID0を使えば、ただ書き込みが早くなると思ったのに。。。

関連するQ&A