gpt4 book ai didi

javascript - 如何在我的简单 Express 应用中使用 Node.js 集群?

转载 作者:IT老高 更新时间:2023-10-28 22:01:19 26 4
gpt4 key购买 nike

——我构建了一个简单的应用程序,它从 Redis 数据库中提取数据(50 项)并将其发送到本地主机。我做了一个 ApacheBench(c = 100,n = 50000),我在双核 T2080 @ 1.73GHz(我的 6 年笔记本电脑)上获得了 150 个请求/秒,但 proc 的使用非常令人失望,因为显示: enter image description here

只使用了一个核心,这与 Node 中的设计一致,但我认为如果我可以使用 Node.js 集群,我的请求数/秒几乎可以翻一番,达到约 300 个,甚至可能更多。我摆弄了很多,但我无法弄清楚如何放置 code given here与下面列出的我的应用程序一起使用:

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 密集型的,这会使 threads-a-gogo 之类的东西成为比集群更好的选择)。

希望得到一些帮助来解决这个问题。

最佳答案

实际上,您的工作负载并不是真正的 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 个虚拟字符串。

在我的机器上,我得到 475 req/s,node.js CPU 为 100%(这意味着这个双核机器上的 CPU 消耗为 50%)。让我们替换:

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/s,CPU 消耗为 100%(与最初的 475 req/s 相比)。

关于javascript - 如何在我的简单 Express 应用中使用 Node.js 集群?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10663809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com