编辑:我的一个朋友刚刚在Linux上testing了相同的应用程序,平均r / s大约是7000。
编辑#2:我已经检查了Node.exe的CPU使用情况,只使用了cpu的5-6%。 当然,如果在真正的负载下运行在一个单线程上,这个数字在四核机器上应该是12%,8线程CPU呢?
我写了一个Node.js应用程序(运行Node v0.6.10),并用apachebench进行基准testing: 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设置networking服务器,以及基本的node.js httpnetworking服务器上进行了相同的testing。
带有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");
结果是:
Express上的每秒2000个请求
Node.js每秒2200个请求
我对Apache Web服务器上托pipe的静态文件执行了相同的testing:
每秒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
我发现如果将节点引用为“本地主机”,节点的工作确实很慢,但如果通过“127.0.0.1”引用节点,节点的速度会非常快。 我认为Windows上的dns查询实际上是减慢了请求的速度。
有什么可以减少每秒请求数量的影响吗?
我假设你正在考虑在你的测试中有什么东西在放缓Node。 没有。 但是,在最后链接到的测试中,有一些放慢了Apache的速度。
你说你正在用一个静态文件测试Apache,但是你链接到的基准,使用PHP文件进行Apache测试。 直接服务未解释文件的Apache与您所能获得的金属差不多。 但是添加PHP,你会增加一大笔开销。
所以对于你的测试,这是Apache与Node和Apache的胜利,而在你链接到它的Apache + PHP与节点和节点的胜利。
这两个结果都没有让我吃惊。
您是否意识到Apache使用多个进程或线程来处理请求,而只有一个Node.js进程? 为单个工作进程或线程配置Apache,或者像CPU核心一样运行尽可能多的Node.js进程,并在它们之间进行负载平衡。