6

質問:私が合理的になっている結果はありますか?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.getapp.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

4

4 に答える 4

19

同じマシンにインストールされた Linux で自分のアプリケーションをテストした結果、Windows では非常に遅かったと結論付けることができます。それが私の Windows インストールなのか、それともすべての Windows インストールなのか、よくわかりません。

変更なしの同じアプリケーションは、Linux で 3500 リクエスト/秒を処​​理できました。どちらが500%以上高速ですか...

私と同じような経験をしたことがある場合は、お気軽にここに投稿してください。これが Windows の問題かどうかを知りたいです。

最初に Linux を起動し、次に Windows を起動した同じマシンでのベンチマーク。

Linux   GET             R/s 3534    3494    3568    3580    3528
        CLUSTER GET     R/s 11987   11565   11950   12042   12056
        GET DB INSERT   R/s 2251    2201    2167    2207    2132
        GET DB SELECT   R/s 2436    2512    2407    2457    2496

Windows GET             R/s 725     730     721     760     723
        CLUSTER GET     R/s 3072    3129    3421    2912    3203
        GET DB INSERT   R/s 611     623     605     632     610
        GET DB SELECT   R/s 672     691     701     698     682
于 2012-02-11T22:57:16.847 に答える
10

ノードを「localhost」と呼ぶとノードの動作が非常に遅くなりますが、「127.0.0.1」と呼ぶと非常に速く動作することがわかりました。Windows での dns ルックアップが、実際にリクエストを遅くしていると思います。

于 2013-07-11T23:44:36.553 に答える
2

1 秒あたりのリクエスト数を減らすのにそのような影響を与える可能性のあるものはありますか?

テストで何かがノードを遅くしていると考えていると思います。ありません。ただし、最後にリンクするテストでは、Apacheの速度を低下させるものがあります。

静的ファイルを使用してApache をテストしていると言いますが、リンク先のベンチマークでは、Apache テストに PHP ファイルを使用しています。解釈されていないファイルを直接提供する Apache は、入手できる限りメタルに近いものです。しかし、PHP を追加すると、大量のオーバーヘッドが追加されます

したがって、テストでは、Apache vs. Node で Apache が勝利しますが、リンクしたものでは Apache + PHP vs. Node で Node が勝利します。

どちらの結果も私を驚かせるものではありません。

于 2012-02-11T19:37:09.937 に答える
1

単一の Node.js プロセスがあるのに対し、Apache は複数のプロセスまたはスレッドを使用してリクエストを処理することをご存知ですか? 単一のワーカー プロセスまたはスレッド用に Apache を構成するか、CPU コアと同じ数の Node.js プロセスを実行し、それらの間で負荷分散を行います。

于 2012-02-11T20:04:48.290 に答える