s

RAM점유크기에 의한 노드서버관리

· 2년 전 · 1105

실지 실행중인 노드서버에서 알지못할 이유로 혹은 서버부하를 일으키는 복잡한 로직에 의하여 RAM점유율이 높아지는 때가 있습니다.

대체로 NodeJS는 GC(쓰레기수집기)가 자동실행되면서 RAM사용을 효율적으로 관리하지만 개발자에 의하여 발생하는 RAM부하를 근본적으로 해결하지는 못합니다.

저는 이 경우 해당 노드서버가 사용가능한 RAM크기를 제한해주고 이 설정값을 넘게 되면 서버를 안전하게 다시 실행하도록 하는 자동스케쥴같은것을 만들게 되었습니다.

먼저 노드서버가 점유하는 RAM의 크기를 얻는 부분을 보겠습니다.

가령 server.js 파일이 있다고 하면 다음의 코드들을 추가해줍니다.

[code]

function usedMemory() {

    var mem = process.memoryUsage();

    var rss = Number((mem.rss / 1024 / 1024 * 100)/100).toFixed(2);

    var heapTotal = Number((mem.heapTotal / 1024 / 1024 * 100)/100).toFixed(2);

    var heapUsed = Number((mem.heapUsed / 1024 / 1024 * 100)/100).toFixed(2);

    console.log(rss + 'MB', heapTotal + 'MB', heapUsed + 'MB');

    return {rss: rss, heapTotal: heapTotal, heapUsed: heapUsed};

}

[/code]

그리고 2초에 한번씩 노드서버가 점유하고 있는 RAM크기를 계산합니다.

[code]

let LIMIT_MEMORY = 1024; // 이 노드서버가 점유가능한 최대 RAM크기 (예에서는 1GB로 설정)

setInterval(function() {

    var mem = usedMemory();

    if(mem.heapTotal >= LIMIT_MEMORY) {

        runGC();

    } else {

        GC_ENABLED = false;

    }

}, 2000); // 2초에 한번씩 RAM점유크기를 가져와 제한된 값보다 크게 되면 runGC()를 실행하기

 

function runGC() {

   // 먼저 서버를 재부팅하기 전에 진행중인 로직들을 안전하게 중지 또는 처리하는 부분삽입

   // process.exit(0); 에 의하여 노드서버를 종료

    setTimeout(function() {

        process.exit(0);

    });

}

[/code]

 

이제는 프로세스가 종료된것을 다시 실행하는것이 필요합니다. 이를 위해서 boot.js코드파일을 만들고 여기서 server.js를 자식프로세스로 실행하도록 합니다.

boot.js 파일의 코드내용은 다음과 같습니다.

[code]

var childprocess = require('child_process');

var child;

 

start_child();

 

setInterval(function() {

    if(child && child.connected === false) {

        start_child();

    }

}, 5000); // 5초에 한번씩 자식프로세스인 server.js상태감시 만일 중지되었으면 다시 실행

 

function start_child() {

    child = childprocess.fork(__dirname + '/index'); // index.js파일을 자식프로세스로 실행   

}

[/code]

마지막으로 boot.js 파일을 실행합니다.

[code]

node boot

이렇게 하면 boot.js가 어미프로세스로 실행되며 server.js는 자식프로세스로 실행되게 됩니다. 만일 어떤 이유로 하여 server.js가 중지되었으면 boot.js는 다시 실행하게 됩니다.

노드서버를 실행할때 옵션으로 메모리크기제한을 줄수 있습니다.

node --max_old_space_size=1024 boot

이렇게 하면 이 노드서버가 점유할수 있는 최대 메모리크기가 1024Byte로 됩니다.

[/code]

저의 경험이 여러분께 도움이 되길 바랍니다.

|
댓글을 작성하시려면 로그인이 필요합니다.

개발자팁

개발과 관련된 유용한 정보를 공유하세요. 질문은 QA에서 해주시기 바랍니다.

+
분류 제목 글쓴이 날짜 조회
2년 전 조회 1,923
2년 전 조회 1,600
2년 전 조회 2,103
2년 전 조회 2,073
2년 전 조회 1,793
2년 전 조회 2,111
2년 전 조회 1,521
2년 전 조회 2,196
JavaScript 3년 전 조회 2,035
3년 전 조회 1,803
3년 전 조회 1,715
2년 전 조회 1,854
기타 2년 전 조회 1,169
JavaScript 2년 전 조회 1,434
node.js 2년 전 조회 1,106
JavaScript 2년 전 조회 1,997
PHP 2년 전 조회 1,228
node.js 2년 전 조회 1,064
node.js 2년 전 조회 1,638
PHP 2년 전 조회 2,160
MySQL 2년 전 조회 1,544
PHP 2년 전 조회 2,494
JavaScript 2년 전 조회 1,342
기타 2년 전 조회 3,491
기타 2년 전 조회 1,035
node.js 2년 전 조회 1,455
JavaScript 2년 전 조회 1,933
node.js 2년 전 조회 1,136
node.js 2년 전 조회 2,126
node.js 2년 전 조회 1,763