Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在simple Express应用程序中使用Node.js群集?_Javascript_Node.js_Redis_Express_Cluster Computing - Fatal编程技术网

Javascript 如何在simple Express应用程序中使用Node.js群集?

Javascript 如何在simple Express应用程序中使用Node.js群集?,javascript,node.js,redis,express,cluster-computing,Javascript,Node.js,Redis,Express,Cluster Computing,-我构建了一个简单的应用程序,可以从Redis DB中提取数据(50项),并将其上传到localhost。我做了一台ApacheBench(c=100,n=50000),在双核T2080@1.73GHz(我的6 y.o笔记本电脑)上,我得到了每秒150个请求的速度,但proc的使用情况非常令人失望,如图所示: 只使用了一个内核,这与Node中的设计一致,但我认为如果我可以使用Node.js集群,我可以将每秒的请求数增加近一倍,达到~300,甚至更多。我花了不少时间,但我还没有弄清楚如何将应用程

-我构建了一个简单的应用程序,可以从Redis DB中提取数据(50项),并将其上传到localhost。我做了一台ApacheBench(c=100,n=50000),在双核T2080@1.73GHz(我的6 y.o笔记本电脑)上,我得到了每秒150个请求的速度,但proc的使用情况非常令人失望,如图所示:

只使用了一个内核,这与Node中的设计一致,但我认为如果我可以使用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密集型的,这可能比集群更好)


希望您能提供一些帮助来解决这个问题。

实际上,您的工作负载并不是真正的I/O限制:由于基于jade的动态页面生成的成本,它是CPU限制的。我猜不出您的jade模板有多复杂,但即使使用简单的模板,生成HTML页面也很昂贵

对于我的测试,我使用了以下模板:

html(lang="en")
  head
    title Example
  body
    h1 Jade - node template engine
    #container
      ul#users
        each user in items
          li User:#{user}
我向Redis中的items键添加了100个伪字符串

在我的设备上,node.js CPU为100%时,我得到475个请求/秒(这意味着这个双核设备上的CPU消耗为50%)。让我们替换:

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

res.send('ExampleJade-节点模板引擎
  • 用户:无
  • 用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无兴
  • 用户:无
  • 用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:无用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户:没事用户
  • 用户:无
);
现在,基准测试的结果接近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 );
}
var cluster=require('cluster'))
if(cluster.isMaster){

对于(var i=0;iwow,谢谢!),这非常有效-imgur.com/Cpqy6-我昨天花了大部分时间将其从80推到150,现在一个简单的if块让所有的工作看起来像花生一样。关于模板的说明非常有教育意义;我知道会有一些成本,但我认为不会是“475到2700”大。我可以优化Express吗?顺便说一句,我也想分享CPU统计数据-imgur.com/n7WPv-我有15个工作线程,但两个内核从未达到100%。我没有启用Redis持久性,所以它不应该触及磁盘,但大约30K的请求标志着我的磁盘旋转疯狂。我忽略了什么吗?性能瓶颈不是Express但是jade。你可以尝试另一个模板引擎(仍在使用express)。下面是一个列表:“性能瓶颈不是express而是jade。”-哎呀,我是说“jade”,但说的是“express”.你认为什么比Jade快?根据我自己的基准,最快的依次是Swig、nTenjin、thunder和doT。你应该尝试
NODE\u ENV=production NODE app.js
而不是
NODE app.js
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 );
}