所以首先,我首先感觉到这是一个完全充实的问题,但无论如何请听我说。我在想,如果Node Js是单线程应用程序,那么我们可以在同一台机器的不同端口上运行它的多个实例。假设我有8个线程处理器,这意味着我可以在不影响性能的情况下运行8个节点实例。如果我安装了足够的内存,然后可以为这8个实例进行负载平衡
(这里是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具有足够的空闲容量,请尝试转到两个实例,测量是否增加了总体吞吐量,然后再次检查系统负载。然后继续添加实例,直到您发现它不再有用为止。
涉及多进程时,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
我知道这与您的主要问题没有直接关系,但是仍然有关系,我认为可以很好地利用这一问题。