我正在比较Node.js (0.5.1-pre)和Apache (2.2.17)的性能,比较一个非常简单的场景--提供文本文件。
下面是用于节点服务器的代码:
var http = require('http')
, fs = require('fs')
fs.readFile('/var/www/README.txt',
function(err, data) {
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'})
res.end(data)
}).listen(8080, '127.0.0.1')
}
)对于Apache,我只是使用Ubuntu11.04附带的任何默认配置
使用以下参数对 Apache 运行Apache时
ab -n10000 -c100 http://127.0.0.1/README.txt我得到以下运行时:
Time taken for tests: 1.083 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 27630000 bytes
HTML transferred: 24830000 bytes
Requests per second: 9229.38 [#/sec] (mean)
Time per request: 10.835 [ms] (mean)
Time per request: 0.108 [ms] (mean, across all concurrent requests)
Transfer rate: 24903.11 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.8 0 9
Processing: 5 10 2.0 10 23
Waiting: 4 10 1.9 10 21
Total: 6 11 2.1 10 23
Percentage of the requests served within a certain time (ms)
50% 10
66% 11
75% 11
80% 11
90% 14
95% 15
98% 18
99% 19
100% 23 (longest request)当针对节点实例运行Apache时,以下是运行时:
Time taken for tests: 1.712 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 25470000 bytes
HTML transferred: 24830000 bytes
Requests per second: 5840.83 [#/sec] (mean)
Time per request: 17.121 [ms] (mean)
Time per request: 0.171 [ms] (mean, across all concurrent requests)
Transfer rate: 14527.94 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.9 0 8
Processing: 0 17 8.8 16 53
Waiting: 0 17 8.6 16 48
Total: 1 17 8.7 17 53
Percentage of the requests served within a certain time (ms)
50% 17
66% 21
75% 23
80% 25
90% 28
95% 31
98% 35
99% 38
100% 53 (longest request)显然比Apache慢。如果考虑到Apache正在做许多其他事情,比如日志记录等,这就特别令人惊讶了。
我做错了吗?还是Node.js在这种情况下真的慢了点?
编辑1:我确实注意到节点的并发性更好--当将多个同时请求增加到1000时,Apache开始减少其中的几个请求,而节点工作正常,没有中断连接。
发布于 2011-07-09 14:05:28
动态请求
node.js非常擅长处理大量小的动态请求(可以挂起/长轮询)。但它不擅长处理大型缓冲区。Ryan (作者node.js)解释了这一他的演讲。我建议你研究这些幻灯片。我也在网上看过这个。
垃圾收集器
正如你可以从幻灯片(13从45)看到,它是不好的大缓冲区。
幻灯片15从45:
V8有一个分代垃圾收集器。随机移动物体。节点无法获得指向要写入套接字的原始字符串数据的指针。
使用缓冲器
幻灯片16从45
使用Node的新缓冲区对象,结果会发生变化。
仍然没有那么好,例如,nginx,但好多了。而且这些幻灯片已经很老了,所以可能Ryan已经改进了这一点。
CDN
不过,我认为您不应该使用node.js来承载静态文件。您可能会更好地将它们托管在CDN上,CDN是为托管静态文件而优化的。一些流行的CDN的(有些甚至是免费的)通过维基。
NGinx(+Memcached)
如果您不想使用CDN托管静态文件,我建议您使用Nginx与memcached,这是非常快的。
发布于 2011-07-09 11:37:12
发布于 2012-10-24 12:50:23
如果增加并发性并在node.js中使用缓存,则基准测试的结果将有利于node.js。
"Node Cookbook“一书中的示例代码:
var http = require('http');
var path = require('path');
var fs = require('fs');
var mimeTypes = {
'.js' : 'text/javascript',
'.html': 'text/html',
'.css' : 'text/css'
} ;
var cache = {};
function cacheAndDeliver(f, cb) {
if (!cache[f]) {
fs.readFile(f, function(err, data) {
if (!err) {
cache[f] = {content: data} ;
}
cb(err, data);
});
return;
}
console.log('loading ' + f + ' from cache');
cb(null, cache[f].content);
}
http.createServer(function (request, response) {
var lookup = path.basename(decodeURI(request.url)) || 'index.html';
var f = 'content/'+lookup;
fs.exists(f, function (exists) {
if (exists) {
fs.readFile(f, function(err,data) {
if (err) { response.writeHead(500);
response.end('Server Error!'); return; }
var headers = {'Content-type': mimeTypes[path.extname(lookup)]};
response.writeHead(200, headers);
response.end(data);
});
return;
}
response.writeHead(404); //no such file found!
response.end('Page Not Found!');
});https://stackoverflow.com/questions/6634299
复制相似问题