美文网首页
Nodejs如何充分利用多核CPU

Nodejs如何充分利用多核CPU

作者: wildfox_9913 | 来源:发表于2019-10-17 00:10 被阅读0次

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

    相关文章

      网友评论

          本文标题:Nodejs如何充分利用多核CPU

          本文链接:https://www.haomeiwen.com/subject/jpauyctx.html