node在响应内容比较大的情况,性能不是很好,有什么方法优化?
发布于 10 年前 作者 chosen0ne 4481 次浏览 最后一次编辑是 5 年前

代码:

  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次: <table> <tr><td>条件</td><td>100</td> <td>200</td> <td>500</td> <td>1000</td> <td>2000</td> <td>5000</td> <td>10000</td></tr> <br><tr><td>node<\td> <td>624<\td> <td>638<\td> <td>639<\td> <td>631<\td> <td>625<\td> <td>622<\td> <td>475<\td></tr> <br><tr><td>nginx<\td> <td>4033<\td> <td>3754<\td> <td>3465<\td> <td>3270<\td> <td>3109<\td> <td>2748<\td> <td>3260<\td> <tr> </table> 测试环境: 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后的数据:<br> nodejs buffer:<br> 100 | 200 | 500 | 1000 | 2000 | 5000 | 10000<br> 2865 |2849 | 2901 | 2803| 2709 |2149 |3194

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

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

回到顶部