[英]Does Node.js perform badly on Windows, surely it can't be slower than apache for basic I/O
编辑:我的一个朋友刚刚在Linux上对相同的应用程序进行了基准测试,平均r / s约为7000。
编辑#2:我已经检查了Node.exe的CPU使用率,它只使用了5-6%的cpu。 当一个四核机器上的这个数字应该是12%,如果在真正负载的情况下在单个线程上运行时,8个线程CPU应该是这个数字?
我编写了一个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设置Web服务器和基本的node.js http Web服务器上执行了相同的测试。
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");
结果是:
Express上每秒2000个请求
Node.js上每秒2200个请求
我对Apache Web服务器上托管的静态文件执行了相同的测试:
每秒6000个请求
现在这个基准测试显示Node.js击败了Apache手!
http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php
我的相关硬件规格:
英特尔i7 2630qm
6 GB RAM
我可以通过在同一台机器上的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
我发现如果你把它称为“localhost”,节点的工作真的很慢,但是如果你用“127.0.0.1”来引用节点很快就会很快。 我认为Windows上的DNS查找确实会降低请求速度。
是否有任何可能对减少每秒请求数量产生影响的事情?
我假设您认为测试中的某些节点正在减慢Node。 没有。 但是,在最后链接的测试中, Apache的速度有所减缓。
您说您正在使用静态文件测试Apache,但是您链接的基准测试使用PHP文件进行Apache测试。 直接提供未解释文件的Apache与您可以获得的金属差不多。 但是添加PHP,你会增加大量的开销。
所以对于你的测试,它是Apache vs. Node和Apache获胜,而在你链接到它的那个是Apache + PHP vs. Node和Node获胜。
这两项结果都没有让我感到惊讶。
您是否意识到Apache使用多个进程或线程来处理请求,而有一个Node.js进程? 为单个工作进程或线程配置Apache,或者为CPU核心运行尽可能多的Node.js进程,并在它们之间进行负载均衡。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.