首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js比Apache慢

问Node.js比Apache慢
EN

Stack Overflow用户
提问于 2011-07-09 10:54:06
回答 6查看 16.8K关注 0票数 27

我正在比较Node.js (0.5.1-pre)和Apache (2.2.17)的性能,比较一个非常简单的场景--提供文本文件。

下面是用于节点服务器的代码:

代码语言:javascript
复制
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时

代码语言:javascript
复制
ab -n10000 -c100 http://127.0.0.1/README.txt

我得到以下运行时:

代码语言:javascript
复制
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时,以下是运行时:

代码语言:javascript
复制
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开始减少其中的几个请求,而节点工作正常,没有中断连接。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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,这是非常快的。

票数 27
EN

Stack Overflow用户

发布于 2011-07-09 11:37:12

在这种情况下,Apache可能正在执行发送文件,这将导致内核直接将内存块(由fs驱动程序缓存)发送到套接字。在节点的情况下,在v8、libeio和内核之间复制用户空间中的数据有一些开销(参见这关于在节点中使用sendfile的伟大文章)。

有很多可能的情况下,节点的性能将优于Apache,比如‘以恒定的慢速度向尽可能多的tcp连接发送数据流’。

票数 20
EN

Stack Overflow用户

发布于 2012-10-24 12:50:23

如果增加并发性并在node.js中使用缓存,则基准测试的结果将有利于node.js。

"Node Cookbook“一书中的示例代码:

代码语言:javascript
复制
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!');
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6634299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档