HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

Node.js cluster(for using Multi Core CPU)

node.js는 기본적으로 싱글 스레드 기반입니다. 따라서 싱글 코어 CPU에서는 CPU 자원을 전부(?) 쓸 수 있는데요. 하지만 멀티 코어 CPU가 보편화 된 추세에 일반적으로만 node.js를 쓴다면 서버 CPU 자원이 낭비가 될겁니다.

이번 포스팅은 가용한 모든 CPU 코어를 사용할 수 있게 해주는 모듈인 cluster에 대해 알아봅니다.

Ready to Work

이번 포스팅을 위한 Cluster에 대한 정보는 nodejs.org - cluster에서 원문으로 보실 수 있습니다.

Node.js 설치를 위한 다운로드는 nodejs.org - Download를 참조하세요.

Example

실행 테스트를 위해서 별도의 디렉토리를 만들었습니다. 저는 /your/path/nodejs/cluster라고 만들었습니다. 앞으로의 쉘 커맨드는 해당 경로에서부터 시작합니다.

Source Code

API 문서에서 제공하는 소스 코드에서 살짝 변경을 가했습니다. 제가 express 프레임워크를 사용하는 관계로 해당 프레임워크를 이용한 웹 서버를 띄우도록 변경했습니다. :)

// cluster.js
var cluster = require('cluster'); // 클러스터 모듈 로드
var express = require('express'); // express 프레임워크 로드
var numCPUs = require('os').cpus().length; // CPU 개수 가져오기
var SERVER_PORT = 8000; // 애플리케이션 포트 지정

if (cluster.isMaster) { // 마스터 처리
	for (var i = 0; i < numCPUs; i++) {
		cluster.fork(); // CPU 개수만큼 fork
	}
	// 워커 종료시 다잉 메시지 출력
	cluster.on('exit', function(worker, code, signal) {
		console.log('worker ' + worker.process.pid + ' died');
	});
}
else { // 워커 처리

	console.log( 'current worker pid is ' + process.pid );
	var app = express();
	app.get('/', function(req, res){
		console.log( 'execute worker pid is ' + process.pid );
		res.send('execute wokrer pid is ' + process.pid );
	});

	var server = app.listen(SERVER_PORT, function () {

		var host = server.address().address;
		var port = server.address().port;

		console.log('app listening at http://%s:%s', host, port);
	});
}

Execute App

만약 위의 소스 코드를 실행해보시려면 express를 설치해야 합니다.

$ npm install express
# 만약 package.json 사용중이면 --save 옵션을 추가하셔도 됩니다.

설치가 끝나면 아래의 커맨드를 이용해 애플리케이션을 띄울 수 있습니다.

$ node cluster.js
current worker pid is 5284
current worker pid is 3884
current worker pid is 5400
current worker pid is 3020
app listening at http://localhost:8000
app listening at http://localhost:8000
app listening at http://localhost:8000
app listening at http://localhost:8000

Test

정말로 잘 돌아가는지 확인을 하려면 여러가지 방법이 있겠지만 저는 Apache JMeter를 이용했습니다. 사용법은 build web test plan에서 확인 가능합니다.

여튼, 이것으로 테스트를 해보면 서버 콘솔에서 다음과 같은 결과를 얻을 수 있습니다.

...
execute worker pid is 5284
execute worker pid is 5284
execute worker pid is 5284
...
execute worker pid is 3020
...

코어를 놀리지 않고 전부 다 쓰는 알뜰한 애플리케이션이 되겠네요.

Closing Remarks

멀티 코어 CPU를 최대한 활용할 수 있는 node.js cluster 모듈에 대해 알아봤습니다. :D