Node项目通过cluster API充分利用多核CPU

默认的一个Node项目只有一个Master进程,通过cluster API来管理此进程,可以为每核增加一个worker,就叫分支进程吧

示例

var cluster = require(‘cluster‘);
var http = require(‘http‘);
//获取服务器的CPU核数
var numCPUs = require(‘os‘).cpus().length;
if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++) {
        //为CPU的每核创建一个分支进程
        cluster.fork();
    }
    cluster.on(‘death‘, function(worker) {
        console.log(‘Worker ‘ + worker.pid + ‘ died.‘);
    });
} else {
    http.Server(function(req, res) {
        res.writeHead(200);
        res.end(‘I am worker ID ‘ + process.env.NODE_CLUSTER_ID);
    }).listen(8000);
}

由于主进程与分支进程分别在不同的操作系统进程中,它们不能共享全局变量,cluster API提供了主进程与分支进程之间通信的方法

var cluster = require(‘cluster‘);
var http = require(‘http‘);
var numCPUs = require(‘os‘).cpus().length;
var workers = {};
var requests = 0;

if (cluster.isMaster) {
	for (var i = 0; i < numCPUs; i++) {
		workers[i] = cluster.fork();
		(function (i) {
			workers[i].on(‘message‘, function(message) {
				if (message.cmd == ‘incrementRequestTotal‘) {
					requests++;
					for (var j = 0; j < numCPUs; j++) {
						workers[j].send({
							cmd: ‘updateOfRequestTotal‘,
							requests: requests
						});
					}
				}
			});
		})(i);
	}
    cluster.on(‘death‘, function(worker) {
    	console.log(‘Worker ‘ + worker.pid + ‘ died.‘);
    });
} else {
	process.on(‘message‘, function(message) {
		if (message.cmd == ‘updateOfRequestTotal‘) {
			requests = message.requests;
		}
	});
	http.Server(function(req, res) {
		res.writeHead(200);
		res.end(‘Worker ID ‘ + process.env.NODE_WORKER_ID
			+ ‘ says cluster has responded to ‘ + requests
			+ ‘ requests.‘);
		process.send({cmd: ‘incrementRequestTotal‘});
	}).listen(8000);
}
时间: 2024-11-10 13:05:15

Node项目通过cluster API充分利用多核CPU的相关文章

linux 多核CPU性能调优

常常感觉系统资源不够用,一台机子上跑了不下3个比较重要的服务,但是每天我们还要在上面进行个备份压缩等处理,网络长时间传输,这在就很影响本就不够用的系统资源: 这个时候我们就可以把一些不太重要的比如copy/备份/同步等工作限定在一颗cpu上,或者是多核的cpu的一颗核心上进行处理,虽然这不一定是最有效的方法,但可以最大程度上利用了有效资源,降低那些不太重要的进程占用cpu资源: 查看系统下cpu信息: cat /proc/cpuinfo taskset就可以帮我们完成这项工作,而且操作非常简单:

Nginx 开启多核cpu配置

nginx默认是没有开启利用多核cpu的配置的.需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu; 需要在nginx配置里添加 worker_processes 和 orker_cpu_affinity 两个配置: 1.假设服务器是 4核 CPU 开启 4个进程: worker_processes 4;worker_cpu_affinity 0001 0010 0100 1000; 2.假设服务器是 8核 CPU 开启 8个进程: worker_processes

python多线程不能利用多核cpu,但有时候多线程确实比单线程快。

python 为什么不能利用多核 CPU  GIL 其实是因为在 python中有一个 GIL( Global Interpreter Lock),中文为:全局解释器锁.  1.最开始时候设计GIL是为了数据安全 python为了数据安全设计了这个 GIL. 2.每个 CPU在同一时间只能执行一个线程: (在单核 CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念. 但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同

[Node.js] Cluster,把多核用起来

引子 众所周知,虽然Node的底层有一个IO线程池,但其应用层默认是单线程运行的,对于多核CPU环境来说,是一种资源的浪费. 所幸Node提供了child_process 模块,让开发者得以开多个进程,实现每个进程各自利用一个CPU,以实现多核的利用. child_process 模块给予Node 可以随意创建子进程的能力.因为 child_process 类本身是一个 EventEmitter,所以进程间通信很容易:且父子进程间通信并不通过网络层,而是在内核中完成,高效. 但 child_pr

论Node在构建超媒体API中的作用

论Node在构建超媒体API中的作用 作者:chszs,转载需注明. 博客主页:http://blog.csdn.net/chszs 超媒体即Hypermedia,是一种採用非线性网状结构对块状多媒体信息(包含文本.图像.视频等)进行组织和管理的技术.超媒体的概念类似于早期的超文本.超文本的本质是在文本内容加上链接.这样就构成了超文本.超媒体也类似. 不管是超媒体还是超文本.使用的传输协议都是HTTP,这意味着超媒体能够被全部的浏览器所接受. 而描写叙述超媒体的类型我们使用MIME. MIME即

linux top cset schedtool 对于多核CPU,如何限制进程在一个CPU上运行

对于多核CPU,如何限制进程在一个CPU上运行呢? 如何察看某个进程在哪个CPU上运行: 在控制台中输入: #top -d 1 之后按下f.进入top Current Fields设置页面: 选中:j: P          = Last used cpu (SMP) 则多了一项:P 显示此进程使用哪个CPU. 经过试验发现:同一个进程,在不同时刻,会使用不同CPU Core.这应该是Linux Kernel SMP处理的. 本程序通过这个方法查看,将会在多个CPU上运行. 想要让它在一个CPU

为什么python的多线程不能利用多核CPU?

为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快. 一.python的多线程不能利用多核CPU? 原因: 因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能执行,在遇到I/O 操作时会释放这把锁. 如果是纯计算的程序,没有 I/O 操作,解释器会每隔100次操作就释放这把锁,让别的线程有机会 执行(这个次数可以通sys.setcheckinterval 来调整)同一时间只会有一个获得GIL线程在跑,其他线程都处

多核CPU上python多线程并行的一个假象

GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题.运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作中模仿,危险:) def dead_loop(): while True: pass dead_loop() 答案是什么呢,占用 100% CPU?那是单核!还得是没有超线程的古董 CPU.在我的双核 CPU 上,这个死循环只会吃掉我一个核的工作负荷,也就是只占用 50% CPU.那如何能让它在双核

python多线程为什么不能利用多核cpu

GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题.运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作中模仿,危险:) def dead_loop(): while True: pass dead_loop() 答案是什么呢,占用 100% CPU?那是单核!还得是没有超线程的古董 CPU.在我的双核 CPU 上,这个死循环只会吃掉我一个核的工作负荷,也就是只占用 50% CPU.那如何能让它在双核