RAM점유크기에 의한 노드서버관리
실지 실행중인 노드서버에서 알지못할 이유로 혹은 서버부하를 일으키는 복잡한 로직에 의하여 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]
저의 경험이 여러분께 도움이 되길 바랍니다.
게시글 목록
| 번호 | 제목 |
|---|---|
| 16429 |
기타
html 색상표
1
|
| 16424 | |
| 16423 |
node.js
NODE_JS + Nunjucks 설정
|
| 16412 |
PHP
한글 초성 추출하기
10
|
| 16408 | |
| 16407 |
JavaScript
input text 에 여러 이벤트 걸기 두기.
1
|
| 16401 | |
| 16395 |
JavaScript
Javascript를 최적화하는 13가지 팁
4
|
| 16394 |
JavaScript
URL이 올바른지 체크
2
|
| 16391 |
JavaScript
IE, Edge 브라우저에서는 해당 사이트가 접속이 안되게 하는 코드
2
|
| 16390 |
JavaScript
구글 맵 독도 표기 되도록.
|
| 16389 | |
| 16387 | |
| 16386 |
JavaScript
js playground
|
| 16382 |
JavaScript
javascript에서 php를 호출하여 내용 변경하기
|
| 16381 | |
| 16377 | |
| 16374 | |
| 16372 | |
| 16356 |
기타
기시판 질문입니다.
6
|
| 16355 |
정규표현식
정규식 테스트 연습 편하게
2
|
| 16354 |
정규표현식
제목에 특수문자 정리하는 정규식
2
|
| 16353 | |
| 16347 | |
| 16346 | |
| 16339 | |
| 16338 |
jQuery
체크박스 시프트(shift) 멀티선택
|
| 16332 |
node.js
Node.js MongoDB Drop
1
|
| 16331 |
node.js
여러 데이터 삭제
1
|
| 16330 |
node.js
Node.js MongoDB 삭제
|
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기