關於Nodejs的多進程模塊Cluster

關於Nodejs的多進程模塊Cluster

 

前述

  咱們都知道nodejs最大的特色就是單進程、無阻塞運行,而且是異步事件驅動的。Nodejs的這些特性可以很好的解決一些問題,例如在服務器開發中,併發的請求處理是個大問題,阻塞式的函數會致使資源浪費和時間延遲。經過事件註冊、異步函數,開發人員能夠提升資源的利用率,性能也會改善。既 然Node.js採用單進程、單線程模式,那麼在現在多核硬件流行的環境中,單核性能出色的Nodejs如何利用多核CPU呢?創始人Ryan Dahl建議,運行多個Nodejs進程,利用某些通訊機制來協調各項任務。目前,已經有很多第三方的Node.js多進程支持模塊發佈,而NodeJS 0.6.x 以上的版本提供了一個cluster模塊 ,容許建立「共享同一個socket」的一組進程,用來分擔負載壓力。本篇文章就基於該cluster模塊來說述Node.js在多核CPU下的編程。html

Cluster模塊介紹

  nodejs所提供的cluster模塊目前尚處於試驗階段,在v0.10.7的官方文檔上咱們能夠看到模塊的發佈信息以下:node

Stability: 1 - Experimental

關於該模塊的功能,源文檔描述如此「A single instance of Node runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node processes to handle the load.」 其意就是:Node的示例以單進程的模式運行,有時爲了充分利用多核系統的資源用戶須要運行一組Node進程來分擔負載。linux

Cluster用法介紹

  首先貼出一段該模塊示例應用代碼,接下來進行詳細分析,代碼以下:編程

複製代碼
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  require('os').cpus().forEach(function(){
    cluster.fork();
  });
  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  });
  cluster.on('listening', function(worker, address) {  
    console.log("A worker with #"+worker.id+" is now connected to " +
     address.address +
    ":" + address.port);  
  }); 
} else {
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world\n");
    console.log('Worker #' + cluster.worker.id + ' make a response');
  }).listen(8000);
}
複製代碼

這段代碼很簡單,主線程就是當前運行的js文件,主線程根據你本機系統的核數來建立子進程。全部進程共享一個監聽端口8000,當有請求發起時,主 線程會將該請求隨機分配給某個子進程。console.log('Worker #' + cluster.worker.id + ' make a response');這句代碼能夠打印出是哪一個進程處理該請求。windows

問題分析

  咱們前面提到有請求發起時,由系統來決定將該請求交給哪一個進程進行處理。這種徹底依賴於系統的負載均衡存在着一個重要缺陷:在 windows,linux和Solaris上,只要某個子進程的accept queue爲空(一般爲最後建立的那個子進程),系統就會將多個connetion分配到同一個子進程上,這會形成進程間負載極爲不均衡。特別是在使用長 鏈接的時候,單位時間內的new coming connection並不高,子進程的accept queue每每均爲空,就會致使connection會不停的分配給同一個進程。因此這種負載均衡徹底依賴於accept queue的空閒程度,只有在使用短鏈接,並且併發很是高的狀況下,才能達到負載均衡,可是這個時候系統的load會很是高,系統也會變得不穩定起來。服務器

 

轉自(http://www.cnblogs.com/CodeGuy/archive/2013/05/24/3096601.html)併發

相關文章
相關標籤/搜索