ネットワークドライブ上でrar xしてたら、途中でNTFSじゃにゃいので強制終了とか出て、ドライブが見えにゃくにゃる。
pingは通るが鯖上の他の共有類は無反応。
コンソールログオンしようとしたら、ログオン画面が出ず。
リセットしたらRAIDドライブの1つでchkdskが走る。
やば〜・・・
ただし何のエラーも出ず。
至極無事に起動し、イベントそこらにも何ら異常にゃし。
ただ、件の時間にNTFSが壊れたエラーが記録されていた。つまりRAID板の問題だと思われる。
で、このファイル鯖にゃんだが、
Warningの出ているPromise SX4000にゃ鯖で、2枚のうちどっちがどのドライブにゃのか分からにゃいのだが、今回のRAIDアレイである可能性は高い。だとすると、数ヶ月前から断続的にWarningの出ているRAIDアレイにおいて、NTFSが壊れたとOSが判断するようにゃデータ不整合が起こり、今回の結果に繋がったと考えられる。・・・至極当然だにゃ。
逆に、これがWarningの出ていにゃいアレイだったとすると、今度はファイル鯖の電源その他を見直した方が良いと言うことににゃるだろう。
何にせよ気温も高いし、かにゃり危険にゃ状態だと言える。
と書いておいて多分あと1回くらい平気で無視して使うんだと思う(笑)
ajaxで定期的に鯖から何かget、とかさせていると、そのたびに4K〜16Kほどのメモリを食って、離さにゃい気がする@IEの件で、とりあえず何とかにゃったのでメモ。
まずリークする場合の、激しく簡略化したソース。
function post2(arg){
var req = new ActiveXObject("Msxml2.XMLHTTP");
req.onreadystatechange = function(){
if(req == undefined) { return 9; }
if(req.readyState != 4) { return 4; }
if(req.status != 200) { return 2; }
window.status = "ok";
setTimeout('post2()',1000);
}
req.open("POST", "./?mode=test", true);
req.send("test"+arg);
}
よくそこらへんで紹介されてる方法にゃんだが、reqが開放されずに残るのよね。にゃのでしばらく放置しておくとIEの使用メモリが50Mとかににゃってたりする。
ので、使用後(ここではsetTimeoutの後とか)にreq = null;しにゃければにゃらにゃい。
こんにゃメモリ管理はお任せのつもりだったので、身近にゃ低機能言語としてマーク。うーん、そりゃまぁ使わにゃくにゃったかどうかの判定て難しそうだけど、ダメにゃ場合はダメとリファレンスに大きく載せておくべきだと思うにゃぁ。読んだこと無いけど。ページ丸ごと書き換え〜とかしてると数k単位どころか1M単位で使用メモリが増加するんでは無かろうか。
あと、こういう単純にゃ構造にゃらreq = nullを1つ入れれば解決にゃんだが、もっと構造がぐちょってたり、DOM関連で入れ子してたりするとたぶんこの程度では無理と思われる。再帰で
for(var x = obj.length;x--;){
obj[x] = null;
delete obj[x];
}
して末端までnullで埋めたり、グローバル変数を
var n=乱数;
eval("TMP_"+n+"=obj");
で確保しておいて、nを参照せずにそのまま受け渡すとか(笑)
いろいろダメっぽい解決法を考えてみたが非常にアレにゃので、おしえておねがいさみあドン。
さらにメモだが、上と関係にゃいところで基本的ハマり要素として、
X=[];
n=5;
X[n]=0;
X[n]=null;
delete X[n];
とかしても、X[n]が確保したメモリは解放されにゃい。検証してにゃいけど、一度確保した連想配列は開放されにゃいというか何というか。よって、perlのハッシュのように用いるとえらいことににゃる(笑)
上の変数reqをグローバルにゃ配列に作っちゃえば安易に消せるだろうと思って組んだら、配列Xそのものを消さにゃいとメモリ解放されにゃかったりしてハマったわけで。
しかも、この手の配列を参照するときに線形検索してるようにゃ気がする。よくわからんが変に遅い。もうめんどくさいからperlのハッシュ機構載せてくれと。
それにしてもこの問題、根が深いにゃぁ。IEが単にダメってことだと思うけど、例えばgoogle newsを1週間くらい開いていたIEって数百Mもメモリ食ってるわけで、根本的にゃところでやばいことが起きてそうにゃ気がする。