IT이야기

Node.js“심각한 오류 : JS 할당 실패-프로세스 메모리 부족”— 스택 추적

cyworld 2021. 4. 17. 10:33
반응형

Node.js“심각한 오류 : JS 할당 실패-프로세스 메모리 부족”— 스택 추적을 얻을 수 있습니까?


글쎄 ... 난 다시 원점으로 돌아 왔어. 나는 내 인생을 위해 이것을 알아낼 수 없습니다.

다음과 같은 오류가 발생합니다.

FATAL ERROR: JS Allocation failed - process out of memory

이 문제의 근원에 도달하기 위해 시도한 수십 가지 (예, 수십 가지)를 열거 할 수 있지만 실제로는 너무 많을 것입니다. 여기에 핵심 사항이 있습니다.

  • 프로덕션 서버에서만 발생할 수 있으며 앱이 크고 복잡하기 때문에 격리하기가 매우 어렵습니다.
  • 힙 크기와 RSS 크기가 모두 200Mb 미만인 경우에도 발생하며 머신 (Amazon Cloud, CentOS, m1.large)에 8Gb RAM이 있다는 점을 감안하면 문제가되지 않습니다.

내 가정은 (두 번째 점 때문에) 누출이 원인이 아닐 수도 있다는 것입니다. 오히려 매우 큰 단일 객체가있는 것 같습니다. 다음 스레드는이 이론을 뒷받침합니다. JSON.stringify를 사용하는 Node.js에서 '프로세스 메모리 부족'오류가 발생합니다.

내가 정말로 필요한 것은 응용 프로그램이 충돌하는 순간의 메모리 상태 또는 FATAL ERROR로 이어지는 스택 추적을 찾는 방법입니다.

위의 가정에 따르면 10 분 된 힙 덤프로는 충분하지 않습니다 (객체가 메모리에 상주하지 않았기 때문).


이것이 현재 Google의 최고 답변이기 때문에 방금 만난 사례에 대한 솔루션을 추가 할 것이라고 생각했습니다.

ejs 템플릿과 함께 express를 사용 하여이 문제가 발생했습니다.이 문제는 ejs 블록을 닫지 못했고 파일이 js 코드였습니다.

var url = '<%=getUrl("/some/url")'
/* lots more javascript that ejs tries to parse in memory apparently */

이것은 분명히 매우 특정한 경우이며 OP의 솔루션은 대부분의 시간에 사용되어야합니다. 그러나 OP의 솔루션은 이에 대해 작동하지 않습니다 (ejs 스택 추적은으로 표시되지 않습니다 ofe).


이 오류가 발생했을 때 자동으로 힙 덤프를 생성 하도록 node.js 자체를 수정하는 데 도움 을주기 위해 Trevor Norris 에게 막대한 소품을 제공해야합니다 .

하지만 궁극적으로이 문제를 해결 한 것은 훨씬 더 평범했습니다. 들어오는 각 API 요청의 끝점을 로그 파일에 추가하는 간단한 코드를 작성했습니다. 나는 ~ 10 개의 데이터 포인트 (크래시)를 수집하기 위해 기다렸다가 크래시 60 초 전에 실행 된 엔드 포인트를 비교했습니다. 9/10 사례에서 충돌 직전에 히트 한 단일 엔드 포인트를 발견했습니다.

거기에서 코드를 더 깊이 파고 드는 문제였습니다. mongoDB 쿼리에서 더 적은 데이터를 반환하고, 객체에서 필요한 데이터 만 콜백으로 다시 전달하는 등 모든 것을 줄였습니다. 이제 우리는 서버에서 한 번의 충돌없이 평균보다 6 배 더 길었습니다. 해결 되기를 바랍니다 ... 당분간.


이 문제에 대한 단일 솔루션은 없습니다.
대부분은 JS와 관련된 다른 경우를 읽었지만, 예를 들어, 제 경우에는 코드 버그로 인해 무한한 깨진 옥 템플릿 루프였습니다.

노드가 잘 관리하지 못하는 구문 오류 일뿐입니다.
코드를 확인하거나 게시하여 문제를 찾으십시오.


필자의 경우에는 cap production deploy (capistrano)를 통해 Rails 4.2.1을 배포했고 자산 프리 컴파일 중에 다음을 받았습니다.

rake stdout : rake 중단! ExecJS :: RuntimeError : FATAL ERROR : Evacuation Allocation failed-process out of memory (execjs) : 1

이전에 active_admin을 통해 데이터 가져 오기를 12 번 실행했는데 모든 RAM을 사용한 것 같습니다.

솔루션 : 서버 다시 시작 및 배포가 처음 실행되었습니다 ....


직렬화중인 객체에 대한 재귀 문제 일 수 있습니다. 처음에는 크기가 크고 재귀가 문제가되기 전에 메모리가 부족할 수 있습니까?

이런 이유로 safe-clone-deep npm 모듈을 만들었습니다 . 기본적으로 다음을 수행하고 싶을 것입니다.

var clone = require('safe-clone-deep');
...
   return JSON.stringify(clone(originalObject));

이렇게하면 안전하게 직렬화 할 거의 모든 개체를 복제 할 수 있습니다. 또한 객체 중 하나가 Error상속 name되면 일반적으로 직렬화되지 않으므로 상속 된 messagestack속성을 직렬화합니다.


우리의 경우 우연히 util.format을 파열시키는 거대한 (희소 한) 배열을 할당했습니다.

http://grahamrhay.wordpress.com/2014/02/24/fatal-error-js-allocation-failed-process-out-of-memory/


제 경우에는 []를 사용하여 연관 배열 (Object)을 초기화했습니다. {}로 초기화하자마자 문제가 사라졌습니다.


제 경우에는 개발 중에 db를 시드하는 데 사용했던 파일이 누출을 일으켰습니다. 어떤 이유로 노드는 파일 끝에있는 여러 줄 주석을 좋아하지 않았습니다. 문제는 보이지 않지만 제거 프로세스는이 파일의이 섹션이라는 것을 알고 있음을 의미합니다.


여러 사례를 분석 할 때 가장 일반적인 문제는 무한 루프의 문제입니다. 이것은 복잡한 앱에서 해결하기 어려울 것이며, 테스트 주도 개발이 편리한 곳입니다 !!


여기서 일어나는 일 공유 :

일부 파일에서 하나의 정적 파일, 빌드 된 파일에서 클래스를 가져 오는 것을 발견 할 때까지이 문제로 며칠을 잃었습니다. 그것은 결코 끝나지 않는 빌드 프로세스를 만듭니다. 다음과 같은 것 :

import PropTypes from "../static/build/prop-types"; 

실제 소스로 수정하면 모든 문제가 해결되었습니다.


AWS 인스턴스에서 npm 5.0.3을 사용했을 때 npm 전역 폴더 자체에 대한 권한 문제가 있었기 때문에이 문제가 발생했을 가능성이 있습니다. 우리는 달렸습니다 : sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} 이제 잘 작동합니다


문제의 근본 원인을 파악하기 위해 며칠을 보냈습니다. "JS-프로세스 메모리 부족"오류가 AWS EC2 인스턴스에서만 웹팩 빌드 중에 발생하기 시작했습니다. 그래도 로컬 시스템에서 빌드가 성공했습니다.
그 이유는 다음 코드 때문입니다.
이전 :
import { ShoppingCartOutlined } from "@material-ui/icons/ShoppingCartOutlined";
수정 된 사람 :
import ShoppingCartOutlined from "@material-ui/icons/ShoppingCartOutlined";

material-ui / icons를 사용하는 사람에게 도움이 될 수 있으며이 오류로 끝납니다.


나는 같은 문제가 있었다. "sudo reboot"명령을 사용하여 시스템을 다시 시작했습니다. 그런 다음 다시 시도했습니다. 작동했습니다.

ReferenceURL : https://stackoverflow.com/questions/13616770/node-js-fatal-error-js-allocation-failed-process-out-of-memory-possible

반응형