javascript - 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,但结果要小得多。
这里可能是什么问题?
解决方案
推荐阅读
- python - 为什么 subprocess.run() 不显示完整的结果?
- php - 编辑 html 表行并使用 php 将其更新为 mysql 表
- javascript - Javascript createElement 和追加子节点
- go - 在运行时选择实现而不使用 switch 语句
- javascript - 有没有办法在 React div 中渲染对象?
- php - AJAX 调用过多
- laravel - 带有条纹范围问题的功能测试 Laravel Cashier?
- c# - 如何通过“验证来电显示”值在 AD 中查找计算机
- spring - Cassandra 配置未初始化
- jquery - 当标题是{{变量}}时,如何使用Jquery从表中获取(标题)文本