У меня есть веб-сервер, работающий на встроенном Linux, работающем на SBC armv7 (Atmel SAMA5D27-SOM с ОЗУ 128 МБ).
Процесс обновления прошивки требует, чтобы файл .tar.gz был загружен через этот интерфейс, затем разархивирован / разархивирован и на нем выполнялись дальнейшие процессы.
После успешной загрузки с использованием модуля busboy, я заметил, что использование памяти все еще остается высоким (см. Прикрепленное изображение), даже несмотря на то, что загрузка передается непосредственно в файл (код ниже).
Дальнейшие процессы, реализованные с помощью child_processes после загрузки файла, затем завершаются из-за нехватки памяти в системе.
Я реализовал флаг --max-old-size-space-size для = 32 МБ, так как я прочитал, что устанавливает более низкий порог для начала ГХ.
Я пробовал различные методы использования API child_processes, включая:
1. execSync
2. async exec (как описано в документе node.js)
3. порождать с {detached: true}
/* imports omitted for brevity */
module.exports = async (req, res, next) => { // eslint-disable-line no-unused-vars
try {
/* File validation omitted for brevity */
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
/* Further file validation omitted for brevity,
File transfer debugging omitted for brevity */
// Handle saving file stream to file
const saveTo = path.join(updatesDir, path.basename(filename));
file.pipe(fs.createWriteStream(saveTo));
});
busboy.on('finish', () => {
return res.json({ updateFilename });
});
// This is required stream req progress back to browser
return req.pipe(busboy);
} catch (error) {
console.error(error)
next(error);
}
}
Я понимаю, что node.js использует сборщик мусора, однако память, занятая для загрузки файла, не освобождается для использования последующими процессами.
Что-то не так с тем, как я передаю потоковую передачу файла в файл?
Почему Node.js не освобождает память?
Есть ли способ запустить GC вручную в этом случае?