Node.js tas de mémoire
Aujourd'hui, j'ai exécuté mon script d'indexation de système de fichiers pour actualiser l'index des fichiers RAID. Après 4 heures, il s'est écrasé avec l'erreur suivante:
[md5:] 241613/241627 97.5%
[md5:] 241614/241627 97.5%
[md5:] 241625/241627 98.1%
Creating missing list... (79570 files missing)
Creating new files list... (241627 new files)
<--- Last few GCs --->
11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9 / 0 ms [allocation failure] [GC in old space requested].
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9 / 0 ms [allocation failure] [GC in old space requested].
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5 / 0 ms [last resort gc].
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6 / 0 ms [last resort gc].
<--- JS stacktrace --->
==== JS stack trace =========================================
Security context: 0x3d1d329c9e59 <JS Object>
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n >)
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin...
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
1: node::Abort() [/usr/bin/node]
2: 0xe2c5fc [/usr/bin/node]
3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node]
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node]
5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node]
6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
7: 0x3629ef50961b
Le serveur est équipé de 16 Go RAM et de 24 Go d’échange de SSD. Je doute fortement que mon script dépasse 36 Go de mémoire. Au moins ça ne devrait pas
Le script crée un index des fichiers stockés sous forme de tableau d'objets avec leurs métadonnées (dates de modification, autorisations, etc., sans données volumineuses).
Voici le code de script complet: http://Pastebin.com/mjaD76c3
J'ai déjà expérimenté des problèmes de nœuds étranges dans le passé avec ce script, ce qui m'a forcé, par exemple. diviser l'index en plusieurs fichiers, car le nœud posait problème en travaillant sur de gros fichiers comme String. Existe-t-il un moyen d’améliorer la gestion de la mémoire de nodejs avec d’énormes jeux de données?
Si je me souviens bien, il existe une limite standard stricte d'utilisation de la mémoire dans V8 d'environ 1,7 Go, si vous ne l'augmentez pas manuellement.
Dans l'un de nos produits, nous avons suivi cette solution dans notre script de déploiement:
node --max-old-space-size=4096 yourFile.js
Il y aurait aussi une nouvelle commande d’espace mais comme je lis ici: un-tour-de-v8-garbage-collection le nouvel espace ne collecte que les données à court terme nouvellement créées et l’ancien espace contient toutes les structures de données référencées ce qui devrait être dans votre cas la meilleure option.
J'ai rencontré ce problème lorsque j'essayais de déboguer avec VSCode. Je voulais donc simplement ajouter ceci: voici comment ajouter l'argument à votre configuration de débogage.
Vous pouvez l'ajouter à la propriété runtimeArgs
de votre configuration dans launch.json
.
Voir exemple ci-dessous.
{
"version": "0.2.0",
"configurations": [{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceRoot}\\server.js"
},
{
"type": "node",
"request": "launch",
"name": "Launch Training Script",
"program": "${workspaceRoot}\\training-script.js",
"runtimeArgs": [
"--max-old-space-size=4096"
]
}
]}
Juste au cas où quelqu'un se heurterait à cela dans un environnement où il ne pourrait pas définir directement les propriétés du nœud (dans mon cas, un outil de construction):
NODE_OPTIONS="--max-old-space-size=4096" node ...
Vous pouvez définir les options de noeud à l'aide d'une variable d'environnement si vous ne pouvez pas les passer en ligne de commande.
j'avais du mal avec cela même après avoir réglé - max-old-space-size.
Ensuite, j'ai réalisé qu'il fallait mettre les options - max-old-space-size avant le script karma.
il est également préférable de spécifier les deux syntaxes --max-old-space-size et --max_old_space_size mon script pour karma:
node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192 --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192 --prod --aot
référence https://github.com/angular/angular-cli/issues/1652
fwiw, trouver et réparer un gros porc avec quelque chose comme memwatch pourrait aider.
Si vous souhaitez augmenter l'utilisation de la mémoire du nœud de manière globale, et pas seulement d'un seul script, vous pouvez exporter une variable d'environnement, comme ceci:export NODE_OPTIONS=--max_old_space_size=4096
Ensuite, vous n'avez pas besoin de jouer avec des fichiers lorsque vous exécutez des versions telles que npm run build
.
J'ai eu un problème similaire en faisant AOT construire angulaire. Les commandes suivantes m'ont aidé.
npm install -g increase-memory-limit
increase-memory-limit
Source: https://geeklearning.io/angular-aot-webpack-memory-trick/
Étapes à suivre -
- Ouvrez la commande Invite et tapez
%appdata%
appuyez sur entrée. - Accédez au dossier
%appdata%
> npm - Ouvrez ou éditez
ng.cmd
dans votre éditeur favori - Ajouter
--max_old_space_size=8192
aux blocs IF et ELSE
Votre fichier node.cmd
ressemble à ceci après le changement:
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)
Voici quelques valeurs d'indicateur pour ajouter des informations supplémentaires sur la manière d'autoriser plus de mémoire lorsque vous démarrez votre serveur de noeud.
1 Go - 8 Go
#increase to 1gb
node --max-old-space-size=1024 index.js
#increase to 2gb
node --max-old-space-size=2048 index.js
#increase to 3gb
node --max-old-space-size=3072 index.js
#increase to 4gb
node --max-old-space-size=4096 index.js
#increase to 5gb
node --max-old-space-size=5120 index.js
#increase to 6gb
node --max-old-space-size=6144 index.js
#increase to 7gb
node --max-old-space-size=7168 index.js
#increase to 8gb
node --max-old-space-size=8192 index.js
j'ai essayé ceci NODE_OPTIONS = --max-old-space-size = 8192.
fonctionne bien pour moi.
ne suggestion: -
juste essayé de commenter le console.log () sur le terminal. parce que cela prendra aussi de la mémoire. et utilise
c'est simple, il suffit d'augmenter la mémoire de tas de 1 à 8 Go pour windows open powershell ou cmd dans votre répertoire de projet et taper ci-dessous la commande, pour mac open terminal dans ce répertoire
node --max-old-space-size={size in MBs} index.js
J'ai essayé ???? le code ci-dessous et son bon fonctionnement✌.
- terminal ouvert depuis le répertoire racine du projet
exécutez la cmd pour définir une nouvelle taille.
set NODE_OPTIONS = - max_old_space_size = 8172
Ou vous pouvez consulter le lien pour plus d'informations https://github.com/nodejs/node/issues/10137#issuecomment-487255987
Mettez à niveau le noeud vers la dernière version. J'étais sur le noeud 6.6 avec cette erreur et mis à niveau vers 8.9.4 et le problème a disparu.
J'ai rencontré ce même problème récemment et suis tombé sur ce fil, mais mon problème était avec React
App. Les modifications ci-dessous dans la commande de démarrage du nœud ont résolu mes problèmes.
Syntaxe
node --max-old-space-size=<size> path-to/fileName.js
Exemple
node --max-old-space-size=16000 scripts/build.js
Pourquoi la taille est 16000 dans max-old-space-size?
Fondamentalement, cela varie en fonction de la mémoire allouée à ce thread et de vos paramètres de nœud.
Comment vérifier et donner la bonne taille?
Ceci est fondamentalement rester dans notre moteur v8
. Le code ci-dessous vous aide à comprendre la taille de segment de mémoire de votre moteur v8 de noeud local.
const v8 = require('v8');
const totalHeapSize = v8.getHeapStatistics().total_available_size;
const totalHeapSizeGb = (totalHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log('totalHeapSizeGb: ', totalHeapSizeGb);
Juste au cas où cela pourrait aider les personnes ayant ce problème lors de l’utilisation des applications nodejs générant une journalisation lourde, un collègue a résolu ce problème en canalisant les sorties standard vers un fichier.
Dans mon cas, j'avais exécuté npm install
sur la version précédente du noeud, après un jour, j'ai mis à niveau la version du noeud et ram npm install
pour quelques modules. Après cela, j'ai eu cette erreur. Pour résoudre ce problème, j'ai supprimé le dossier node_module de chaque projet et exécuté npm install
à nouveau.
J'espère que cela pourrait résoudre le problème.
Remarque: cela se produisait sur mon ordinateur local et cela a été corrigé uniquement sur l'ordinateur local.
Si vous essayez de lancer pas node
lui-même, mais un autre logiciel, par exemple webpack
, vous pouvez utiliser la variable d'environnement et le package cross-env
:
$ cross-env NODE_OPTIONS='--max-old-space-size=4096' \
webpack --progress --config build/webpack.config.dev.js