C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: HDD書き込み遅延


(過去ログ 116 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■68506 / inTopicNo.1)  HDD書き込み遅延
  
□投稿者/ まーる (1回)-(2013/10/24(Thu) 17:27:24)

分類:[Windows 全般] 

2013/10/24(Thu) 17:36:58 編集(投稿者)

はじめまして。
お世話になります。

環境:Windows7、VisualStudio2005、C++、HDDはNTFS

512KBのデータを60ms間隔で2時間、ファイル出力するプログラムを作成しています。
(ファイル名は出力する直前にGetLocalTime()で取得したミリ秒までの値をファイル名としています)

60ms間隔なので、1000/60ということで、1秒間に16ファイル、
ファイル出力の処理にかかる時間を考慮して15ファイルは出力できるだろうなと考えていたのですが、
実際には、ほとんどは1秒間に15、16ファイル出力しているのですが、
開始からしばらくしてから1秒間に13や12ファイルといったように
15を下回る時間が散見されるようになってきました。この凹み状態の箇所は、
ほぼ一定間隔(十数秒)で現れているように見受けられます。
ファイルOPEN、ファイルWRITE、ファイルCLOSEの前後にGetTickCount()を置いて、
かかっている時間を確認したところ、凹み状態の時間では、ファイルOPEN(ごく稀にファイルWIRTE)に
時間がかかっていることが分かりました。
このように、一定間隔でコマ落ち?のような現象が発生する原因はどのようなものがあるでしょうか?
HDDへのアクセスに関する部分に問題があるのでしょうか?(たとえば、シーク時間とか?ファイルシステムの管理情報とか?)

長文、乱文で申し訳ありません。
どうぞ、よろしくお願いします。


引用返信 編集キー/
■68509 / inTopicNo.2)  Re[1]: HDD書き込み遅延
□投稿者/ オショウ (94回)-(2013/10/24(Thu) 18:04:14)
> 512KBのデータを60ms間隔で2時間、ファイル出力するプログラムを作成しています。
> (ファイル名は出力する直前にGetLocalTime()で取得したミリ秒までの値をファイル名としています)

  なかなかハードいじめな仕様ですネ!
  PCとHDDの性能にモロに依存していると思います。

  HDDへのライト動作は、一番時間を要します。
  通常、遅延書き込みは、5秒程度だったと思いますので・・・

  512KB * 16 * 5 = 約40MB

  実際にはOSのキャッシュに十分入るサイズですが・・・OSはそれ以外
  の仕事もしているので、すべてをアプリでぶんどることはできません。

  通常、遅延書き込みを嫌うならキャッシュさせない方法で書き込みで
  きますが、おそらくもっと少ないファイル数になると思います。

  2時間行うということですので

  512 * 16 * 60 * 60 * 2 = 約60GB

  HDDに書くかわりに、SSD を搭載してそこに書き込むようにすれば、
  書き込み時間は短縮されますので、数が少なるなることは低減でき
  ると思います。

  あとは、60ms間隔と言う部分ですネ!
  ハードウェアタイマーとか割り込み使ってサイクリックな動作を行う
  ようなプログラム構造ですか?
  それとも無限ループ作って、Sleep(60)とかしてますか?
  この場合は、ハードウェアタイマー使って割り込み動作でサイクリッ
  クな動作にしないと、CPUの負荷変動でSleepから指定時間内に復帰し
  てこなくなる為、当然、書き込みファイル数は少なくなります。

  あと、その書き込む機能をスレッドにして優先順位を高くするとか・・・
  より優先度を獲得したいなら、Windowsサービスにするとか・・・

以上。参考まで
  
引用返信 編集キー/
■68516 / inTopicNo.3)  Re[2]: HDD書き込み遅延
□投稿者/ まーる (2回)-(2013/10/25(Fri) 10:56:40)
No68509 (オショウ さん) に返信

回答ありがとうございます。
参考にさせていただきます。

>
>   HDDへのライト動作は、一番時間を要します。
>   通常、遅延書き込みは、5秒程度だったと思いますので・・・
>
>   512KB * 16 * 5 = 約40MB
>
>   実際にはOSのキャッシュに十分入るサイズですが・・・OSはそれ以外
>   の仕事もしているので、すべてをアプリでぶんどることはできません。
>
HDDへのライト動作は一番時間を要するということですが、その内訳のようなものはわかるでしょうか?
今回、一応、途中まではほぼ一定のファイル数をかけていたのが、突然、書き込みに時間がかかって、
また一定のファイル数を書けているという状況が見受けられるわけで、その理由が、

例えば(素人考えですが)、HDDにおいて、ずっと同じ円周に書いていたが、その円周が全て書き終わったから、
一つ内側に書くために、その場所へ移動(シーク?)するのに時間がかかっているとか?

このように突然時間がかかってしまう理由などがわかれば助かります。
よろしくお願いします。

引用返信 編集キー/
■68534 / inTopicNo.4)  Re[3]: HDD書き込み遅延
□投稿者/ Jitta (84回)-(2013/10/25(Fri) 23:12:50)
Jitta さんの Web サイト
No68516 (まーる さん) に返信
 たとえば、次のサイトに、様々なハードディスクのベンチマーク結果があります。
pc.nikkeibp.co.jp/article/special/20080909/1007809/
このように、書き込みは、読み取りに比べて時間がかかります。

 次に、ディスクへのアクセスですが、特定のアプリケーションが常に占有できるわけではありません。
たとえば、次のサイトにある ProcessMontior というツールを実行します。
棚の上に虫眼鏡があるアイコンだけが沈んでいる状態にすると、ファイルアクセスの状態だけがレポートされます。
どれくらいのアクセスがあるか、見てみてください。
technet.microsoft.com/en-us/sysinternals/bb896645


> 512KBのデータを60ms間隔で2時間、ファイル出力するプログラムを作成しています。
> 60ms間隔なので、1000/60ということで、1秒間に16ファイル、
> ファイル出力の処理にかかる時間を考慮して15ファイルは出力できるだろうなと考えていたのですが、
> 実際には、ほとんどは1秒間に15、16ファイル出力しているのですが、
> 開始からしばらくしてから1秒間に13や12ファイルといったように
> 15を下回る時間が散見されるようになってきました。

 ここの仕様は、どうなっているのでしょうか。
 60ミリ秒ごとに512KBのファイルを作るのでしょうか。
それとも、ファイルを作ってから60ミリ秒後に次のファイルを作るのでしょうか。
「60ms間隔で」というと、「以前のファイルの作成が完了していなくても、作り始めるトリガーは60ミリ秒ごとに発生する」のように思えます。
よって、1000/60=16.666…ですから、1秒間に16ファイル以上作成できないなら、性能未達です。
「ファイル作成後、60ミリ秒開けて次のファイルを作る」なら、「そんなもんやろ」ですね。

引用返信 編集キー/
■68535 / inTopicNo.5)  Re[1]: HDD書き込み遅延
□投稿者/ 甕星 (21回)-(2013/10/26(Sat) 00:07:59)
No68506 (まーる さん) に返信
> 512KBのデータを60ms間隔で2時間、ファイル出力するプログラムを作成しています。

この時点で無茶な仕様だなと思います。
ファイルを作るというのは、非常に重たい処理なんです。

ファイルを作るためには「管理領域をRead→管理領域にWrite→ファイル本体にWrite→管理領域にWrite」と最低でも4回アクセスする必要があもます。平均シークタイムが20msなら、この時点で80msで、制限時間を超えています。実際にはキャッシュが作用するでしょうけど、それでもWriteの回数は減らせません。3回で60msかかります。ちょっとでも平均シークタイムを超えればアウトです。512KBと言うことは、4KBセクタだと、125セクタに書いているわけで、その間に1回でもシークしたらアウトです。独自のファイルシステムで、ヘッドの移動や回転を直接制御すればあるいは可能かもしれないってレベルの速度要件だと思います。

素直にSSDを使うのが宜しいかと。
引用返信 編集キー/
■68537 / inTopicNo.6)  Re[2]: HDD書き込み遅延
□投稿者/ オショウ (95回)-(2013/10/26(Sat) 10:07:37)
プログラム的にもう少し頑張ってみたいなら・・・
512KBづつ保存にいくのがパフォーマンス的に不利だと思うので
4MBづつ、要は、60msで8回分溜まってから保存させるなら、改
善する可能性は高いと思います。

ただし、データの取得スレッドとデータの保存スレッドは別々に
して、メモリ上にリングバッファを形成しないと、ダメでしょう

こういうケースに使ったことが無いのですが、メモリマップドフ
ァイル(永続化の方)が使えないかナ〜・・・と。

試行錯誤することは重要ですが、ハードウェアの負荷と言うこと
も考慮しないと、闇雲にプログラム作っても無駄になるヨ!

以上。参考まで
引用返信 編集キー/
■68538 / inTopicNo.7)  Re[3]: HDD書き込み遅延
□投稿者/ オショウ (96回)-(2013/10/26(Sat) 10:31:31)
追伸

2.2TBを超えるパーティションがある場合、GTPドライバーが導入されます
が、HDDのドライバーが混在すると、2.2TBパーティションにアクセスしな
くても、パフォーマンスの劣化が発生します。

その辺は、マイクロソフトさんなり、HDDのメーカーなりが改善しないと
どうしようもないのですが・・・

絶版になっている
『WindowsXPフィルタドライバープログラミング』
ISBN4-7741-1666-1
の、第10章には、ファイルアクセスの時間が長時間化する原因と対処が
書かれています。

また、HDDへのDMA転送パラメータ(レジストリ等)で、若干でも改善させ
る方法があります。HDDやドライバーが対応していれば・・・の話ですが

そういう情報も入手して、頑張ってみるのも、よい経験になるかと思います

以上。参考まで
引用返信 編集キー/
■68573 / inTopicNo.8)  Re[1]: HDD書き込み遅延
□投稿者/ まーる (3回)-(2013/10/29(Tue) 09:03:11)
みなさん、回答ありがとうございました。

やはり、無茶な仕様だということを改めて痛感しました。

仕様変更の説得をがんばることにします(汗)

こちらで教えていただいたことも、いい説得材料となると思います。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -