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!
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 :
Sudo fallocate -l 4G /swapfile
Créer un fichier d'échange de 4 gigaoctetsSudo chmod 600 /swapfile
Sécuriser le fichier d'échange en limitant l'accès à rootSudo mkswap /swapfile
Marquer le fichier comme espace de swapSudo swapon /swapfile
Activer le swapecho "/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 !)Si vous rencontrez ce problème dans AWS Lambda, vous devez envisager d'augmenter la mémoire allouée à la fonction.
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.
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) { ... });