Node.js поймать ошибку ENOMEM, выброшенную после икры
Мой Node.js script сбой из-за отказа ENOMEM (Out of memory) errnoException при использовании 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) { ... });
Полный исходный код доступен.
Есть ли что-нибудь, что я могу сделать, чтобы предотвратить сбой script? Как поймать выброшенную ошибку ENOMEM?
Спасибо!
Ответы
Ответ 1
У меня была такая же проблема, и, как оказалось, в моей системе было без swap-пространства. Проверьте это, выполнив команду free -m
:
[email protected]:~$ free -m
total used free shared buffers cached
Mem: 2002 233 1769 0 24 91
-/+ buffers/cache: 116 1885
Swap: 0 0 0
Глядя на нижнюю строку, мы видим, что у нас есть общая память с 0 байтами. Нехорошо. Node может получить довольно голодную память, и если свободное пространство подкачки не будет доступно, когда закончится память, ошибки будут иметь место.
Метод добавления файла подкачки зависит от операционных систем и дистрибутивов, но если вы используете Ubuntu, как я, вы можете следовать этим инструкциям при добавлении свопа файл:
-
sudo fallocate -l 4G /swapfile
Создайте файл подкачки размером 4 гигабайта
-
sudo chmod 600 /swapfile
Защитите файл подкачки, ограничив доступ к root
-
sudo mkswap /swapfile
Отметить файл как пространство подкачки
-
sudo swapon /swapfile
Включить обмен
-
echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
Персистский swap файл через перезагрузки (спасибо за подсказку, bman!)
Ответ 2
Вы можете попробовать изменить объем памяти node, используя эту команду:
node ----max-old-space-size=1024 yourscript.js
- max-old-space-size = 1024 будет выделять 1 гигабайт памяти.
По умолчанию node будет использовать 512 МБ оперативной памяти, но в зависимости от вашей платформы вам может потребоваться выделить более или менее так, чтобы сбор мусора срабатывал, когда вам это нужно.
Если на вашей платформе имеется менее 500 мб доступного плунжера, попробуйте установить более низкое использование памяти в размере -max-old-space-size = 256.
Ответ 3
У меня была такая же проблема и исправлена с try/catch:
try {
zbarimg = process.spawn('zbarimg', [photo, '-q']);
} catch (err) {
console.log(err);
}
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... });
Ответ 4
Если вы когда-нибудь сталкивались с этой проблемой в AWS Lambda, вам следует подумать об увеличении памяти, выделяемой для функции.
Ответ 5
Вы должны очистить выходы от вызываемого процесса!
Пример python выглядит следующим образом:
import sys
...
sys.stdout.flush()