Я пытаюсь отладить некоторые проблемы с памятью с помощью Node.js, в частности пытаюсь передать суммы, выделяемые серверу узла, а также двум дочерним процессам. Я не могу найти официальную документацию о том, как эти флаги будут выделять память.
У меня есть родительский процесс, который я вызываю
node --max-old-space-size=512 parent.js -child-1-memory=512 -child-2-memory=2048
Мое намерение состоит в том, чтобы запустить эти процессы с известным максимумом для каждого процесса.
Внутри parent.js:
// Child 1, intended value 512
const child1 = fork('child1.js', [], {
execArgv: ['--max-old-space-size=' + getArgValue('-child-1-memory')],
env: { ... },
});
// Child 2, intended value 2048
const child2 = fork('child2.js', [], {
execArgv: ['--max-old-space-size=' + getArgValue('-child-2-memory')],
env: { ... },
});
В настоящее время у меня есть установка, в которой максимальный уровень дочернего элемента 2 составляет 1500M, поэтому я попытаюсь запустить этот процесс с 2048M. Я могу видеть процесс, выполняющийся ps -e | grep "child2.js"
с аргументом /usr/local/bin/node /path/to/child2.js --max_old_space_size=2048
, но, похоже, это не вступает в силу.
Я пытался
node --max-old-space-size=3072 parent.js -child-1-memory=512 -child-2-memory=2048
в случае, если дети извлекают из пула родительского процесса, но на самом деле это не имеет смысла, так как я могу использовать 1500M, прежде чем это OOM.
Я попытался переключить аргументы для разветвления, указав
const child1 = fork('child1.js', ['--max-old-space-size=' + getArgValue('-child-1-memory')], {
execArgv: [],
env: { ... },
});
Но, похоже, это не имеет значения.
Некоторые заметки:
- Запуск Child 2 независимо от родительского процесса с помощью
--max-old-space-size=2048
работает просто отлично.
- Текущая настройка prod работает на узле v8.9.1, я также протестировал v11.9.0 с теми же результатами.
- На самом деле не нужно судить о том, сколько памяти должен использовать процесс узла.