복붙노트

[REDIS] 어떻게 간단한 익스프레스 응용 프로그램과 함께 Node.js를 클러스터를 사용합니까?

REDIS

어떻게 간단한 익스프레스 응용 프로그램과 함께 Node.js를 클러스터를 사용합니까?

- 나는 레디 스 DB의 데이터를 당긴 (50 개 항목) 및 로컬 호스트에 그것을 던져하는 간단한 응용 프로그램을 만들었습니다. 내가 ApacheBench했다 (C = 100, N = 50,000) 나는 듀얼 코어 T2080에 반 괜찮은 150 개 요청 / 초를 얻고 @ 1.73GHz (제 6 요 노트북),하지만 시저의 사용은 매우으로 실망 표시 :

하나의 코어 노드 디자인에 따라 인 사용,하지만 난 Node.js를 클러스터를 사용할 수 있는지 나는 거의, 어쩌면 더 ~ 300 내 요청 / 초를 두 배로 할 수 있다고 생각한다. 나는 꽤 주위에 바이올린을하지만 아래에 나열되어 내 응용 프로그램과 함께 사용하기 위해 여기에 주어진 코드를 삽입하는 방법을 알아낼 수 없었다 :

var 
    express = require( 'express' ),
    app     = express.createServer(),
    redis   = require( 'redis' ).createClient();

app.configure( function() {
    app.set( 'view options', { layout: false } );
    app.set( 'view engine', 'jade' );
    app.set( 'views', __dirname + '/views' );
    app.use( express.bodyParser() );
} );

function log( what ) { console.log( what ); }

app.get( '/', function( req, res ) {
    redis.lrange( 'items', 0, 50, function( err, items ) {
            if( err ) { log( err ); } else {
                res.render( 'index', { items: items } );
            }
    });
});

app.listen( 8080 );

나는 또한 응용 프로그램은 I / O 집약적 (안 CPU를 많이 사용하는 스레드-A-GOGO 같은 클러스터보다 더 나은 선택을 한 것)임을 강조하고 싶다.

이 아웃 파악에 도움이 싶어요.

해결법

  1. ==============================

    1.사실, 당신의 작업은 정말 아니다 / O 바인딩 :이 옥 기반의 동적 페이지 생성의 비용으로 인해 구속 CPU입니다. 나는 당신의 옥 템플릿의 복잡성을 생각하지만, 심지어 간단한 템플릿, HTML 페이지를 생성하는 비용이 없습니다.

    사실, 당신의 작업은 정말 아니다 / O 바인딩 :이 옥 기반의 동적 페이지 생성의 비용으로 인해 구속 CPU입니다. 나는 당신의 옥 템플릿의 복잡성을 생각하지만, 심지어 간단한 템플릿, HTML 페이지를 생성하는 비용이 없습니다.

    내 테스트를 위해 나는이 템플릿을 사용 :

    html(lang="en")
      head
        title Example
      body
        h1 Jade - node template engine
        #container
          ul#users
            each user in items
              li User:#{user}
    

    나는 레디 스에있는 항목의 키에 100 더미 문자열을 추가했다.

    내 상자에서, 나는 475 REQ를 얻을 수 / (이 듀얼 코어 상자에 50 %의 CPU 소비를 의미) 100 % Node.js를 CPU를이야. 의 교체하자 :

    res.render( 'index', { items: items } );
    

    으로:

    res.send( '<html lang="en"><head><title>Example</title></head><body><h1>Jade - node template engine</h1><div id="container"><ul id="users"><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li><li>User:NOTHING</li></ul></div></body></html>' );
    

    이제, 벤치 마크의 결과가 가까운 2700 REQ하는 것입니다 / S. 그래서 병목 현상으로 인해 HTML 페이지의 서식에 분명하다.

    이 상황에서 클러스터 패키지를 사용하는 것은 좋은 아이디어이며, 그것은 간단합니다. 다음과 같이 코드를 수정할 수 있습니다 :

    var cluster = require('cluster')
    
    if ( cluster.isMaster ) {
      for ( var i=0; i<2; ++i )
        cluster.fork();
    } else {
      var
          express = require( 'express' ),
          app     = express.createServer(),
          redis   = require( 'redis' ).createClient();
    
      app.configure( function() {
          app.set( 'view options', { layout: false } );
          app.set( 'view engine', 'jade' );
          app.set( 'views', __dirname + '/views' );
          app.use( express.bodyParser() );
      });
    
      function log( what ) { console.log( what ); }
    
      app.get( '/', function( req, res ) {
          redis.lrange( 'items', 0, 50, function( err, items ) {
                if( err ) { log( err ); } else {
                  res.render( 'index', { items: items } );
                }
          });
      });
    
      app.listen( 8080 );
    }
    

    이제 기준의 결과가 근접 750 REQ 인 / 100 % CPU 소비 S (초기 475 REQ / s와 비교되는).

  2. from https://stackoverflow.com/questions/10663809/how-do-i-use-node-js-clusters-with-my-simple-express-app by cc-by-sa and MIT license