node.js не хватает памяти после завершения загрузки файла - PullRequest
0 голосов
/ 12 апреля 2019

enter image description here У меня есть веб-сервер, работающий на встроенном 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 вручную в этом случае?

1 Ответ

1 голос
/ 30 мая 2019

Дальнейшее тестирование показывает, что встроенная система linux по умолчанию не включает подкачку памяти. Я создал файл подкачки и сделал его того же размера, что и системная память (128 МБ). Позже я увеличил это, чтобы получить дополнительную нагрузку из-за дополнительного свободного места на SD-карте.

Это позволяет linux автоматически управлять проблемой OOM, перемещая некритическое использование памяти на диск. Этот процесс замедлил загрузку еще на несколько секунд, но остановил все проблемы с памятью OOM.

...