nodejs中cluster使用

摘自<Node.js即学即用>第3章

使用NODE中cluster利用多核CPU

 

[javascript]  view plain  copy
 
 print ? 在CODE上查看代码片 派生到我的代码片
  1. var cluster = require('cluster');  
  2. var http = require('http');  
  3. var numCPUs = require('os').cpus().length;  
  4. if (cluster.isMaster) {  
  5. // 创建工作进程  
  6. for (var i = 0; i < numCPUs; i++) {  
  7. cluster.fork();  
  8. }  
  9. cluster.on('death'function(worker) {  
  10. console.log('worker ' + worker.pid + ' died');  
  11. cluster.fork();//重启子进程  
  12. });  
  13. else {  
  14. // 工作进程创建http 服务器  
  15. http.Server(function(req, res) {  
  16. res.writeHead(200);  
  17. res.end("hello world\n");  
  18. }).listen(8000);  
  19. }  

 

通过消息传递来监控工作进程状态

 

[javascript]  view plain  copy
 
 print ? 在CODE上查看代码片 派生到我的代码片
  1. var cluster = require('cluster');  
  2. var http = require('http');  
  3. var numCPUs = require('os').cpus().length;  
  4. var rssWarn = (12 * 1024 * 1024)  
  5.     , heapWarn = (10 * 1024 * 1024)  
  6. if(cluster.isMaster) {  
  7.     for(var i=0; i<numCPUs; i++) {  
  8.         var worker = cluster.fork();  
  9.         worker.on('message'function(m) {  
  10.             if (m.memory) {  
  11.                 console.log(m.memory.rss,rssWarn)  
  12.                 if(m.memory.rss > rssWarn) {  
  13.                     console.log('Worker ' + m.process + ' using too much memory.')  
  14.                 }  
  15.             }  
  16.   
  17.         })  
  18.     }  
  19. else {  
  20. // 服务器  
  21.     http.createServer(function(req,res) {  
  22.         res.writeHead(200);  
  23.         res.end('hello world\n')  
  24.     }).listen(8000)  
  25. // 每秒报告一次状态  
  26.     setInterval(function report(){  
  27.         process.send({memory: process.memoryUsage(), process: process.pid});  
  28.     }, 1000)  
  29. }  

杀死僵尸进程

 

 

[javascript]  view plain  copy
 
 print ? 在CODE上查看代码片 派生到我的代码片
  1. var cluster = require('cluster');  
  2. var http = require('http');  
  3. var numCPUs = require('os').cpus().length;  
  4. var rssWarn = (50 * 1024 * 1024)  
  5.     , heapWarn = (50 * 1024 * 1024)  
  6. var workers = {}  
  7. if(cluster.isMaster) {  
  8.     for(var i=0; i<numCPUs; i++) {  
  9.         createWorker()  
  10.     }  
  11.     setInterval(function() {  
  12.         var time = new Date().getTime()  
  13.         for(pid in workers) {  
  14.             if(workers.hasOwnProperty(pid) &&  
  15.                 workers[pid].lastCb + 5000 < time) {  
  16.                 console.log('Long running worker ' + pid + ' killed')  
  17.                 workers[pid].worker.kill()  
  18.                 delete workers[pid]  
  19.                 createWorker()  
  20.             }  
  21.         }  
  22.     }, 1000)  
  23. else {  
  24. // 服务器  
  25.     http.Server(function(req,res) {  
  26. // 打乱200 个请求中的1 个  
  27.         if (Math.floor(Math.random() * 200) === 4) {  
  28.             console.log('Stopped ' + process.pid + ' from ever finishing')  
  29.             while(true) { continue }  
  30.         }  
  31.         res.writeHead(200);  
  32.         res.end('hello world from ' + process.pid + '\n')  
  33.     }).listen(8000)  
  34. // 每秒钟报告一次状态  
  35.     setInterval(function report(){  
  36.         process.send({cmd: "reportMem", memory: process.memoryUsage(),  
  37.             process: process.pid})  
  38.     }, 1000)  
  39. }  
  40. function createWorker() {  
  41.     var worker = cluster.fork()  
  42.     console.log('Created worker: ' + worker.pid)  
  43. // 允许开机时间  
  44.     workers[worker.pid] = {worker:worker, lastCb: new Date().getTime()-1000}  
  45.     worker.on('message'function(m) {  
  46.         if(m.cmd === "reportMem") {  
  47.             workers[m.process].lastCb = new Date().getTime()  
  48.             if(m.memory.rss > rssWarn) {  
  49.                 console.log('Worker ' + m.process + ' using too much memory.')  
  50.             }  
  51.         }  
  52.     })  
  53. }  

猜你喜欢

转载自longzhun.iteye.com/blog/2373652
今日推荐