2012-03-30 2 views
4

메모리 내장 사전을 사용하는 응용 프로그램에 문제가 있습니다 (새 생성자 (bla, fla, pla)를 통해 인스턴스화). 상주 메모리 크기가 ~ 100-150 Mbs에 도달하자마자 마크 컴팩트 단계가 1 초 이상 걸립니다. 백 메그마다 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'); 

그런 다음 컬 로컬 호스트를 수행 얼마 동안 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 오버 헤드가 많은 CPU 시간이 될 가능성이 높은 JSON.parse 오버 헤드가 발생합니다. 게다가 상당한 재 작성이 필요합니다.

더 많은 v8 문제가있을 수 있지만 출시되지 않을 개체에 대해 GC를 우회하는 방법이있을 수 있다는 것을 알고 있습니까?

Node.js를 버전은 0.6.11

답변

1

당신이 레디 스 또는 Membase를 사용하여 성능을 비교하는 시도 해 봤나입니까? 내가 볼 수 있듯이 메모리 내 데이터베이스로 간주 될 수있는 수준에 도달하므로 실제로 이들 중 하나를 사용하여 비교하려고 할 수 있습니다.

+0

나는 그렇지 않았지만 내 경우에는 실행 가능하지 않을 것이다. 요컨대 불변의 데이터를 캐시하면 다음과 같이 (즉, 동 기적으로) 내 응용 프로그램을 작성할 수 있습니다 : 'user.item = storage.get ('Item', itemId)' 어떤 종류의 외부 저장소를 사용하면 비동기 방식을 사용합니다. 또한 앱에서 누출이 발견되어 문제가 다소 완화되었습니다. – Prologus