質問:私が合理的になっている結果はありますか?1秒あたりのリクエスト数を減らすのにそのような影響を与える可能性のあるものはありますか?
編集:私の友人がLinuxで同じアプリケーションのベンチマークを行ったところ、平均r/sは約7000でした。
編集#2: Node.exeのCPU使用率を確認しましたが、CPUの5〜6%しか使用していません。確かに、この数値は、クアッドコアマシンでは12%、本当に負荷がかかっている場合はシングルスレッドで実行する場合は8スレッドCPUである必要がありますか?
Node.jsアプリケーション(Node v0.6.10を実行)を作成し、apachebenchでベンチマークしましたab -c 256 -n 50000 http://localhost:3000/
。1秒あたり約650リクエストの1秒あたりのリクエスト数を取得しています。ここに配置するにはコードが多すぎますが、これが基本構造です。
アプリケーションの設定:
/**
* Module dependencies.
*/
var util = require('util'), //Useful for inspecting JSON objects
express = require('express'), //Express framework, similar to sinatra for ruby
connect = require('connect'), //An integral part of the express framework
app = module.exports = express.createServer(), //Create the server
io = require('socket.io').listen(app), //Make Socket.io listen on the server
parseCookie = require('connect').utils.parseCookie, //Parse cookies to retrieve session id
MemoryStore = require('connect').session.MemoryStore, //Session memory store
sessionStore = new MemoryStore(),
Session = require('connect').middleware.session.Session,
mongodb = require('mongodb'), //MongoDB Database
BSON = mongodb.BSONPure, //Used to serialize JSON into BSON [binary]
sanitize = require('validator').sanitize;
// Configuration
app.configure(function()
{
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({
store: sessionStore,
secret: '...',
key: 'express.sid'}));
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.configure('development', function(){
//app.use(express.errorHandler({dumpExceptions: true, showStack: true}));
});
app.listen(3000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
io.configure('development', function()
{
io.set('transports', ['websocket']);
//io.set('heartbeats', false);
//io.set('heartbeat timeout', 200);
//io.set('heartbeat interval', 220);
});
//MongoDB Database port and ip
var DATABASE_PORT = 27017;
var DATABASE_IP = "127.0.0.1"; //Localhost
/*
setInterval(function(){
console.log("BROWSING:\n" + util.inspect(browsing));
}, 1000);
*/
//Connected users
var validUsers = {};
var clients = {};
var browsing = {};
//Database handles
var users;
var projects;
//Connect to the database server
db = new mongodb.Db('nimble', new mongodb.Server(DATABASE_IP, DATABASE_PORT, {}, {}));
db.open(function (error, client)
{
if (error) {
console.error("Database is currently not running");
throw error;
}
users = new mongodb.Collection(client, 'users'); //Handle to users
projects = new mongodb.Collection(client, 'projects'); //Handle to projects
});
app.get('/', function(req, res)
{
//users.insert("test", {safe:true});
//users.findOne("test", function(result){})
if(req.session.auth)
{
if(req.session.account == "client")
{
//Redirect to the client dash
res.redirect('/dash');
}
else if (req.session.account == "developer")
{
res.redirect('/projects');
}
}
else
{
res.redirect('/login');
}
});
上記のコードとは別に、注目すべき残りのコードは一連のExpressハンドラーapp.get
とapp.post
イベントハンドラーだけです。
基本的なExpressセットアップWebサーバーと基本的なnode.jshttpWebサーバーで同じテストを実行しました。
Expressサーバーを使用したNode.js
var express = require('express');
var app = express.createServer();
app.get('/', function(req, res){
res.send();
});
app.listen(3000);
Node.js HTTP
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end();
}).listen(3000, "127.0.0.1");
結果は次のとおりです
。Node.jsでのExpress2200リクエスト/
秒で2000リクエスト/秒
Apache Webサーバーでホストされている静的ファイルに対して同じテストを実行しました:
1秒あたり6000リクエスト
このベンチマークは、Node.jsがApacheの手を打ち負かしていることを示しています。
http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php
関連するハードウェア仕様:
Intel i7 2630qm
6 GB RAM