node在响应内容比较大的情况,性能不是很好,有什么方法优化?
发布于 3年前 作者 chosen0ne 1743 次浏览

代码:

  var http = require('http');
  var str = ' .... '; // 300k大小的字符串
  http.Server(function(req, res){
        res.end(str);
  }).listen(8080);

就是很简单的输出300k左右的字符串,同时和nginx做对比。 用ab测试,在并发数在100, 200, 1000, 2000, 10000的情况下,请求10000次:



条件100 200 500 1000 2000 5000 10000
node<\td> 624<\td> 638<\td> 639<\td> 631<\td> 625<\td> 622<\td> 475<\td>
nginx<\td> 4033<\td> 3754<\td> 3465<\td> 3270<\td> 3109<\td> 2748<\td> 3260<\td>
测试环境: cpu i3 2.1GHz mem 4g os ubuntu 11.10

node 开启4个worker,设置maxSockets为4000 nginx同样开启4个worker,worker_connection为40000

按理说nginx读取静态文件会有磁盘io,但是结果却明显好于node,这是为什么呢?有什么优化的手段呢?

5 回复

相同的文件读取会被缓存下来,io效率提高很多。我估计nginx和ubuntu都会缓存读取的那个文件。

var http = require('http');
var str = ' .... '; // 300k大小的字符串
var buffer = Buffer(str);
http.Server(function(req, res){
      res.end(buffer);
}).listen(8080);

先将字符串转换成缓冲器,再输出缓冲器,这样会不会更快? 我只是刚接触NodeJS,上面的方法也只是我瞎猜的

常用的放在buffer里吧

的确,换成buffer后,性能会大增。 这是用buffer后的数据:
nodejs buffer:
100 | 200 | 500 | 1000 | 2000 | 5000 | 10000
2865 |2849 | 2901 | 2803| 2709 |2149 |3194

为什么buffer的性能会好于string呢?

估计是因为要进行编码转换吧,在Javascript里面,字符串貌似都是以Unicode存储的,然后在发送出去之前,要对字符串进行编码转换,但如果发送的是Buffer的话,就不需要进行转换了 在这里看到的http://docs.cnodejs.net/cman/buffers.html

回到顶部