Pregunta Node.js montón de memoria


Hoy ejecuté mi secuencia de comandos para la indexación del sistema de archivos para actualizar el índice de archivos RAID y después de 4 h se bloqueó con el siguiente error:

[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

El servidor está equipado con 16 gb de RAM y 24 gb de intercambio SSD. Dudo mucho que mi script excediera 36 gb de memoria. Al menos no debería

El script crea un índice de archivos almacenados como Array of Objects con metadatos de archivos (fechas de modificación, permisos, etc., sin big data)

Aquí está el código de script completo: http://pastebin.com/mjaD76c3

Ya he experimentado problemas de nodos extraños en el pasado con este script lo que me forzó, por ejemplo. dividir el índice en varios archivos a medida que el nodo fallaba al trabajar con archivos tan grandes como String. ¿Hay alguna forma de mejorar la gestión de memoria de nodejs con grandes conjuntos de datos?


75
2017-07-25 02:45


origen


Respuestas:


Si mal no recuerdo, hay un límite estándar estricto para el uso de memoria en V8 de alrededor de 1,7 GB, si no lo aumenta manualmente.

En uno de nuestros productos seguimos esta solución en nuestro script de implementación:

 node --max-old-space-size=4096 yourFile.js

También habría un nuevo comando espacial, pero cuando leo aquí: a-tour-of-v8-basura-colección el nuevo espacio solo recopila los datos de corto plazo recién creados y el espacio antiguo contiene todas las estructuras de datos referenciadas que deberían ser en su caso la mejor opción.


109
2017-07-25 05:29



Me encontré con este problema al intentar depurar con VSCode, así que solo quería agregar que así es como puede agregar el argumento a su configuración de depuración.

Puedes agregarlo al runtimeArgs propiedad de su configuración en launch.json.

Vea el ejemplo a continuación.

{
"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"
        ]
    }
]}

13
2018-06-20 01:26



Estaba luchando con esto incluso después de configurar --max-old-space-size.

Luego me di cuenta de la necesidad de poner opciones --max-old-space-size antes del script de karma.

también es mejor especificar ambas sintaxis --max-old-space-size y --max_old_space_size mi script para 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

referencia https://github.com/angular/angular-cli/issues/1652


4
2018-06-22 08:43



fwiw, encontrar y arreglar un cerdo de la memoria con algo así como memwatch podría ayudar.


4
2018-06-30 16:00



Actualice el nodo a la última versión. Estaba en el nodo 6.6 con este error y actualicé a 8.9.4 y el problema desapareció.


3
2018-01-12 07:01



En caso de que pueda ayudar a las personas a tener este problema al usar aplicaciones nodejs que producen un registro pesado, un colega resolvió este problema conectando los resultados estándar a un archivo.


1
2018-04-04 08:39



Tuve un problema similar al hacer la construcción angular AOT. Los siguientes comandos me ayudaron.

npm install -g increase-memory-limit
increase-memory-limit

Fuente: https://geeklearning.io/angular-aot-webpack-memory-trick/


0
2017-07-31 11:52