- 浏览: 83538 次
文章分类
- 全部博客 (136)
- 我的技术资料收集 (98)
- 具体技术 (1)
- 的技术资料收集 (4)
- All Articles (1)
- 机器学习 Machine Learning (1)
- 网络编程 (1)
- java (2)
- ava (1)
- 零散技术 (1)
- C# (3)
- 技术资料收集 (1)
- CQRS (1)
- 数据库技术(MS SQL) (1)
- .Net微观世界 (1)
- Oracle SQL学习之路 (1)
- C/C++ (1)
- JS/JQ (1)
- Js封装的插件/实例/方法 (2)
- 敏捷个人 (2)
- Javascript (1)
- 程序设计---设计模式 (1)
- Bug (1)
- 未知分类 (1)
- 程序设计 (1)
- Sharepoint (1)
- Computer Graphic (1)
- IT产品 (1)
- [06]JS/jQuery (1)
- [07]Web开发 (1)
- .NET Solution (1)
- Android (3)
- 机器学习 (1)
- 系统框架设计 (1)
- Others (1)
- 算法 (1)
- 基于Oracle Logminer数据同步 (1)
- 网页设计 (1)
- 原创翻译 (1)
- EXTJS (1)
- Jqgrid (1)
- 云计算 (1)
最新评论
前述
我们都知道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下的多进程开发进行学习研究,并将总结进行分享。
发表评论
-
C#WebBrowser控件使用教程与技巧收集--苏飞收集 - sufeinet
2013-06-28 12:07 1066原帖地址:http://www.cnblogs.com/suf ... -
我要喷一个自认为很垃圾的网站架构 - 老赵【苏州】
2013-06-28 12:01 1125原帖地址:http://www.cnblogs.com/lao ... -
[翻译] Oracle Database 12c 新特性Multitenant - Cheney Shue
2013-06-28 11:43 619原帖地址:http://www.cnblogs.com/ese ... -
memcahd 命令操作详解 - 阿正-WEB
2013-06-28 11:37 468原帖地址:http://www.cnblogs.com/azh ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 592原帖地址:http://www.cnblogs.com/ste ... -
面向过程的代码符合大众的思维方式吗? - 史蒂芬.王
2013-06-27 10:28 556原帖地址:http://www.cnblogs.com/ste ... -
RPG游戏之组队测试 - zthua
2013-06-27 10:22 556原帖地址:http://www.cnblogs.com/zth ... -
IT人们给个建议 - SOUTHER
2013-06-26 14:06 521原帖地址:http://www.cnblogs.com/sou ... -
Java向前引用容易出错的地方 - 银河使者
2013-06-26 14:00 491原帖地址:http://www.cnblogs.com/nok ... -
使用Func<T1, T2, TResult> 委托返回匿名对象 - 灰身
2013-06-26 13:54 798原帖地址:http://www.cnblo ... -
【web前端面试题整理03】来看一点CSS相关的吧 - 叶小钗
2013-06-25 10:45 781原帖地址:http://www.cnblogs.com/yex ... -
Windows 8 动手实验系列教程 实验6:设置和首选项 - zigzagPath
2013-06-25 10:27 616原帖地址:http://www.cnblogs.com/zig ... -
闲聊可穿戴设备 - shawn.xie
2013-06-25 10:21 561原帖地址:http://www.cnblo ... -
CentOS下Mysql安装教程 - 小学徒V
2013-06-23 15:24 606原帖地址:http://www.cnblogs.com/xia ... -
vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化) - skyme
2013-06-23 15:18 835原帖地址:http://www.cnblogs.com/sky ... -
之前专门为IE6、7开发的网站如何迁移到IE10及可能遇到的问题和相应解决方案汇总 - 海之澜
2013-06-23 15:12 946原帖地址:http://www.cnblogs.com/wuz ... -
Android学习笔记--解析XML之SAX - 承香墨影
2013-06-23 15:01 406原帖地址:http://www.cnblo ... -
SQL Server 性能优化之——T-SQL TVF和标量函数
2013-06-19 09:32 667原帖地址:http://www.cnblogs.com/Boy ... -
Nginx学习笔记(二) Nginx--connection&request
2013-06-19 09:26 662原帖地址:http://www.cnblogs.com/cod ... -
从郭美美霸气侧漏看项目管理之项目经理防身术
2013-06-19 09:20 497原帖地址:http://www.cnblogs.com/had ...
相关推荐
本篇文章主要介绍了Nodejs中解决cluster模块的多进程如何共享数据问题,有需要的可以了解一下。
在Node.js中,由于JavaScript是基于单线程的,它启动时默认是单进程单线程,但可以通过Node.js提供的模块和API创建子进程,形成多进程环境。Node.js使用的是事件驱动、非阻塞I/O模型,使得它即使在单线程中也能高效...
从同步到复制进程,再到多线程,直至现在的事件驱动多进程架构。Node.js采用的是事件驱动、非阻塞I/O模型,使得Node.js在高并发场景下表现卓越。使用node-worker.js启动工作进程时,它会监听1000到2000之间的随机...
前言 我们都知道nodejs最大的特点就是单进程、无阻塞运行,并且是异步事件驱动的。Nodejs的这些特性能够很好的解决一些...目前,已经有不少第三方的Node.js多进程支持模块发布,而NodeJS 0.6.x 以上的版本提供了一个c
在Node.js中,当需要创建多...通过监听和发送消息,可以有效地在不同进程间传递信息,实现数据的共享和同步,从而提高多进程环境下的程序性能。在实际开发中,根据应用需求和场景选择合适的资源共享策略是至关重要的。
NodeJS引入了Cluster模块试图简化这些体力劳动,使用Cluster模块可以运行并管理多个实例进程,下面这篇文章主要给大家介绍了关于Node.js中cluster模块的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧
还可以利用cluster模块实现多进程,充分利用多核处理器。 总结,NodeJS以其独特的非阻塞I/O模型和JavaScript编程能力,为开发者提供了构建高性能网络应用的可能。理解其核心概念,掌握好模块化、网络编程和异步处理...
了解NodeJS集群模块 统计数据显示,Node.js作为服务器端运行时环境正变得越来越流行,尤其是对于高流量的网站而言。 而且,几个框架的可用性使其成为快速原型制作的良好环境。 Node.js具有事件驱动的体系结构,利用...
这在执行外部命令、多进程并行计算或者分隔任务时非常有用。子进程可以通过`spawn()`、`exec()`、`execFile()`等方式创建,并通过`stdio`或IPC通道进行通信。 四、信号处理 操作系统通过信号来通知进程发生特定...
Node.js 提供了 child_process 和 cluster 两个模块可用于创建多子进程 下面我们就分别使用单线程和多进程来模拟查找大量斐波那契数进行 CPU 密集测试 以下代码是查找 500 次位置为 35 的斐波那契数(方便测试,
此外,NodeJS的`cluster`模块在0.5.10版本以后引入,能够自动根据系统CPU数量创建多个工作进程,共享同一端口,简化了多进程管理。 事件驱动编程是NodeJS另一个关键特性,几乎所有I/O操作都是基于事件回调的,这样...
描述中指出,这个项目对Express进行了简单的封装,使得在使用时能够更便捷地实现多进程操作,特别是通过`cluster`模块来实现。同时,它还解决了在多进程环境下session保持的问题,这是分布式系统中常见的挑战。此外...
- **Child Process**:Node.js通过子进程模块处理多进程通信。 - **Cluster模块**:利用集群共享同一端口,平衡负载到多个工作进程。 8. **路由与中间件** - 在构建Web应用时,Node.js通常结合Express或Koa等...
Cluster模块允许Node.js应用利用多核处理器,通过工作进程(worker process)分散负载,提高性能。 **10. 安全性** Node.js的安全性主要依赖于良好的编程习惯和使用安全的库。例如,使用crypto模块进行加密,使用...
4. **进程与线程**:Node.js主进程管理多个工作线程,但通常大部分代码都在单线程中执行,利用事件循环处理并发。 5. **V8引擎**:V8引擎是Node.js的JavaScript执行引擎,能快速解析和执行JavaScript代码。 **二、...