Mój skrypt Node.js ulega awarii z powodu wyrzuconego wyjątku ENOMEM (brak pamięci) errnoException podczas używania spawn .
Błąd:
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)
Używam już detektorów dla zdarzenia error
i exit
, ale żaden z nich nie jest uruchamiany w przypadku tego błędu.
Mój kod:
zbarimg = process.spawn('zbarimg', [photo, '-q']);
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... });
Dostępny pełny kod źródłowy .
Czy jest coś, co mogę zrobić, aby zapobiec awarii skryptu? Jak wyłapać wyrzucony błąd ENOMEM?
Dzięki!
error
treserze?fork()
(podstawowego wywołania systemowego). Zobacz github.com/nodejs/node/issues/25382Odpowiedzi:
Miałem ten sam problem i jak się okazało, mój system nie miał włączonej przestrzeni wymiany . Sprawdź, czy tak jest, uruchamiając polecenie
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
Patrząc na dolny wiersz, widzimy, że mamy w sumie 0 bajtów pamięci wymiany. Niedobrze. Węzeł może bardzo potrzebować pamięci i jeśli nie ma dostępnej przestrzeni wymiany, gdy skończy się pamięć, na pewno wystąpią błędy.
Metoda dodawania pliku wymiany różni się w zależności od systemu operacyjnego i dystrybucji, ale jeśli używasz Ubuntu tak jak ja, możesz postępować zgodnie z tymi instrukcjami dodawania pliku wymiany :
sudo fallocate -l 4G /swapfile
Utwórz 4-gigabajtowy plik wymianysudo chmod 600 /swapfile
Zabezpiecz plik wymiany, ograniczając dostęp do rootasudo mkswap /swapfile
Oznacz plik jako przestrzeń wymianysudo swapon /swapfile
Włącz zamianęecho "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
Utrzymuj plik wymiany przy ponownym uruchomieniu (dzięki za wskazówkę, bman !)źródło
Jeśli kiedykolwiek napotkasz ten problem w AWS Lambda, powinieneś rozważyć zwiększenie pamięci przydzielonej funkcji.
źródło
Możesz spróbować zmienić ilość używanej pamięci przez węzeł za pomocą tego polecenia:
node ----max-old-space-size=1024 yourscript.js
--max-old-space-size = 1024 przydzieli 1 gig pamięci.
Domyślnie węzeł będzie używał 512 MB pamięci RAM, ale w zależności od platformy może być konieczne przydzielenie większej lub mniejszej ilości pamięci, aby zbieranie śmieci działało, gdy tego potrzebujesz.
Jeśli Twoja platforma ma mniej niż 500 MB pamięci RAM, spróbuj ustawić użycie pamięci poniżej --max-old-space-size = 256.
źródło
Miałem ten sam problem i naprawiłem go za pomocą try / catch:
try { zbarimg = process.spawn('zbarimg', [photo, '-q']); } catch (err) { console.log(err); } zbarimg.on('error', function(err) { ... }); zbarimg.on('close', function(code) { ... });
źródło
Naprawiłem problem, wyłączając i ponownie włączając mój serwer Node.
źródło
Musisz opróżnić wyjścia z wywołanego procesu!
Przykład w Pythonie wygląda następująco:
import sys ... sys.stdout.flush()
źródło