`

关于Nodejs的多进程模块Cluster

阅读更多
原帖地址:http://www.cnblogs.com/CodeGuy/archive/2013/05/24/3096601.html

前述


  我们都知道nodejs最大的特点就是单进程、无阻塞运行,并且是异步事件驱动的。Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。既然Node.js采用单进程、单线程模式,那么在如今多核硬件流行的环境中,单核性能出色的Nodejs如何利用多核CPU呢?创始人Ryan Dahl建议,运行多个Nodejs进程,利用某些通信机制来协调各项任务。目前,已经有不少第三方的Node.js多进程支持模块发布,而NodeJS 0.6.x 以上的版本提供了一个cluster模块 ,允许创建“共享同一个socket”的一组进程,用来分担负载压力。本篇文章就基于该cluster模块来讲述Node.js在多核CPU下的编程。


Cluster模块介绍


  nodejs所提供的cluster模块目前尚处于试验阶段,在v0.10.7的官方文档上我们可以看到模块的发布信息如下:



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进程来分担负载。


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,linux和Solaris上,只要某个子进程的accept queue为空(通常为最后创建的那个子进程),系统就会将多个connetion分配到同一个子进程上,这会造成进程间负载极为不均衡。特别是在使用长连接的时候,单位时间内的new coming connection并不高,子进程的accept queue往往均为空,就会导致connection会不停的分配给同一个进程。所以这种负载均衡完全依赖于accept queue的空闲程度,只有在使用短连接,而且并发非常高的情况下,才能达到负载均衡,但是这个时候系统的load会非常高,系统也会变得不稳定起来。


后记


  后续笔者还将就nodejs下的多进程开发进行学习研究,并将总结进行分享。


 


 

本文链接

分享到:
评论

相关推荐

    Nodejs中解决cluster模块的多进程如何共享数据问题

    本篇文章主要介绍了Nodejs中解决cluster模块的多进程如何共享数据问题,有需要的可以了解一下。

    06-nodejs多进程.md

    在Node.js中,由于JavaScript是基于单线程的,它启动时默认是单进程单线程,但可以通过Node.js提供的模块和API创建子进程,形成多进程环境。Node.js使用的是事件驱动、非阻塞I/O模型,使得它即使在单线程中也能高效...

    nodejs 内部资料 进程管理

    从同步到复制进程,再到多线程,直至现在的事件驱动多进程架构。Node.js采用的是事件驱动、非阻塞I/O模型,使得Node.js在高并发场景下表现卓越。使用node-worker.js启动工作进程时,它会监听1000到2000之间的随机...

    Node.js中多进程模块Cluster的介绍与使用

    前言 我们都知道nodejs最大的特点就是单进程、无阻塞运行,并且是异步事件驱动的。Nodejs的这些特性能够很好的解决一些...目前,已经有不少第三方的Node.js多进程支持模块发布,而NodeJS 0.6.x 以上的版本提供了一个c

    NodeJS父进程与子进程资源共享原理与实现方法

    在Node.js中,当需要创建多...通过监听和发送消息,可以有效地在不同进程间传递信息,实现数据的共享和同步,从而提高多进程环境下的程序性能。在实际开发中,根据应用需求和场景选择合适的资源共享策略是至关重要的。

    Node.js中的cluster模块深入解读

    NodeJS引入了Cluster模块试图简化这些体力劳动,使用Cluster模块可以运行并管理多个实例进程,下面这篇文章主要给大家介绍了关于Node.js中cluster模块的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧

    NodeJS开发指南_nodejs开发指南_

    还可以利用cluster模块实现多进程,充分利用多核处理器。 总结,NodeJS以其独特的非阻塞I/O模型和JavaScript编程能力,为开发者提供了构建高性能网络应用的可能。理解其核心概念,掌握好模块化、网络编程和异步处理...

    NodeCluster:了解NodeJS集群模块

    了解NodeJS集群模块 统计数据显示,Node.js作为服务器端运行时环境正变得越来越流行,尤其是对于高流量的网站而言。 而且,几个框架的可用性使其成为快速原型制作的良好环境。 Node.js具有事件驱动的体系结构,利用...

    Node.js-管理你NodeJS进程的生命周期

    这在执行外部命令、多进程并行计算或者分隔任务时非常有用。子进程可以通过`spawn()`、`exec()`、`execFile()`等方式创建,并通过`stdio`或IPC通道进行通信。 四、信号处理 操作系统通过信号来通知进程发生特定...

    Node.js 多进程处理CPU密集任务的实现

    Node.js 提供了 child_process 和 cluster 两个模块可用于创建多子进程 下面我们就分别使用单线程和多进程来模拟查找大量斐波那契数进行 CPU 密集测试 以下代码是查找 500 次位置为 35 的斐波那契数(方便测试,

    一个前端工程师眼里的NodeJS.pdf

    此外,NodeJS的`cluster`模块在0.5.10版本以后引入,能够自动根据系统CPU数量创建多个工作进程,共享同一端口,简化了多进程管理。 事件驱动编程是NodeJS另一个关键特性,几乎所有I/O操作都是基于事件回调的,这样...

    jinwei_nodejs_express

    描述中指出,这个项目对Express进行了简单的封装,使得在使用时能够更便捷地实现多进程操作,特别是通过`cluster`模块来实现。同时,它还解决了在多进程环境下session保持的问题,这是分布式系统中常见的挑战。此外...

    nodeJS code demo

    - **Child Process**:Node.js通过子进程模块处理多进程通信。 - **Cluster模块**:利用集群共享同一端口,平衡负载到多个工作进程。 8. **路由与中间件** - 在构建Web应用时,Node.js通常结合Express或Koa等...

    NodeJS代码

    Cluster模块允许Node.js应用利用多核处理器,通过工作进程(worker process)分散负载,提高性能。 **10. 安全性** Node.js的安全性主要依赖于良好的编程习惯和使用安全的库。例如,使用crypto模块进行加密,使用...

    NodeJs高级编程英文版

    4. **进程与线程**:Node.js主进程管理多个工作线程,但通常大部分代码都在单线程中执行,利用事件循环处理并发。 5. **V8引擎**:V8引擎是Node.js的JavaScript执行引擎,能快速解析和执行JavaScript代码。 **二、...

Global site tag (gtag.js) - Google Analytics