首页 > 解决方案 > Javascript 并发请求脚本在 1 Gbps 网络上使用最大 80 Mbps

问题描述

我遇到了一个问题,我使用 60 个 http 代理在 JS 中运行 200 个并发 GET 请求。每个请求都下载一个 1.6 MB(兆字节)的文件。代理的速度为 300-400 毫秒。网络下载速度通常为 1000 Mbps 到 1500 Mbps(兆比特每秒)。我在 Windows Server 上运行此脚本。在此处查看屏幕截图:Ookla Speed test

async function sendRequest(kw, anchor, proxy, cb) {

    const [ip, port, user, pass] = proxy.split(':')
  
    var url = /*some api endpoint*/
    var options = {
        headers: {
            'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
            'accept-language': "en-US,en;q=0.9,fr;q=0.8",
            'cache-control': "max-age=0",
            'if-none-match': "W/\"701c0-GT5kESYD+JEYlkRTfHGT3PH+PTI\"",
            'sec-ch-ua': "\"Google Chrome\";v=\"89\", \"Chromium\";v=\"89\", \";Not A Brand\";v=\"99\"",
            'sec-ch-ua-mobile': "?0",
            'sec-fetch-dest': "document",
            'sec-fetch-mode': "navigate",
            'sec-fetch-site': "none",
            'sec-fetch-user': "?1",
            'upgrade-insecure-requests': "1"
        },
        proxy: {
          host: ip,
          port: port,
          auth: {
              username: user,
              password: pass
          }
      }
  
    }
  
    axios.get(url, options).then(res => cb(res))
  
  }
  
let proxies = [/*proxies go here*/]
  let kws = [/*keywords go here*/]
  
  let responses = []
  
  let starttime
  let finishtime
  
  function sendRequests(limit) {
    if (limit > kws.length) return console.log('limit exceeds request kws')
    for(let i = 0; i < limit; i++) {
      console.log('sending request......')
      sendRequest(kws[i], '50', proxies[i], function (res) {
        console.log('status: '+res.status)
        responses.push(res)
        if(responses.length == limit) {
          finishtime = returnTimeMilliseconds()
          console.log('Finished '+limit+' requests in ' + (finishtime - starttime)/1000 + ' seconds')
        }
      })  
    }
  }

  function returnTimeMilliseconds() {
    var d = new Date();
  
    return d.getTime()
  }

  starttime = returnTimeMilliseconds()
  sendRequests(200)

单个请求平均需要 1.5-2 秒。最多 5 个并发请求,请求从发送到最后一个请求在 1.5-2 秒内返回。考虑到并发的定义,这是有道理的。但是,当运行 10、20 或 200 等较大的数字时,第一个请求几乎总是需要很长时间才能解决 - 大约 5 到 10 秒 - 而所有请求的解决比率约为每秒 5 个请求.

在运行此程序时,我的网络使用率在任何时候都会达到 80 Mbps 最大值,这是通过在 Windows 上使用资源监视器发现的。

我在 2 个不同的 wifi 网络上运行了这个脚本,第一个是 30 Mbps 网络。我在那里经历了更长的等待时间,但整个 30 Mbps 都在使用,因此速度通常为 3.45 MBps(兆字节每秒)。在这里,速度应该是 125 到 187.5 MBps,但结果要小得多。

这里可能是什么问题?

标签: javascriptnode.jsnetworkingconcurrencyaxios

解决方案


推荐阅读