一个关于stream write的问题!
发布于 2年前 作者 liangjun0305 691 次浏览

代码如下: var net = require(‘net’); var conn = net.createConnection(6001, ‘127.0.0.1’); var str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

function cycle(){
  var result = conn.write(str);
  if(result == false){
      console.log(conn);
  }
}

for(var i = 1; i <= 500; i++){
   cycle();
}

上述伪码是一种业务场景。 看了一下node源代码,stream的writable.write会现将数据写入buffer,等待buffer超过限定值之后,在进行真正的写入。当buffer满了之后,这时候我代码中conn.write就会写入失败。node文档上说"Writes chunk to the stream. Returns true if the data has been flushed to the underlying resource. Returns false to indicate that the buffer is full, and the data will be sent out in the future",我的问题是,conn.write就会写入失败,数据在后面会发送,具体机制是怎么样的?然后这部分数据会存放在哪儿?

然后上面的场景使用多个连接不停的发送数据,会出现系统内存不停的增长,是和conn.write的机制有关系吗?

谢谢指教!!

6 回复

编辑器不会用,上面的代码有点问题,分开的。我再贴一下试试:

var net = require('net');
var conn = net.createConnection(6001, '127.0.0.1');
var str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

function cycle(){
  var result = conn.write(str);
  if(result == false){
    console.log(conn);
  }
}

for(var i = 1; i <= 500; i++){
   cycle();
}

顶一下我的问题!!!

发送数据太快了,内核都有发送缓冲区的,超过缓冲区大小的数据无法立即发送出去,这部分数据就是你要发的数据,所以你的node进程的内存会不断变大.

请问这个缓冲区是内核开辟的还是node开辟呢?而且上述代码这样的发送应该不会超过内核的承载能力吧!

@liangjun0305 内核开辟的,应用程序node可以控制大小

@liangjun0305 搞错了,内核默认的缓冲区node现在还控制不了,node应用层也有缓冲区,见这里http://nodejs.org/api/net.html#net_socket_buffersize

回到顶部