Загрузка файла запроса / запроса NodeJS замедляется почти до нуля

У нас есть специальное программное обеспечение NodeJS, которое загружает файлы в свою локальную файловую систему. Файлы могут очень от нескольких КБ до ГБ. Иногда, без видимой причины, скорость загрузки становится очень низкой. Фактическая связь вполне приличная и стабильная. Любопытно то, что медленная загрузка произойдет только в самом начале загрузки и не будет уменьшена до приличной скорости.

Эта проблема возникает периодически, это может произойти с первой загрузки или после завершения другой. Код загружает файлы последовательно, поэтому одновременной загрузки не требуется. Когда проблема возникает, простая остановка процесса NodeJS и перезапуск решает ее.

Ниже выходной образец:

content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[                                                                                                    ] 0%
0.00 of 3.26 GB

------------------------------------

content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[==================================                                                                  ] 34%
1.13 of 3.26 GB

------------------------------------

content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[=======================================================================                             ] 71%
2.33 of 3.26 GB


content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[=================================================================================================   ] 97%
3.17 of 3.26 GB

------------------------------------

Download of content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip completed.
Downloading next file
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[                                                                                                    ] 0%
0.00 of 3.48 GB

------------------------------------

content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[                                                                                                    ] 0%
0.00 of 3.48 GB

------------------------------------

content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[                                                                                                    ] 0%
0.00 of 3.48 GB

------------------------------------

content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[                                                                                                    ] 0%
0.00 of 3.48 GB

------------------------------------

content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[                                                                                                    ] 0%
0.00 of 3.48 GB

------------------------------------

content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[                                                                                                    ] 0%
0.00 of 3.48 GB

------------------------------------

content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[                                                                                                    ] 0%
0.01 of 3.48 GB

Как видно из вышеприведенного вывода, первый (или предыдущий файл) загружается с нормальной скоростью. Второй, который находится на том же сервере, почти не загружается.

Для загрузки используется библиотека Request(v2.87.0) вместе с Request-progress (v3.0.0), чтобы показать ход загрузки. Эта проблема возникает как на платформе Windows, так и на платформе Linux. Мы заметили, что проблема также возникает в нескольких версиях NodeJS, таких как 8.11.1 и 8.11.3

Код, используемый для загрузки:

function download (url, pathToFile) {
  const context = this;
  return new Promise((resolve, reject) => {
    const options = {
      // Set 10 minutes timeout for connect / fetch
      timeout: 600000,
      headers: {}
    };

      const req = request.get(url, options);
      progress(req, {
        throttle: 60000, // Throttle the progress event, defaults to 1000ms
        delay: 0 // Only start to emit after a delay of some milliseconds - default is 0ms
      })
        .on('progress', (state) => {
          showProgress(state);
        })
        .on('error', (error) => {
          req.abort();
          reject(error);
        })
        .on('response', (response) => {
          response.on('end', resolve);
        })
        .pipe(fs.createWriteStream(pathToFile, { flags: options.headers.Range ? 'a' : 'w' }));
  });
};

function showProgress(state) {
  let progressIndicator = '';
  let balanceIndicator = '';
  let progress = 0;
  const percent = parseInt(state.percent * 100);
  for (progress = 1; progress <= percent; progress++) {
    progressIndicator += '=';
  }
  for (let balance = progress; balance <= 100; balance++) {
    balanceIndicator += ' ';
  }
  let totalSize = ((state.size.total / 1024) / 1024).toFixed(2);
  let receivedSize = ((state.size.transferred / 1024) / 1024).toFixed(2);
  let sizeUnit = 'MB';
  if (totalSize >= 1024) {
    totalSize = (totalSize / 1024).toFixed(2);
    receivedSize = (receivedSize / 1024).toFixed(2);
    sizeUnit = 'GB';
  }

  console.log(`[${progressIndicator}${balanceIndicator}]`, `${percent}%`);
  console.log(receivedSize, 'of', totalSize, sizeUnit, '\n');
  console.log('------------------------------------');
  console.log(' ');
}

Там нет ошибки, просто загрузка очень медленная, поэтому очень трудно отладить, откуда возникла эта проблема.

Любые предложения приветствуются

0 ответов

Другие вопросы по тегам