Мой сценарий Node.js аварийно завершает работу из-за выброса исключения errnoException ENOMEM (Out of memory) при использовании spawn .
Ошибка:
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?
Благодаря!
error
обработчика?fork()
(основного системного вызова). См github.com/nodejs/node/issues/25382Ответы:
У меня была та же проблема, и, как оказалось, в моей системе не было включено пространство подкачки . Проверьте, так ли это, запустив команду
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
Создайте файл подкачки размером 4 гигабайтаsudo chmod 600 /swapfile
Защитите файл подкачки, ограничив доступ rootsudo 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 гигабайт памяти.
По умолчанию node будет использовать 512 МБ оперативной памяти, но в зависимости от вашей платформы вам может потребоваться выделить больше или меньше, чтобы сборка мусора запускалась, когда вам это нужно.
Если на вашей платформе доступно менее 500 МБ оперативной памяти, попробуйте установить для использования памяти значение --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) { ... });
источник
Я решил проблему, просто отключив и снова включив свой Node Server.
источник
Вы должны сбросить выходные данные вызываемого процесса!
Пример на Python выглядит так:
import sys ... sys.stdout.flush()
источник