내 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)
이미 error
및 exit
이벤트에 대한 리스너를 사용 하고 있지만이 오류가 발생하는 경우 해고되지 않습니다.
내 코드 :
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를 실행하는 경우 다음 지침에 따라 스왑 파일을 추가 할 수 있습니다 .
sudo fallocate -l 4G /swapfile
4GB 스왑 파일 만들기sudo chmod 600 /swapfile
루트에 대한 액세스를 제한하여 스왑 파일 보안sudo mkswap /swapfile
파일을 스왑 공간으로 표시sudo swapon /swapfile
스왑 활성화echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
재부팅시 스왑 파일 유지 (팁, bman 감사합니다 !)
답변
AWS Lambda에서이 문제가 발생하면 함수에 할당 된 메모리를 늘리는 것을 고려해야합니다.
답변
다음 명령을 사용하여 메모리 노드 사용량을 변경할 수 있습니다.
node ----max-old-space-size=1024 yourscript.js
–max-old-space-size = 1024는 1 기가의 메모리를 할당합니다.
기본적으로 노드는 512MB의 램을 사용하지만 플랫폼에 따라 필요에 따라 가비지 수집이 시작되도록 더 많거나 적은 할당이 필요할 수 있습니다.
플랫폼에 사용 가능한 RAM이 500MB 미만인 경우 메모리 사용량을 –max-old-space-size = 256으로 낮게 설정해보십시오.
답변
나는 같은 문제가 있었고 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()