var cluster = require('cluster') var numCPUS = require('os').cpus().length if(cluster.isMaster){//主进程代码 console.log(numCPUS) for(var i=0;i<numCPUS;i++){ var worker = cluster.fork() } }else{ require('./app.js') } //pm2
nodejs开启多进程 ps aux | grep node 查看当前运行几个nodejs进程
守护进程setsid
node.js
nodebindings add-ons
nodebindings 接入:v8 libuv的eventloop libuv的io异步事件 dns
nodebindings通过系统调用 (os operation )libuv ,会存在循环队列中,libuv会把循环队列中的回调通过事件循环放在工作线程中执行,事件循环把回调结果通过系统调用os operation返回v8,同时吧循环队列中的事件清除掉,最后再到代码
add-ons 接入:ssl http zlib解压缩
libuv的eventloop 7个阶段
1.update timer 更新系统时间 为之后timer提供计时的下标,避免过多调用影响系统性能
2.run timer 运行timer settimeout setinterval
3.io/callback队列 文件读取,网络io
4.idle/prepare 在内部做一些事情,如果节点状态为active状态,每次事件循环都会调用 process.nexttick
5.io/poll阶段 调用各平台提供的io多路复用接口,执行io回调,调用循环队列中的事件,如果poll队列不为空,将会递归遍历事件循环同步执行callback队列,直到队列为空,如果poll队列为空,有setimmedate会立即进入,等待callback添加到队列中,然后立即执行,有超时timmer会回到timmer
6.check阶段 setimmediate
7.close callbacks 关闭io 链接断开,文件描述符的关闭