我发现了好像是nodejs http模块的一个bug , 求高手解答
发布于 2年前 作者 151263 1037 次浏览

事故的起因: 我发现我的nodejs项目ajax请求中, 当请求的数据返回不到1K,几百B大小的时候,在 局域网的另一台电脑访问的时候,需要200多毫秒一个请求, 而当我ajax请求中返回的数据量是大于2K的时候,却反而只需要20毫秒一个请求??!! 于是,我做了下面的测试.以排除前端javascript等等的影响.

   var http = require('http');
    http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Hello World\n');
    }).listen(1337);
    console.log('Server running at http://127.0.0.1:1337/');

这是nodejs官网的例子,我拷贝下来,运行,用chrome浏览器本地127.0.0.1访问, 打开调试窗口Developer tools中的Network面板,看到Receiving访问所需要的时间是2ms或者1ms

这里,没发现问题,解释数据需要1毫秒是正常的

但是,问题来了,当我用同一个局域网上的另一台机器的chrome访问这个http服务的时候 发现: Receiving需要的时间却是165ms 到 200ms之间 这,同一个局域网,速度差别这么大,这已经有点诡异了,

更诡异的事情还在下面:

当我修改这个例子的源代码,把Hello World字符串改成一串很长很长的字符,长到超过2K大小的字符串, 重启http服务,再次刷新页面(注意是局域网中的另一条电脑),多次刷新观察Network面板,发现Receiving需要的时间却只需要13ms到18ms !!!

???求高手答疑解惑!不甚感激!!

9 回复

补充一下,我是在win7下面测试的

nodejs的版本是v0.10.5

1.服务器端似乎是底层nagle算法引起的,数据量少的时候自动缓存数据。可加入socket.setNoDelay(true)验证。

   var http = require('http');
   var server=http.createServer(function (req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Hello World\n');
    }).listen(1337);
    server.on('connection',function(socket){
        socket.setNoDelay(true);
    });
    console.log('Server running at http://127.0.0.1:1337/');

2.客户端的话,换个浏览器试试?

1,好的,谢谢高手,我试试, 2,客户端我很久以前发现问题的时候,就已经换过了,

高手,你说的是对的,我测试了,确实是你说的那样!!! 这回,不管大于2k的数据还是几B小数据,都是10几毫秒了 非常感谢高手!!!

不对啊,高手, socket.setNoDelay([noDelay])# Disables the Nagle algorithm. By default TCP connections use the Nagle algorithm, they buffer data before sending it off. Setting true for noDelay will immediately fire off data each time socket.write() is called. noDelay defaults to true. 官网的文档上说,这个noDelay的默认值本来就是true啊?!为什么还要设置成true? 难道,nodejs搞错了?

哦哦,我二了,明白了,他说的是socket.setNoDelay()调用的这个函数之后才是true

对于我这个追求完美的人,这个小细节困扰了我好久了,终于有了完满的答案了!

回到顶部