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
> fork@1.0.0 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为我们自动做了负载均衡

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 很多Node.js初学者都会有这样的疑惑,Node.js到底是单线程的还是多线程的?通过本章的学习,能够让读者较为...
    越努力越幸运_952c阅读 9,033评论 4 36
  • 前言 通过前边的学习,大家应该已经充分理解了node的单线程只不过是js层面的单线程,是基于V8引擎的单线程,因为...
    白昔月阅读 10,041评论 3 13
  • # 模块机制 node采用模块化结构,按照CommonJS规范定义和使用模块,模块与文件是一一对应关系,即加载一个...
    RichRand阅读 7,317评论 0 3
  • 1. 简介 用户打开浏览器,其实就是打开了浏览器应用程序。那么什么是程序呢?我们常说浏览器是多线程的,JS 是单线...
    love丁酥酥阅读 8,854评论 0 6
  • 人的心情就像自然界的天气一样,总是在变。 我的心情更是一天从早到晚会经历春夏秋冬。 变化快! 今天由于与公司地址有...
    我是空无阅读 929评论 1 1