RAM점유크기에 의한 노드서버관리 > 개발자팁

개발자팁

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

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

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

본문

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

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

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

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

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


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};
}

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


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);
    });
}

 

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

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


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파일을 자식프로세스로 실행   
}

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


node boot
이렇게 하면 boot.js가 어미프로세스로 실행되며 server.js는 자식프로세스로 실행되게 됩니다. 만일 어떤 이유로 하여 server.js가 중지되었으면 boot.js는 다시 실행하게 됩니다.
노드서버를 실행할때 옵션으로 메모리크기제한을 줄수 있습니다.
node --max_old_space_size=1024 boot
이렇게 하면 이 노드서버가 점유할수 있는 최대 메모리크기가 1024Byte로 됩니다.

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

추천
0

댓글 0개

전체 5,352
개발자팁 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT