Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 多核处理器上的节点Js_Node.js_Windows_Google Chrome_V8_Processor - Fatal编程技术网

Node.js 多核处理器上的节点Js

Node.js 多核处理器上的节点Js,node.js,windows,google-chrome,v8,processor,Node.js,Windows,Google Chrome,V8,Processor,所以,首先,我有一种直觉,这是一个完全充实的问题,但无论如何,请听我说完。我在想,如果NodeJS是一个单线程应用程序,那么我们可以在同一台机器的不同端口上运行它的多个实例。假设我有一个8线程的处理器,这是否意味着我可以有8个节点实例运行而不影响性能。如果我安装了足够的ram,那么我就可以对这8个实例进行负载平衡(这里是V8 developer) 是的,一般来说,在同一台机器上运行多个节点实例可以增加所完成的总工作量。这类似于有几个Chrome选项卡,每个选项卡都可以执行一些单线程JavaScr

所以,首先,我有一种直觉,这是一个完全充实的问题,但无论如何,请听我说完。我在想,如果NodeJS是一个单线程应用程序,那么我们可以在同一台机器的不同端口上运行它的多个实例。假设我有一个8线程的处理器,这是否意味着我可以有8个节点实例运行而不影响性能。如果我安装了足够的ram,那么我就可以对这8个实例进行负载平衡(这里是V8 developer)

是的,一般来说,在同一台机器上运行多个节点实例可以增加所完成的总工作量。这类似于有几个Chrome选项卡,每个选项卡都可以执行一些单线程JavaScript工作

也就是说,它很可能不像“8线程处理器上的8个实例提供的总吞吐量是8倍”那么简单,原因如下:

(1) 如果您实际上指的是“8个线程”,即4个内核+超线程,那么从4个进程到8个进程可能会带来20-40%的改进(取决于硬件体系结构和特定工作负载),而不是2倍

(2) V8确实在内部使用了多个线程(主要是编译和垃圾收集),这也是单个节点实例(取决于工作负载)可能会使用多个CPU核心/线程的原因之一

(3) 另一个原因是,虽然JavaScript是单线程的,但Node不仅仅执行JavaScript的单线程。在后台发生的各种事情(准备好后会触发JS回调)也需要CPU资源

(4) 最后,CPU不一定是您的瓶颈。如果您的服务器的性能受到网络或磁盘等因素的限制,那么产生更多的实例将无济于事;相反,这可能会让事情变得更糟


长话短说:尝试并没有坏处。作为第一步,在一个实例上运行一个典型的工作负载,并查看当前的系统负载(CPU、内存、网络、磁盘)。如果它们都有足够的空闲容量,请尝试访问两个实例,测量这是否会增加总体吞吐量,然后再次检查系统负载。然后继续添加实例,直到您注意到它不再有任何帮助。

除了提供的很好的答案之外,我还想对您问题中的“不同端口”部分进行评论

当涉及到多进程时,nodejs最大的优点之一就是。您可以运行一个进程并多次分叉,并且您可以使它们都侦听同一端口。例如,您不必使用Nginx管理所有端口

如果你想部署到一个可能有不同数量内核的计算机集群,你可以通过在游戏中引入内核来动态部署

const cluster=require('cluster'))
if(cluster.isMaster){
//创建分叉
process.title='我的节点应用程序主机'
const{length:numberOfProcs}=require('os').cpus()
for(设i=0;i{
console.error(`worker${worker.process.pid}已死亡(${signal | | code})。请稍后重新启动它`)
setTimeout(()=>cluster.fork(),1000)
})
}否则{
//运行您的服务器
const http=require('http')
process.title='我的节点应用程序分叉'
http.Server((请求,res)=>{
文书标题(200)
res.end(`helloworld from pid${process.pid}\n`)
}).听(8000)
}
流程。标题将有助于检查流程。我在我的机器上运行了那个代码我得到了这个:

$ps辅助| grep节点应用程序
丹尼尔8062 1.1 0.1 550008 31380分/1 Sl+12:27 0:00我的节点应用程序主机
丹尼尔8069 0.5 0.1 549168 30476分/1 Sl+12:27 0:00我的节点应用程序分叉
丹尼尔8070 0.3 0.1 549176 30644分/1 Sl+12:27 0:00我的节点应用程序分叉
丹尼尔8077 0.5 0.1 549168 30376分/1 Sl+12:27 0:00我的节点应用程序分叉
...
丹尼尔8157 0.3 0.1 549168 30668分/1 Sl+12:27 0:00我的节点应用程序分叉
丹尼尔8194 0.0 0.0 9028 2468分/2 R+12:28 0:00 grep--color=自动节点应用程序
然后是一些要求:

$curlhttp://localhost:8000
你好,来自pid 8069的世界
$curlhttp://localhost:8000
来自pid 8070的hello world
$curlhttp://localhost:8000
你好,来自pid 8077的世界
当你杀死一个子进程时

$kill-98077
日志将显示

工人8077死亡(SIGKILL)。马上重启

我知道这与你的主要问题没有直接关系,但它仍然是相关的,我认为人们可以充分利用这一点。

。为了回答您的问题,node
cluster
需要付出一些性能上的代价,您需要了解您的nodejs流程将做些什么谢谢这真的很有教育意义谢谢,这可能对我未来的项目有所帮助