2015-01-19 1 views
1

노드 HTTP 서버에서 최대 전송 속도를 끌어 내려고 테스트를 실행 중입니다. 그것은 단순한 서버입니다. 내 테스트에서는 50K 가상 클라이언트가 서버와 영구적으로 연결되어 있습니다 (이전에 ulimit -n 99999를 실행했습니다). 그런 다음 다른 포트에 대한 HTTP 연결 인 다른 이벤트가 발생하면 서버는 각 가상 클라이언트에 하나의 메시지를 전송합니다. 결국 모든 클라이언트는 해당 메시지를받습니다. 모든 메시지를 보내는 데 몇 분이 걸립니다. 몇 분이 아닌 초 단위로 50K 메시지를 보낼 수 있도록 이러한 측정을 향상시키는 데 도움이되는 권장 사항이 있습니까? 서버가 m1.medium AWS 인스턴스에서 실행 중입니다. 아이디어는 동일한 플랫폼으로 성능을 향상시키는 것입니다. 정말, 클러스터링에 관한 지금 모듈을 클러스터링 nodejs를 사용하여 충분한 수의노드 HTTP 서버의 최대 성능?

var http = require('http'); 
http.globalAgent.maxSockets = xxx; 
var https = require('https'); 
https.globalAgent.maxSockets = xxx; 

http://nodejs.org/api/http.html#http_agent_maxsockets 설정

var http = require("http"); 
var connectionResponse = []; 
var connectionIndex = 0; 

http.createServer(function(request, response) { 
    console.log("Received connection " + connectionIndex); 
    response.setTimeout(1200000, function() { 
    console.log("Socket timeout"); 
    }); 
    connectionResponse[connectionIndex] = response; 
    connectionIndex++; 

}).listen(8888); 

http.createServer(function(request, response) { 
    console.log("8887 connected - Will respond"); 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.write("Triggered all responses"); 
    response.end(); 

    console.log("Begin notifications:" + new Date().toISOString()); 

    for(var i = 0; i < connectionIndex; i++) { 
    connectionResponse[i].writeHead(200, {"Content-Type": "text/plain", "Content-Length": 4, "transfer-encoding" : ""}); 
    connectionResponse[i].write("CAFE"); 
    connectionResponse[i].end(); 
    } 
    console.log("End notifications" + new Date().toISOString()); 

}).listen(8887); 

답변

3

, http://nodejs.org/api/cluster.html

:

서버 코드를 복사 당신이하고 싶은 일에 달려 있습니다. 기본 예제는 비틀 거리기 전에 먼 길을 갈 수 있습니다. 예를 들어

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 

    cluster.on('exit', function(worker, code, signal) { 
    console.log('worker ' + worker.process.pid + ' died'); 
    }); 
} else { 
    // Workers can share any TCP connection 
    // In this case its a HTTP server 
    http.createServer(function(req, res) { 
    res.writeHead(200); 
    res.end("hello world\n"); 
    }).listen(8000); 
} 
+0

이 링크가 질문에 대답 할 수도 있지만 여기에 답의 핵심 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. – Ben

+0

고맙습니다. 이미 50K 소켓이 연결되어 있습니다. m1.medium 인스턴스에 2 개의 vcpu가 있기 때문에 클러스터링이 도움이 될 수 있습니다. 어쩌면 시간을 절반으로 줄일 수 있습니다. – rodolk

+0

@ Ben의 의견에 따라 코드를 추가했습니다. 클러스터링과 관련하여 특정 사례에 적응해야합니다. 연결된 소켓이 긴 폴링을하는 경우에는 초당 요청이라는 점이 더 흥미 롭습니다. 그걸 계산 해 봤니? –