Работает ли Node.js плохо в Windows, конечно, он не может быть медленнее, чем apache для базового ввода-вывода - PullRequest
5 голосов
/ 11 февраля 2012

Вопрос: Является ли результат, который я получаю разумным?Есть ли что-то, что может оказать такое влияние на уменьшение количества запросов в секунду?

Редактировать: Мой друг только что проверил одно и то же приложение в Linux и среднее значение r / sбыло около 7000.

Редактировать # 2: Я проверил использование процессора Node.exe, и он использует только 5-6% процессорного времени.Конечно, эта цифра должна составлять 12% на четырехъядерном компьютере, 8-поточном ЦП при работе в одном потоке, если он действительно загружен?

Я написал приложение Node.js (работает с Node v0.6.10)оценил его с помощью apachebench: ab -c 256 -n 50000 http://localhost:3000/.Я получаю количество запросов в секунду примерно 650 запросов в секунду .Здесь слишком много кода для размещения, но это основная структура:

Настройки приложения:

/**
 * 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 и на веб-сервере basic node.js http.

Node.js с сервером Express

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");

Результаты: 2000 запросов в секунду на экспресс2200 запросов в секунду на Node.js

Я провел такой же тест для статического файла, размещенного на веб-сервере Apache:6000 запросов в секунду

Теперь этот тест показывает, как Node.js побеждает Apache!http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php Моя соответствующая спецификация оборудования: Intel i7 2630qm6 ГБ ОЗУ

Ответы [ 4 ]

12 голосов
/ 12 февраля 2012

Я могу сделать вывод, протестировав собственное приложение на установке Linux на той же машине, на которой оно было ОЧЕНЬ медленным в Windows.Я не уверен, является ли это моей установкой Windows или ВСЕМИ установками Windows.

Это же приложение без изменений смогло обработать 3500 запросов в секунду в Linux.% быстрее ...

Пожалуйста, не стесняйтесь писать здесь, если у вас был подобный опыт со мной, я хотел бы знать, если это проблема 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
8 голосов
/ 12 июля 2013

Я обнаружил, что узел работает очень медленно, если вы называете его "localhost", но очень быстро, если вы называете его "127.0.0.1". Я думаю, что поиск DNS в Windows действительно замедляет запросы.

2 голосов
/ 11 февраля 2012

Есть ли что-то, что может оказать такое влияние на уменьшение количества запросов в секунду?

Я полагаю, вы думаете, что что-то замедляет Node в ваших тестах.НетОднако в тестах, на которые вы ссылаетесь в конце, что-то замедляется Apache .

Вы говорите, что тестируете Apache с статическим файлом, нотесты, на которые вы ссылаетесь, используйте PHP-файл для теста Apache.Apache, обслуживающий неинтерпретированный файл напрямую, примерно настолько близок к металлическому, насколько это возможно.Но добавьте PHP, и вы добавите тонну накладных расходов.

Итак, для вашего теста это Apache против Node и Apache выигрывает, тогда как в том, что вы связали с ним, это Apache +PHP против Node и Node победили.

Ни один из результатов меня не удивляет.

1 голос
/ 12 февраля 2012

Понимаете ли вы, что Apache использует несколько процессов или потоков для обслуживания запросов, тогда как существует один процесс Node.js? Либо настройте Apache для одного рабочего процесса или потока, либо запустите столько процессов Node.js, сколько у вас ядер ЦП, и баланс нагрузки между ними.

...