每秒发送数千个http请求

时间:2018-02-01 15:51:31

标签: javascript node.js performance http tcp

我想发送大量的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之后它并没有真正产生很大的不同。

1 个答案:

答案 0 :(得分:0)

我无法添加评论。但我认为因为并发请求限制。你可以在这个答案中阅读更多内容。

Why is node.js only processing six requests at a time?