Nodejs如何充分利用多核CPU

Nodejs单进程带来的问题

大家都知道, nodejs是单进程单线程的,但是现在的服务器基本都是多核的,这导致了服务器资源的浪费,而且一旦程序出现未知异常, 就会使整个进程奔溃,导致服务不可用,那我们该如何来改善这样的情况呢?
注意nodejs在底层使用了libuv库来实现多线程IO操作,其对用户不可见。但是nodejs的主程序还是运行在单进程单线程上。

cluster模块实现多进程nodejs应用

const express = require("express")
const cluster = require("cluster")
const fs = require("fs")
const os = require("os")

if (cluster.isMaster) {
    console.log("master" + process.pid + "正在运行")
    const cpus = os.cpus().length
    for (let i = 0; i < cpus; i++) {
        cluster.fork()
    }
    cluster.on("exit", (worker, code, signal) => {
        console.log("工作进程" + worker.process.pid + "已退出")
    })
} else {
    const app = express()
    const pid = process.pid
    app.listen(3000, () => {
        console.log(`工作进程${cluster.worker.process.pid} is runing`)
    })

    app.get("/test", function (req, res, next) {
        console.log(`${cluster.worker.process.pid}`)
        fs.readFile('./package-lock.json', (err, data) => {
            res.send(data)
        })
    })
}

运行程序并且记录到server.log可以看到

node with-cluster.js > server.log
> [email protected] start /Users/xxxxx/node-fork
> node with-cluster

master23470正在运行
工作进程23472 is runing
工作进程23473 is runing
工作进程23476 is runing
工作进程23471 is runing
工作进程23474 is runing
工作进程23475 is runing
工作进程23478 is runing
工作进程23477 is runing

由于我的电脑是8核的,所以cluster会fork出来8个nodejs进程

使用R语言分析server.log

> df<-read.table(file="server.log")
> summary(df)
           V1      
 worker23476:2292  
 worker23477:2283  
 worker23472:2248  
 worker23478:2248  
 worker23474:2246  
 worker23473:2230  
 (Other)    :4299  
> 

可以看出来每个进程的nodejs接收到的请求很平均, cluster为我们自动做了负载均衡

你可能感兴趣的:(Nodejs如何充分利用多核CPU)