실지 실행중인 노드서버에서 알지못할 이유로 혹은 서버부하를 일으키는 복잡한 로직에 의하여 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]
저의 경험이 여러분께 도움이 되길 바랍니다.
게시글 목록
| 번호 | 제목 |
|---|---|
| 17523 | |
| 17516 | |
| 17515 | |
| 17514 |
PHP
PHP 배열순설정
1
|
| 17498 |
PHP
PHP로 PDF파일 다루기
4
|
| 17493 | |
| 17490 | |
| 17487 | |
| 17485 |
JavaScript
jQuery없이 네티브자바스크립트로 서버에 요청보내기 7 - JSONP
5
|
| 17481 |
JavaScript
jQuery없이 네티브자바스크립트로 서버에 요청보내기 6- CORS
1
|
| 17478 |
JavaScript
jQuery없이 네티브자바스크립트로 서버에 요청보내기5- 파일업로드
1
|
| 17477 | |
| 17474 | |
| 17473 |
JavaScript
jQuery없이 네티브자바스크립트로 서버에 요청보내기4 - JSON
|
| 17472 | |
| 17470 |
JavaScript
jQuery없이 네티브자바스크립트로 서버에 요청보내기2 - POST
|
| 17469 |
JavaScript
jQuery없이 네티브자바스크립트로 서버에 요청보내기1 - GET
2
|
| 17463 |
JavaScript
express로 간단한 부트스트랩 내비게이션 메뉴 생성기(아주 쉬움)
|
| 17462 | |
| 17461 |
PHP
PHP로 채트서버 만들기
|
| 17460 |
JavaScript
ThreeJS로 3디 지구 만들기
|
| 17458 | |
| 17457 |
PHP
PHP 랜덤생성하기
|
| 17454 | |
| 17453 |
MySQL
DB백업코드
5
|
| 17448 |
JavaScript
숫자에 천단위로 콤마(,) 찍기
11
|
| 17447 | |
| 17446 | |
| 17445 | |
| 17444 |
node.js
nodejs 에서 CSV파일 파싱하여 배열로 변환하기
|
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기