2012-03-30 5 views
4

メモリ内辞書(新しいコンストラクタ(bla、fla、pla)でインスタンス化)を使用するアプリケーションに問題があります。 常駐メモリサイズが〜100-150 Mbsに近づくと、マークコンパクトフェーズは1秒以上かかります。毎秒100メガバイトが1秒以上加算されます。Node.js GCマークコンパクト

動作は、次を実行することによって再現することができます。

node --trace_gc test-memory.js 

test_memory.js:次に

var http  = require('http'), 
    Construct = function() { 
     this.theField = Math.random(); 
    }, 
    storage = []; 

http.createServer(function (req, res) { 
    var i = 100000; 

    while (--i) { 
     storage.push(new Construct()); 
    } 

    res.end('Lots of data generated.'); 
}).listen(1337, '127.0.0.1'); 

カールlocalhostを実行します。いくつかの時間のために1337年に、これを見て:

Scavenge 143.5 -> 143.5 MB, 2 ms. 
Mark-sweep 143.5 -> 143.5 MB, 943 ms. 
Mark-compact 143.5 -> 143.5 MB, 1306 ms. 
Scavenge 143.5 -> 143.5 MB, 2 ms. 
Mark-sweep 143.5 -> 143.5 MB, 937 ms. 
Mark-compact 143.5 -> 143.5 MB, 1189 ms. 
Scavenge 143.5 -> 143.5 MB, 2 ms. 
Mark-sweep 143.5 -> 143.5 MB, 935 ms. 
Mark-compact 143.5 -> 143.5 MB, 1191 ms. 
Scavenge 143.5 -> 143.5 MB, 1 ms. 
Mark-sweep 143.5 -> 143.5 MB, 1015 ms. 
Mark-compact 143.5 -> 143.5 MB, 1218 ms. 
Scavenge 143.5 -> 143.5 MB, 2 ms. 
Mark-sweep 143.5 -> 143.5 MB, 937 ms. 
Mark-compact 143.5 -> 143.5 MB, 1195 ms. 

私は、GCがとにかく解放されないオブジェクトの周りを移動しようとしていると言うことができます。

私が見つけた唯一の解決策は、これらのオブジェクトをバッファに移動することですが、アプリケーションではJSON.stringify | JSON.parseのオーバーヘッドが発生し、CPU時間が長くなる可能性が高くなります。それにはかなりの書き換えが必要です。

私はそれがv8の問題であるかもしれないと理解しますが、リリースされないオブジェクトに対してGCを迂回する方法がいくつかありますか?

Node.jsのバージョンは0.6.11

答えて

1

あなたはRedisのかMemBase値を使用してパフォーマンスを比較しようとしたことがありますか?私が見ることができるように、これはメモリ内のデータベースと見なされるレベルに達します。したがって、実際にこれらを使用して比較することができます。

+0

私はしませんでしたが、私の場合は実行可能ではありません。 不変のデータをキャッシュすると、私はこのように(つまり同期的に)アプリケーションを書くことができます: 'user.item = storage.get( 'Item'、itemId)' 任意の種類の外部ストレージを使用すると、私は非同期のアプローチを使用します。 また、私は問題が多少緩和されるように私のアプリケーションでリークを発見しました。 – Prologus