Node.js плохо работает в Windows, конечно, он не может быть медленнее, чем apache для базового ввода-вывода

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

Изменить: мой друг только что протестировал то же приложение в 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.

Я выполнил тот же тест на базовом веб-сервере с экспресс-настройкой и на базовом http-сервере node.js.

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 запросов в секунду на Express
2200 запросов в секунду на Node.js.

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

Теперь этот тест показывает, что Node.js опережает Apache!
http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php

Моя соответствующая спецификация оборудования:
Intel i7 2630qm
6 ГБ оперативной памяти


person Jack    schedule 11.02.2012    source источник
comment
Вам следует использовать поддержку кластеризации, это увеличит скорость на машине i7: mustafaakin.wordpress.com/2012/03/19/   -  person Mustafa    schedule 24.03.2012


Ответы (4)


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

Это же приложение без изменений могло обрабатывать 3500 запросов в секунду в Linux. Что более чем на 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
person Jack    schedule 11.02.2012
comment
В следующем слайд-шоу говорится, что нет разницы в производительности. slideshare.net/woloski / node-on-windows-jsconf-arg-2012 - person Palani; 28.05.2013

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

person Erty Seidohl    schedule 11.07.2013
comment
Я сначала не верю. но @Erty прав. Поиск DNS в Windows снижает производительность моего приложения. Я всегда использую 127.0.0.1, так как - person DennyHiu; 09.10.2014

Есть ли что-нибудь, что могло бы так повлиять на сокращение количества запросов в секунду?

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

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

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

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

person Flambino    schedule 11.02.2012
comment
Связанный тест использует PHP. Мой собственный тест работал с файлом .html, который содержал ‹h1› Hello ‹/h1›. - person Jack; 11.02.2012
comment
@ Джек Точно. Вы не тестируете PHP. А необработанный Apache быстр - быстрее, чем Node. Насколько я понял ваш вопрос, вам было интересно, почему ваши тесты показали противоположность тем, на которые вы ссылались, и мой ответ: PHP - person Flambino; 11.02.2012
comment
Но я получаю 650 об / с, что очень медленно, мой друг только что запустил то же приложение в Linux, и оно работает со скоростью более 7 тыс. Об / с. Компьютерные характеристики не сильно отличаются. - person Jack; 12.02.2012
comment
@Jack Ах, моя проблема, извините - я только что увидел ссылку и подумал, что вы спрашиваете, что Apache быстрее, чем Node. Но да, это как-то странно, если производительность у вас в 10 раз меньше, чем у вашего друга ... - person Flambino; 12.02.2012

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

person just somebody    schedule 11.02.2012
comment
Я не собираюсь тестировать возможности узлов, я знаю, на что он способен. Я просто не хочу выяснять, почему он работает так медленно в Windows по сравнению с Linux ... - person Jack; 12.02.2012