多核处理器上的节点Js

问题描述 投票:0回答:2

所以首先,我首先感觉到这是一个完全充实的问题,但无论如何请听我说。我在想,如果Node Js是单线程应用程序,那么我们可以在同一台机器的不同端口上运行它的多个实例。假设我有8个线程处理器,这意味着我可以在不影响性能的情况下运行8个节点实例。如果我安装了足够的内存,然后可以为这8个实例进行负载平衡

node.js windows google-chrome v8 processor
2个回答
1
投票

(这里是V8开发人员。)

是的,通常,在同一台计算机上运行Node的多个实例可以增加完成的工作总量。这类似于具有多个Chrome选项卡,每个选项卡都可以执行一些单线程JavaScript工作。

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

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

((2)V8确实出于内部目的(主要是编译和垃圾回收)使用了多个线程,这就是为什么单个Node实例可能(取决于工作负载)使用多个CPU内核/线程的原因之一。

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

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

长话短说:尝试无害。第一步,在一个实例上运行典型的工作负载,并查看当前的系统负载(CPU,内存,网络,磁盘)。如果它们[[all具有足够的空闲容量,请尝试转到两个实例,测量是否增加了总体吞吐量,然后再次检查系统负载。然后继续添加实例,直到您发现它不再有用为止。


0
投票
除了@jmrk提供的出色答案外,我想评论您问题的“不同端口”部分。

涉及多进程时,nodejs的最大优点之一就是Cluster Module。您可以运行1个进程并对其进行多次分叉,然后

您可以使它们都侦听同一端口。因此,例如,您不必使用Nginx管理所有端口。

并且如果要部署到可能具有不同内核数量的计算机群集中,则可以通过将OS Module引入游戏来动态地进行。

const cluster = require('cluster') if (cluster.isMaster) { // Creates the Forks process.title = 'my-node-app-master' const { length: numberOfProcs } = require('os').cpus() for (let i = 0; i < numberOfProcs; i++) { cluster.fork() } // and here you can fork again when one of the forks dies cluster.on('exit', (worker, code, signal) => { console.error(`worker ${worker.process.pid} died (${signal || code}). restarting it in a sec`) setTimeout(() => cluster.fork(), 1000) }) } else { // run your server const http = require('http') process.title = 'my-node-app-fork' http.Server((req, res) => { res.writeHead(200) res.end(`hello world from pid ${process.pid}\n`) }).listen(8000) }

process.title将有助于检查过程。我在机器上运行了该代码,我得到了:

$ ps aux | grep node-app daniel 8062 1.1 0.1 550008 31380 pts/1 Sl+ 12:27 0:00 my-node-app-master daniel 8069 0.5 0.1 549168 30476 pts/1 Sl+ 12:27 0:00 my-node-app-fork daniel 8070 0.3 0.1 549176 30644 pts/1 Sl+ 12:27 0:00 my-node-app-fork daniel 8077 0.5 0.1 549168 30376 pts/1 Sl+ 12:27 0:00 my-node-app-fork ... daniel 8157 0.3 0.1 549168 30668 pts/1 Sl+ 12:27 0:00 my-node-app-fork daniel 8194 0.0 0.0 9028 2468 pts/2 R+ 12:28 0:00 grep --color=auto node-app

然后提出几个要求:

$ curl http://localhost:8000 hello world from pid 8069 $ curl http://localhost:8000 hello world from pid 8070 $ curl http://localhost:8000 hello world from pid 8077

并且当您杀死一个子进程时

$ kill -9 8077

日志将显示

worker 8077 died (SIGKILL). restarting it in a sec

我知道这与您的主要问题没有直接关系,但是仍然有关系,我认为可以很好地利用这一问题。
© www.soinside.com 2019 - 2024. All rights reserved.