WindowsXP
LANDisk IOData HDL F series 250G,320G
Java プログラム JDK 1.5.0で作成したもの
Javaプログラムは概略以下のような動作をします。
・多数のファイルをR/Wする。Wは一ファイルのものもあり。
・一時にopenするファイルは一つのみ。
・ファイルのCloseはきちんとしている。
・ガベージコレクションを定期的に行っている。だいたいファイルのRead数百回ごと。
そして他のマシンからLANDiskへのアクセスもあり、それなりに多い。
これで次のような現象が発生する。
最初は、R/Wの速度が速い(←しかしLocalDiskよりはかなり遅い)、しかし数千(?)ファイルR/W後は、R/Wの速度が非常に遅くなる。体感的には数十倍の時間がかかる。いくつかのプログラムがありますが、どれも同じような現象が発生します。
R/Wの速度が遅くなる原因はわかりますでしょうか。OS、LANDisk、Javaプログラムのどれに原因がありますか?対策は?
LANDISKの中身はLinuxが載っている。
LANDISKが原因では?
最初はメモリー上のキャシュで処理するので
速い。
直ぐにメモリが足りなくなり。ジャーナル処理
kupdateの書き込みタイミングで止まったり
、書き込みが完了しないので処理が間に合わ
なくなり遅くなる。
ファイルも沢山作るとディレクトリーが
キャシュされ空きメモリー減少する。
CPU ARM9コア/162MHz 64MバイトRAM
http://plusd.itmedia.co.jp/pcupdate/articles/0602/22/news064.htm...
http://landisk.kororo.jp/debian/different.php
対策なのかな?
(1)1つのフォルダーに沢山ファイルを作らない。
(2)ウイルス対策ソフトを一時的にとめてみる
要因はいくつか考えられます。
まず、LANDISKでは、Windowsクライアント向けのファイルサービスに
SMBを使っていますので、XP側に下記の問題があるかも知れません。
http://support.microsoft.com/kb/814112/
これでも解決しない場合ですが、今までいくつかのLAN-HDDものを使って
きた経験では、同時にハンドリングするファイル数が500個を超えるあたり
から、いきなり時間がかかるようになります。おそらくは、LAN-HDDのOS
(Unix系列)のファイルシステムの問題だとは思うのですが…
プログラム側で、一度の処理を500ファイル程度に制限するしてみては
いかがでしょうか? あるいは、クライアントのXP側のファイルバッファを
大きくするかですが…
こういった性能問題の場合、
GCが解放されているメモリのサイズが少なく、
Full GCを頻発させるものの、
処理を継続するために必要が空きメモリが一向に確保できず
処理が停滞する
という事が原因であることが多いと思います。
未確認であれば
GCを定期的に行っている、とのことですが、
十分に解放できているか確認するのが良いと思います。
もし上記のことが原因である場合、
VMに割り当てるメモリの量を増やすのが手っ取り早い方法です。
それでは解決しない場合には、
GCで解放されるメモリの量が増えるように
変数のスコープ、初期化(データ参照の放棄)タイミングを
見直すか、または、一定のデータ量ごとに処理を行うように
ロジックを変更する必要があると思います。
いずれも貴重なご回答ありがとうございます。
言い忘れました。
Javaは -mx1024Mで起動。←heap maxが1024M。
マシンはメモリ256M,768M,1Gで実行。
タスクマネージャで見るとメモリは500M程度を消費(←全体で)
256Mの場合も、スラッシングはおきていないようです。
ご回答を参考に改良します。ありがとうございました。