node.js에 대한 올바른 "max-old-space-size"를 어떻게 결정합니까?


100

Node.js가 매개 변수를 기반으로 작동하는 방식을 이해하는 데 문제가 max-old-space-size있습니다.

예를 들어 제 경우에는 두 개의 t2.smallAWS 인스턴스 (2GB RAM)를 실행하고 있습니다.

이유는 모르겠지만 설정했습니다 max-old-space-size=4096(4GB). 이 경우 노드는 무엇을합니까? 이 구성으로 인해 메모리 할당 실패가 발생할 수 있습니까?

max-old-space-size서버 리소스 를 기반으로 올바른 값을 어떻게 결정 합니까?

내 응용 프로그램은 지속적으로 메모리 사용량을 증가시키고 있으며 노드 내부에 대한 모든 것을 이해하려고 노력하고 있습니다.


8
나는 이것이 많이 조용 해지고 있다는 것을 알기 때문에 코멘트를 추가하고 있습니다. NodeJS 앱에 메모리 누수가 없었지만 가비지 수집기는 시작되지 않았다는 사실을 깨닫는 데 일주일이 걸렸습니다. t2.micro 또는 t2.small 인스턴스와 같이 메모리가 부족한 시스템에서이 점에 유의하십시오. 사용할 수없는 RAM으로 인해 서버가 충돌합니다.
Borjante

가비지 수집기를 작동시킬 수있는 방법이 있었습니까?
ZG101

@Borjante 왜 가비지 수집기가 실행되지 않았습니까?
하나님의

2
구성된 max-old-space-size는 시스템에있는 총 RAM 양보다 더 높은 제한을 가졌습니다.
Borjante

--optimize-for-size메모리 사용량을 줄일 가치가 있습니다.
콘스탄티노스

답변:


135

"오래된 공간"은 V8의 관리 (가비지 수집) 힙 (즉, JavaScript 객체가있는 위치)에서 가장 크고 구성 가능한 섹션이며 --max-old-space-size플래그는 최대 크기를 제어합니다. 메모리 소비가 한계에 가까워지면 V8은 사용하지 않는 메모리를 해제하기 위해 가비지 콜렉션에 더 많은 시간을 소비합니다.

힙 메모리 소비 (예 : GC가 해제 할 수없는 라이브 개체)가 제한을 초과하면 V8은 프로세스를 중단 시키므로 (대안이 부족하여) 너무 낮게 설정하고 싶지 않습니다. 물론 너무 높게 설정하면 V8이 허용하는 추가 힙 사용으로 인해 전체 시스템의 메모리가 부족해질 수 있습니다 (대안이 부족하여 임의 프로세스를 스왑하거나 종료).

요약하면, 2GB의 메모리가있는 컴퓨터 --max-old-space-size에서는 다른 용도로 일부 메모리를 남겨두고 스와핑을 피하기 위해 약 1.5GB로 설정했을 것입니다 .


6
이것이 바로 시스템이나 노드가 메모리가 부족한 경우를 설명하는 대답을 얻고 자했던 것입니다.
Borjante

2
@jmrk : 당신이 완전히 옳은 것 같지만 2GB RAM과 4GB 스왑을 사용하고 "--max-old-space-size"를 4GB로 설정하면 노드 프로세스가 모든 RAM 메모리를 소비하고 1.9GB에 고정됩니다. 질문은 "왜 스왑이 사용을 피하는가?"입니다 (노드 버전 8.11.1)
Manish Trivedi

1
플래그는 다른 모든 것을 재정의해야합니다. 오타를 다시 확인하세요.
jmrk

2
에서 d8 --help:--max-old-space-size (max size of the old space (in Mbytes))
jmrk

21

2020 업데이트

이러한 옵션은 이제 노드에서 공식적으로 문서화됩니다 . 2GB 컴퓨터의 경우 다음을 사용해야합니다.

NODE_OPTIONS=--max-old-space-size=1536

사용할 양을 결정하려면을 사용 하여 Linux 시스템에서 사용 가능한 메모리를 확인할 수 있습니다 free -m. 참고이를 사용할 수 freebuffers/cache같은 메모리가 결합 buffers/cache폐기 할 수 있습니다 (이 버퍼 캐시 그렇지 않으면 사용하지 않는 메모리를 사용하는 것이 좋은 방법입니다).

또한 언급 된 공식 문서max-old-space-size 참고하십시오 .

2GB 메모리가있는 시스템에서는 1536 (1.5GB)으로 설정하는 것이 좋습니다.

따라서 위의 값입니다. 기본 OS에 필요한 메모리 양은 많이 변하지 않으므로 4GB 시스템 등에서 3.5를 행복하게 수행 할 수 있습니다.


2
Node.js 문서에서 공유 한 링크에서 "메모리가 2GB 인 시스템에서 이것을 1536 (1.5GB)로 설정하는 것을 고려하십시오."
Idan Dagan

1
@IdanDagan 감사합니다. 대답에 추가하겠습니다.
mikemaccana

11

이 오류는 실행중인 응용 프로그램에 할당 된 메모리가 필요한 메모리보다 적을 때 발생합니다. 기본적으로 Node.js의 메모리 제한은 512MB입니다. 이 양을 늘리려면 메모리 제한 인수를 설정해야합니다 —-max-old-space-size. 메모리 제한 문제를 방지하는 데 도움이됩니다.

node --max-old-space-size=1024 index.js #increase to 1gb
node --max-old-space-size=2048 index.js #increase to 2gb
node --max-old-space-size=3072 index.js #increase to 3gb
node --max-old-space-size=4096 index.js #increase to 4gb
node --max-old-space-size=5120 index.js #increase to 5gb
node --max-old-space-size=6144 index.js #increase to 6gb
node --max-old-space-size=7168 index.js #increase to 7gb
node --max-old-space-size=8192 index.js #increase to 8gb

https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c


그것은 더 할당 램 메모리보다이어야한다
.. HD

더 이상 이것이 사실인지 잘 모르겠습니다. 확실히 하나의 시스템에서 실행중인 노드 10.20.1에 액세스 할 수 있습니다. node --v8-options보고 된 기본값이 4096이고 max-old-space-size실행중인 테스트 스위트 를 설정하지 않고도 문제없이 최대 1.5Gb가 할당된다는 것을 알 수 있습니다. 링크 된 중간 기사는 2016 년에 작성되었으므로 작성된 이후로 진행된 것 같습니다.
JaySeeAre

1
그것에 대한 확증을 찾기가 어렵습니다. V8 또는 Node에 대한 문서에서 명시적인 것을 찾을 수 없습니다. 내가 v10, 12 및 14의 기본값을 0으로보고 한 또 다른 시스템입니다. FWIW 저는 최대 메모리를 1.5Gb ( tejom.github.io/general/nodejs/v8/debugging/2017/ 01 / 16 /… ) v12에는 시스템 ( idginsiderpro.com/article/3257673/… )을 기반으로 한 동적 최대 값이 있습니다.
JaySeeAre

4
node -e "console.log(`node heap limit = ${require('v8').getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)"-> v12.18.0 및 v14.3.0-> 2096Mb, v10.20.1-> 1432Mb
JaySeeAre

2
@JaySeeAre는, 그 명령에 대한 감사가를 표시합니다 heap_size_limit. 일반적인 UNIX 셸의 경우 다음과 같이 다르게 인용해야합니다.node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'
Sam Watkins

-9

작업중인 프로젝트에서 작동하도록하려면 다음 두 단계를 따르십시오.

  1. 프로젝트에서 node_module / @ angular cd node_module / @ angular

  2. 이제 아래 명령을 실행하십시오 export NODE_OPTIONS =-max-old-space-size = 8192


18
환경 변수를 설정하기 위해 @angular 디렉토리로 이동해야하는 이유는 무엇입니까?
mgamsjager
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.