我想发送大量的http请求以加载测试服务器。每个请求都必须创建一个新连接,并且应该等到收到响应后再关闭连接 此外,对于生成新URL的每个请求,我都无法将请求发送到同一URL。
起初我认为使用http.request可能是最聪明的方式,因为它是一个原生模块。所以我尝试了这个:
for(let i=0; i<100; i++) {
setInterval(()=>{
if (reqCount >= maxConcurrentRequests)
return
reqCount++
const req = http.request({
hostname: config.hostname,
port: config.port,
path: getRandomPath(),
method: 'GET',
agent:false
},()=>{
reqCount--
showPerformance() // is used to calculate and display performance
})
req.on('error', (e) => {
failedCount++
})
req.end()
},0);
}
首先它每秒发送大约600个请求,然后在大约10秒后,它开始下降并在10秒左右内降至每秒5-20个请求。
然后我决定再降低一级并创建我自己的http数据包并使用带有net
模块的tcp套接字直接发送它们:
for(let i=0; i<100; i++) {
setInterval(()=>{
if (reqCount >= maxConcurrentRequests)
return
reqCount++
const socket = new net.Socket()
socket.connect(config.port, config.hostname, () => {
socket.write(`GET http://${config.hostname}:${config.port}/${getRandomPath()} HTTP/1.1\r\nhostname: ${config.hostname}\r\nconnection: close\r\n\r\n`)
})
socket.on("data", data => {
reqCount--
showPerformance() // is used to calculate and display performance
})
socket.on("error", err => {
failedCount++
})
},0);
}
但结果几乎相同。
为什么会发生这种情况?在负载测试运行时,我的网络带宽甚至没有耗尽,服务器应该能够轻松地每秒处理超过600个请求。节点进程的RAM使用率似乎保持在50.000k到100.000k之间,CPU使用率约为1-3%。
我用10,100甚至1000个并发连接尝试了它,但在100之后它并没有真正产生很大的不同。
答案 0 :(得分:0)
我无法添加评论。但我认为因为并发请求限制。你可以在这个答案中阅读更多内容。