Nice programing

생성 후 Node.js가 ENOMEM 오류를 포착합니다.

nicepro 2020. 11. 3. 19:16
반응형

생성 후 Node.js가 ENOMEM 오류를 포착합니다.


내 Node.js 스크립트는 spawn을 사용할 때 throw 된 ENOMEM (메모리 부족) errnoException으로 인해 충돌 합니다 .

오류:

child_process.js:935
  throw errnoException(process._errno, 'spawn');
        ^

Error: spawn ENOMEM
  at errnoException (child_process.js:988:11)
  at ChildProcess.spawn (child_process.js:935:11)
  at Object.exports.spawn (child_process.js:723:9)
  at module.exports ([...]/node_modules/zbarimg/index.js:19:23)

이미 errorexit이벤트에 대한 리스너를 사용 하고 있지만이 오류가 발생하는 경우 해고되지 않습니다.

내 코드 :

zbarimg = process.spawn('zbarimg', [photo, '-q']);
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... }); 

전체 소스 코드를 사용할 수 있습니다 .

스크립트 충돌을 방지하기 위해 할 수있는 일이 있습니까? 던져진 ENOMEM 오류를 어떻게 잡나요?

감사!


나는 같은 문제가 있었고 그 결과 내 시스템 에는 스왑 공간이 활성화되어 있지 않았습니다 . 다음 명령을 실행하여이 경우인지 확인하십시오 free -m.

vagrant@vagrant-ubuntu-trusty-64:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2002        233       1769          0         24         91
-/+ buffers/cache:        116       1885
Swap:            0          0          0

맨 아래 행을 보면 총 0 바이트 스왑 메모리가 있음을 알 수 있습니다. 안좋다. 노드는 꽤 많은 메모리를 고갈시킬 수 있으며 메모리가 부족할 때 사용 가능한 스왑 공간이 없으면 오류가 발생합니다.

스왑 파일을 추가하는 방법은 운영 체제와 배포판에 따라 다르지만 나처럼 Ubuntu를 실행하는 경우 다음 지침에 따라 스왑 파일을 추가 할 수 있습니다 .

  1. sudo fallocate -l 4G /swapfile 4GB 스왑 파일 만들기
  2. sudo chmod 600 /swapfile 루트에 대한 액세스를 제한하여 스왑 파일 보안
  3. sudo mkswap /swapfile 파일을 스왑 공간으로 표시
  4. sudo swapon /swapfile 스왑 활성화
  5. echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab재부팅시 스왑 파일 유지 (팁, bman 감사합니다 !)

다음 명령을 사용하여 메모리 노드 사용량을 변경할 수 있습니다. node ----max-old-space-size=1024 yourscript.js

--max-old-space-size = 1024는 1GB의 메모리를 할당합니다.

기본적으로 노드는 512MB의 램을 사용하지만 플랫폼에 따라 필요할 때 가비지 수집이 시작되도록 할당해야 할 수도 있습니다.

플랫폼에 사용 가능한 RAM이 500MB 미만인 경우 메모리 사용량을 --max-old-space-size = 256으로 낮게 설정해보십시오.


AWS Lambda에서이 문제가 발생하면 함수에 할당 된 메모리를 늘리는 것을 고려해야합니다.


나는 같은 문제가 있었고 try / catch로 수정했습니다.

try {
  zbarimg = process.spawn('zbarimg', [photo, '-q']);
} catch (err) {
  console.log(err);
}
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... }); 

호출 된 프로세스에서 출력을 플러시해야합니다!

파이썬 예제는 다음과 같습니다.

import sys
...
sys.stdout.flush()

참고 URL : https://stackoverflow.com/questions/26193654/node-js-catch-enomem-error-thrown-after-spawn

반응형