Hoje eu executei meu script para indexação do sistema de arquivos para atualizar o índice de arquivos RAID e após 4h ele travou com o erro seguinte:
[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
O servidor está equipado com 16gb de RAM e 24gb de SSD swap. Duvido muito que o meu script tenha ultrapassado os 36gb de memória. Pelo menos ele deven't
Script cria índice de arquivos armazenados como Matriz de Objetos com metadados de arquivos (datas de modificação, permissões, etc, sem grandes dados)
Aqui's código completo do script: http://pastebin.com/mjaD76c3
I'já experimentei problemas de nós estranhos no passado com este script o que me forçou, por exemplo, a dividir o índice em vários arquivos, já que o nó estava com falhas ao trabalhar em arquivos tão grandes como String. Existe alguma maneira de melhorar o gerenciamento de memória nodejs com grandes conjuntos de dados?
Se bem me lembro, existe um limite padrão rígido para o uso de memória na V8 de cerca de 1,7 GB, se você não a aumentar manualmente.
Em um de nossos produtos seguimos esta solução em nosso roteiro de implantação:
node --max-old-space-size=4096 yourFile.js
Haveria também um novo comando espacial, mas como eu li aqui: a-tour-of-v8-garbage-collection o novo espaço só recolhe os dados de curto prazo recentemente criados e o espaço antigo contém todas as estruturas de dados referenciados que devem ser, no seu caso, a melhor opção.
Encontrei este problema ao tentar depurar com o VSCode, então só queria acrescentar isto é como você pode adicionar o argumento à sua configuração de depuração.
Você pode adicioná-lo à propriedade runtimeArgs' da sua configuração em
launch.json'.
Veja o exemplo abaixo.
{
"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"
]
}
]}
Eu estava a lutar com isto mesmo depois de definir o tamanho --max-old-space-size.
Então eu percebi que precisava colocar opções -- tamanho de espaço livre -- antes do script do karma.
também é melhor especificar as duas sintaxes --max-old-space-size e --max_old_space_size meu 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
referência https://github.com/angular/angular-cli/issues/1652