【发布时间】:2021-07-17 16:18:18
【问题描述】:
我设置了一个本地快递服务器:
const express = require('express');
const app = express();
app.get('/test', (request, response) => {
response.sendStatus(200);
});
const port = 3000;
app.listen(port, () => {});
然后我运行了一个脚本:
const axios = require('axios');
async function main() {
console.time('time');
const requests = Array(5000).fill().map(() => axios.get('http://localhost:3000/test'));
await Promise.all(requests);
console.timeEnd('time');
}
main();
我的问题是为什么这个脚本在我的机器上需要 3 秒?
我希望它需要几毫秒,就像任何其他 5000 次迭代的 for 循环一样。 因为我在本地运行服务器并通过 localhost 调用它,所以我预计不会有延迟,因此,promise 的等待时间应该几乎是 0。
谁能给我解释一下这是怎么回事?
另外,我怎样才能更快地同时处理多个请求?
编辑
看这里https://stressgrid.com/blog/webserver_benchmark/ 我希望我的单进程节点服务器能够无任何延迟地同时处理至少 20k 个请求。
所以我猜我的机器上缺少一些配置。启动节点服务器时可能有一些标志?
【问题讨论】:
-
很有可能您不会一次触发 5000 个请求。可能有一个使用的连接轮询。快速服务器也可能具有有限数量的请求句柄。总而言之,我想说 3 秒对于 5000 个请求来说是相当快的。为什么需要它更快?
-
那么,5000 个请求在 3 秒内?这是每个请求 0.6 毫秒。这有什么慢?请记住,nodejs 将您的 Javascript 作为单线程运行,因此每个请求都必须运行一些 http 服务器代码,然后是一些 Express 代码,然后是您的请求处理程序。并且只需要 0.6 毫秒就可以做到这一点。对于每个请求,还有一堆 TCP 堆栈代码在操作系统级别运行,但这可能在不同的线程中。而且,谁知道所有 Axios 在客户端都在做什么 - 在那里运行更多的单线程代码 - 其中一些将与其他请求并行,但仍然添加。
-
螃蟹,3秒5000个请求,还是很快的
-
0.6ms 对于现代系统中的纯开销来说相当慢