最近在学习 node 的多进程相关与 cluster 模块, 然后创建了一个单进程版的服务器与多进程版的服务器, 代码如下: 单进程版: https://github.com/zhangxiang958/ComputerNetworkLab/blob/master/Socket1_WebServer/source/server.js 多进程版: https://github.com/zhangxiang958/ComputerNetworkLab/blob/master/Socket1_WebServer/source/muti_process/server.js 单进程请直接使用 node 启动, 多进程版使用 cluster.js 来启动. 每个请求我会使用 sleep 函数阻塞 3 秒. 我的问题是: node 多进程下的服务器能否将响应时间缩短, 比如是 4 个请求同时处理, 一起返回, 而单进程只能一个一个请求地处理, 处理时间为多进程的 4 倍 ? 如果能, 如何解释使用 loadtest, 测试命令为 loadtest -c 10 -t 60 ${URL} 单进程与多进程的差别很小? 如果不能, cluster 到底真正用途是什么?
左图为单进程, 右图为多进程 测试命令为: 单进程 loadtest -c 10 -t 60 http://localhost:8081 多进程 loadtest -c 10 -t 60 http://localhost:8080/
恳求回答与斧正!
你的问题是:
- node 多进程下的服务器能否将响应时间缩短, 比如是 4 个请求同时处理, 一起返回, 而单进程只能一个一个请求地处理, 处理时间为多进程的 4 倍 ?
问题是不会,多进程只是加了 qps , 对请求时间没有影响。单进程也是4个请求同时处理,一起返回。你要在很多请求的条件下进行比较,如每秒 1万的请求看看,这样结果会表现出,多进程的没有变太慢,而单进程变慢了。
请看我的文章,深刻理解 node 中的异步 nodejs中异步
你开了一个餐厅,只卖黄焖鸡米饭,一个米饭厨师需要 10 分钟(sleep 10),服务员只是简单的下单然后告诉厨师,然后他就能接待其他客户了,你多招几个服务员(worker),只是增加了同时能下单的客户数,并不能减少烹饪时间
不错
你的 sleep 根本没阻塞,要真的阻塞你应该用 cpu 密集型代码实现
@William17 是的, 谢谢指正
@atian25 哈哈, 例子很生动, 感谢天猪大大解答
@htoooth 好的, 明白, 我自己压测过了 10000 并发的时候, 确实像你所说的单进程最长的请求时间要比多进程的最长请求时间慢. 另外我还有一个问题不知道能不能帮我解答一下, 就是使用 cluster 模块进行斐波那契函数的计算, 也就是关于 cluster 模块最经典的例子, 计算 4 个斐波那契函数的值, 在单进程下, 总任务时间是所有计算任务的总和, cluster 下总任务时间几乎是最长任务的时间, 那么在处理网络请求的时候不能按照这样的逻辑处理吗? 像下面天猪大大的例子中, 如果 cluster 增加的是服务员, 那么厨师是什么?
问题一: 总任务时间是所有计算任务的总和, cluster 下总任务时间几乎是最长任务的时间, 那么在处理网络请求的时候不能按照这样的逻辑处理吗?
网络请求时,这个处理逻辑跟请求分配给哪个 worker 算法相关,这个我还真不清楚。可能是随机的。不会出现你计算 pi 的效果。 在计算 pi 时,你是手动处理任务的分配逻辑,才会有这个效果。
问题二 :如果 cluster 增加的是服务员, 那么厨师是什么? 厨师是你的 cpu 计算任务
@htoooth 好的, 明白, 感谢回答
典型的应用如日志写入Endpoint,一个进程就能看出来,同样的并发,盯着top和free命令看,你会看到node的优势。