0

我正在尝试使用NODE.JS测试服务器的可用性,例如服务器监控。我创建了包含5000 个域的测试 CSV 文件,并使用了以下代码:

var net = require('net');

function Daemon(address,name, port) {
  this.address = address;
  this.name = name;
  this.port = port;
}

var fs = require('fs');
var array = fs.readFileSync('domains.csv').toString().split("\n");
for(i in array) {
    console.log(array[i]);
    daemons.push(new Daemon(array[i],'http', 80));
}

// loop through each daemon in the array
daemons.forEach(function(d) {

  // create the TCP stream to the server
  var stream = net.createConnection(d.port, d.address);
    console.log('[' + d.address + ']\t connected');

  // listen for connection
  stream.on('connect', function(){

    // connection success
    //console.log('[' + d.name + ']\t connected');

    stream.end(); // close the stream
  });

  // listen for any errors
  stream.on('error', function(error){
    console.log('[' + d.name + ']\t error: ' + error);

    stream.destroy(); // close the stream

  });
});

特定域有很多超时:

[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: connect ETIMEDOUT
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: connect ETIMEDOUT
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: connect ETIMEDOUT
[http]   error: Error: getaddrinfo ENOTFOUND
[http]   error: Error: connect ETIMEDOUT
[http]   error: Error: connect ETIMEDOUT
[http]   error: Error: connect ETIMEDOUT
[http]   error: Error: connect ETIMEDOUT
[http]   error: Error: read ETIMEDOUT
[http]   error: Error: connect ETIMEDOUT
[http]   error: Error: read ETIMEDOUT
[http]   error: Error: connect ETIMEDOUT
[http]   error: Error: read ETIMEDOUT
[http]   error: Error: connect ETIMEDOUT

但是这段代码很慢。完成它需要将近 30 分钟。如何加快此代码(异步连接)?

我需要脚本能够在每 5 分钟内测试 100.000 个域

4

2 回答 2

0

我的猜测是,在某一时刻,打开 5000 个出站 TCP 连接对您的系统不利。您应该将并发连接尝试限制在合理的数量。

我建议你使用并发 100 或 200 的async.queue 。

于 2013-02-07T13:37:30.240 回答
0

net.createConnection 是非阻塞的,所以你已经有了异步连接。

我用 500 ips 尝试了你的代码,接受或拒绝连接的时间不到 10 秒,只有 TIMEOUT 的连接需要更长的时间(30-40 秒)

如果您想做更多异步,请使用异步模块 ^^ 您的循环将如下所示:

async.forEach(
    daemons, 
    function(daemon) {
       //Your connect stuff
    },
    function(err){}
);
于 2013-02-06T22:38:29.777 回答