[javascript] Node.js 힙 메모리 부족

오늘은 파일 시스템 인덱싱을 위해 스크립트를 실행하여 RAID 파일 인덱스를 새로 고치고 4 시간 후에 다음 오류와 함께 충돌했습니다.

[md5:]  241613/241627 97.5%
[md5:]  241614/241627 97.5%
[md5:]  241625/241627 98.1%
Creating missing list... (79570 files missing)
Creating new files list... (241627 new files)

<--- Last few GCs --->

11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9 / 0 ms [allocation failure] [GC in old space requested].
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9 / 0 ms [allocation failure] [GC in old space requested].
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5 / 0 ms [last resort gc].
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6 / 0 ms [last resort gc].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x3d1d329c9e59 <JS Object>
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n  >)
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: node::Abort() [/usr/bin/node]
 2: 0xe2c5fc [/usr/bin/node]
 3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node]
 5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node]
 6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
 7: 0x3629ef50961b

서버에는 16GB RAM 및 24GB SSD 스왑이 장착되어 있습니다. 스크립트가 36GB의 메모리를 초과 한 것으로 의심됩니다. 적어도 그것은해서는 안됩니다

스크립트는 파일 메타 데이터 (수정 날짜, 권한 등 빅 데이터가 없음)와 함께 객체 배열로 저장된 파일 인덱스를 생성합니다.

전체 스크립트 코드는 다음과 같습니다.
http://pastebin.com/mjaD76c3

나는 이미이 스크립트를 사용하여 과거에 이상한 노드 문제를 경험했습니다. String과 같은 큰 파일을 작업 할 때 노드가 고장 나서 인덱스를 여러 파일로 분할합니다. 거대한 데이터 세트로 nodejs 메모리 관리를 개선 할 수있는 방법이 있습니까?



답변

올바르게 기억한다면 수동으로 늘리지 않으면 V8에서 약 1.7GB의 메모리 사용에 대한 엄격한 표준 제한이 있습니다.

우리 제품 중 하나에서 배포 스크립트에서이 솔루션을 따랐습니다.

 node --max-old-space-size=4096 yourFile.js

새로운 공간 명령도 있지만 여기에서 읽은 것처럼 : v8-garbage-collection a-tour-of-v8-garbage-collection 새로운 공간은 새로 작성된 단기 데이터 만 수집하고 이전 공간에는 참조해야하는 모든 데이터 구조가 포함됩니다. 귀하의 경우 최선의 선택입니다.


답변

누군가가 노드 속성을 직접 설정할 수없는 환경 에서이 문제가 발생하는 경우 (내 경우에는 빌드 도구) :

NODE_OPTIONS="--max-old-space-size=4096" node ...

명령 행에서 전달할 수없는 환경 변수를 사용하여 노드 옵션을 설정할 수 있습니다.


답변

단일 스크립트뿐만 아니라 노드의 메모리 사용량을 전체적으로 늘리려면 다음과 같이 환경 변수를 내보낼 수 있습니다.
export NODE_OPTIONS=--max_old_space_size=4096

그런 다음과 같은 빌드를 실행할 때 파일로 재생할 필요가 없습니다
npm run build.


답변

VSCode로 디버깅하려고 할 때이 문제가 발생했기 때문에 디버그 설정에 인수를 추가하는 방법입니다.

runtimeArgs의 구성 속성에 추가 할 수 있습니다 launch.json.

아래 예를 참조하십시오.

{
"version": "0.2.0",
"configurations": [{
        "type": "node",
        "request": "launch",
        "name": "Launch Program",
        "program": "${workspaceRoot}\\server.js"
    },
    {
        "type": "node",
        "request": "launch",
        "name": "Launch Training Script",
        "program": "${workspaceRoot}\\training-script.js",
        "runtimeArgs": [
            "--max-old-space-size=4096"
        ]
    }
]}


답변

다음은 노드 서버를 시작할 때 더 많은 메모리를 허용하는 방법에 대한 추가 정보를 추가하는 플래그 값입니다.

1GB-8GB

#increase to 1gb
node --max-old-space-size=1024 index.js

#increase to 2gb
node --max-old-space-size=2048 index.js

#increase to 3gb
node --max-old-space-size=3072 index.js

#increase to 4gb
node --max-old-space-size=4096 index.js

#increase to 5gb
node --max-old-space-size=5120 index.js

#increase to 6gb
node --max-old-space-size=6144 index.js

#increase to 7gb
node --max-old-space-size=7168 index.js

#increase to 8gb
node --max-old-space-size=8192 index.js


답변

–max-old-space-size를 설정 한 후에도이 문제로 고심하고있었습니다.

그런 다음 카르마 스크립트 앞에 –max-old-space-size 옵션을 넣어야한다는 것을 깨달았습니다.

또한 karma에 대한 스크립트 –max-old-space-size 및 –max_old_space_size 구문을 모두 지정하는 것이 가장 좋습니다.

node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192  --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192   --prod --aot

참조 https://github.com/angular/angular-cli/issues/1652


답변

AOT 각도 빌드를 수행하는 동안 비슷한 문제가 발생했습니다. 다음 명령이 도움이되었습니다.

npm install -g increase-memory-limit
increase-memory-limit

출처 : https://geeklearning.io/angular-aot-webpack-memory-trick/