Nodejs 并行请求越来越慢
Nodejs parallel requests are getting slower
我遇到节点问题,对于我添加到并行队列的每个网络请求,我获得网络响应的时间都会增加几毫秒,这正常吗?如果是,请告诉我为什么,他们不应该花同样的时间来回复吗?
设置:
本地响应服务器始终提供相同的 300KB JSON 响应。
查询方式:
const Q = require('q')
let queue = []
for (var i = 100; i > 0; i--) {
queue.push(getDamageInfo())
}
Q.allSettled(queue)
.then((result) => {})
const Q = require('q')
const request = require('request')
function getDamageInfo() {
id = '79d568d6-b820-40b4-845a-02228dcde338'
url = 'http://localhost:3001/damage/'
let deferred = Q.defer()
let start = new Date()
request.get(url + id , {
'auth': {
'bearer': token
}
}, (err, res, body) => {
let end = new Date() - start
console.log('get-damage-info: ' + id + ' %dms', end)
if(res.statusCode != 200) {
deferred.reject({statusCode: res.statusCode, error: err })
} else {
deferred.resolve(JSON.parse(body))
}
})
return deferred.promise
}
控制台输出:
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 43ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 44ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 46ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 48ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 51ms
.
.
.
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 223ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 224ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 225ms
我不明白为什么从请求 1 到请求 5 的 5 个并行请求的响应时间已经增加了将近 10 毫秒。所有尝试过的库(https、axios、请求)都会发生这种情况。
提前谢谢你,祝你有愉快的一天
其实也是意料之中的。您会在任何技术上看到相同的结果,这很自然,您发送到服务器的并发请求越多,它最终需要处理它们的时间就越多。
您的测试代码发送 100 个并发请求。
你要明白 Node.js 也是资源有限,最后 libuv
为 Node.js 实现异步的库使用了线程池,而且它有一系列的工作要做。因此,队列中的工作越多,您在完成工作之前需要等待的时间就越多。实际上有多个队列,但这是一个实现细节。
此外,最后,还有一些硬件限制,例如您的 CPU 中有所有 4 个核心,因此所有工作都由您的 CPU 执行。当您的计算机有更多工作要做时,它不会增加核心数量,但会减少整体响应时间。
我遇到节点问题,对于我添加到并行队列的每个网络请求,我获得网络响应的时间都会增加几毫秒,这正常吗?如果是,请告诉我为什么,他们不应该花同样的时间来回复吗?
设置:
本地响应服务器始终提供相同的 300KB JSON 响应。
查询方式:
const Q = require('q')
let queue = []
for (var i = 100; i > 0; i--) {
queue.push(getDamageInfo())
}
Q.allSettled(queue)
.then((result) => {})
const Q = require('q')
const request = require('request')
function getDamageInfo() {
id = '79d568d6-b820-40b4-845a-02228dcde338'
url = 'http://localhost:3001/damage/'
let deferred = Q.defer()
let start = new Date()
request.get(url + id , {
'auth': {
'bearer': token
}
}, (err, res, body) => {
let end = new Date() - start
console.log('get-damage-info: ' + id + ' %dms', end)
if(res.statusCode != 200) {
deferred.reject({statusCode: res.statusCode, error: err })
} else {
deferred.resolve(JSON.parse(body))
}
})
return deferred.promise
}
控制台输出:
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 43ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 44ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 46ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 48ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 51ms
.
.
.
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 223ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 224ms
get-damage-info: 79d568d6-b820-40b4-845a-02228dcde338 225ms
我不明白为什么从请求 1 到请求 5 的 5 个并行请求的响应时间已经增加了将近 10 毫秒。所有尝试过的库(https、axios、请求)都会发生这种情况。
提前谢谢你,祝你有愉快的一天
其实也是意料之中的。您会在任何技术上看到相同的结果,这很自然,您发送到服务器的并发请求越多,它最终需要处理它们的时间就越多。
您的测试代码发送 100 个并发请求。
你要明白 Node.js 也是资源有限,最后 libuv
为 Node.js 实现异步的库使用了线程池,而且它有一系列的工作要做。因此,队列中的工作越多,您在完成工作之前需要等待的时间就越多。实际上有多个队列,但这是一个实现细节。
此外,最后,还有一些硬件限制,例如您的 CPU 中有所有 4 个核心,因此所有工作都由您的 CPU 执行。当您的计算机有更多工作要做时,它不会增加核心数量,但会减少整体响应时间。