web-dev-qa-db-fra.com

Node.js intercepte l'erreur ENOMEM renvoyée après l'apparition

Mon script Node.js se bloque à cause d'une erreur errno ENOMEM (Mémoire insuffisante) lors de l'utilisation de spawn .

L'erreur:

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)

J'utilise déjà des écouteurs pour les événements error et exit, mais aucun d'entre eux n'est renvoyé en cas d'erreur.

Mon code:

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

Code source complet disponible .

Y a-t-il quelque chose que je puisse faire pour empêcher le script de planter? Comment puis-je intercepter l'erreur ENOMEM?

Merci!

69
tobi

J'ai eu le même problème et comme il s'est avéré, mon système n'avait aucun espace d'échange activé . Vérifiez si c'est le cas en exécutant la commande 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

En regardant la rangée du bas, nous pouvons voir que nous avons un total de 0 octets de mémoire d'échange. Pas bon. Node peut devenir très gourmand en mémoire et si aucun espace d'échange n'est disponible lorsque la mémoire est saturée, des erreurs sont inévitables.

La méthode pour ajouter un fichier d'échange varie selon les systèmes d'exploitation et les distributions, mais si vous utilisez Ubuntu comme moi, vous pouvez suivre ces instructions sur l'ajout d'un fichier d'échange :

  1. Sudo fallocate -l 4G /swapfile Créer un fichier d'échange de 4 gigaoctets
  2. Sudo chmod 600 /swapfile Sécuriser le fichier d'échange en limitant l'accès à root
  3. Sudo mkswap /swapfile Marquer le fichier comme espace de swap
  4. Sudo swapon /swapfile Activer le swap
  5. echo "/swapfile none swap sw 0 0" | Sudo tee -a /etc/fstab Persiste le fichier d'échange après les redémarrages (merci pour le conseil, bman !)
168
Kaivosukeltaja

Si vous rencontrez ce problème dans AWS Lambda, vous devez envisager d'augmenter la mémoire allouée à la fonction.

1
James Shapiro

Vous pouvez essayer de changer la quantité de mémoire utilisée par le noeud avec cette commande: node ----max-old-space-size=1024 yourscript.js

--max-old-space-size = 1024 allouera 1 Go de mémoire.

Par défaut, le noeud utilisera 512 Mo de RAM, mais en fonction de votre plate-forme, vous devrez peut-être allouer plus ou moins pour que la récupération de place démarre dès que vous en avez besoin.

Si votre plate-forme dispose de moins de 500 Mo de mémoire RAM, essayez d’utiliser une quantité de mémoire inférieure à --max-old-space-size = 256.

1
Deemoe

J'ai eu le même problème et corrigé avec try/catch:

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