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 秒もかかりませんでした。タイムアウトの接続だけが少し長くかかりました (30 ~ 40 秒)。

さらに非同期を行いたい場合は、非同期モジュールを使用してください^^ ループは次のようになります。

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