2009-11-02 11 views
7

私は、複数のサーバー上に多数のカスタムWindowsパフォーマンスカウンタを配置し、それらをデータベースに集約するプロジェクトを持っています。サーバーがダウンしている場合、私はそれをスキップして、私の一日を続けるだけです。C#でネットワーク経由でサーバーにアクセスできるかどうかを確認するための速い方法

現在のところ、サーバーがライブであるかどうかを調べるには、あとで処理してみる必要があるシェアでDirectoryInfoを実行してから、.Existsプロパティをチェックしてください。これは現在のコードスニペットですテスト:

DirectoryInfo di = new DirectoryInfo(machine.Share_Path); 
if (!di.Exists) 
{ 
    log.Warn("Could not access " + machine.Name + "! Maybe its down?"); 
    continue; // Skips to the next server in my loop where this snippet exists. 
} 

これは機能しますが、かなり遅いです。 di.Existsビットが作業を終了するまでに平均で約68秒かかります。サーバーにアクセスできるかどうかを1秒以内に知る必要があります。サーバーはping可能ですが、私たちの環境では "生きていない"ため、pingもオプションではありません。

私はまだ.NETの世界には新鮮なので、人々が提供できるアドバイスはありません。

ありがとうございます。

-Weegee

+0

サーバーがあるとき、サーバーがないとき、またはその両方のときに68秒かかりますか? –

+0

サーバーが存在しない場合。サーバーがある場合は、1秒未満かかります。 – Weegee

+0

別のワーカースレッドでチェックを実行するのはどうでしょうか? – Dolphin

答えて

8

のPingまず、あなたが応答を取得する場合di.Existsを行い、後の最初の

なぜPINGを質問をする、と?

これは、到達できない場合に早期に失敗し、ハードなマシンの時間を無駄にしないようにします。

私は、実際にはこのメソッドを前に正常に使用しています。


Paralellize

あなたが持っているもう一つのオプションは、それらが利用可能であることが知られているようチェック、およびサーバ上のアクションをparalellizeすることです。

メソッドを使用し、単純なコンシューマスレッドとともにスレッドセーフなキューを使用して、必要な処理を実行できます。上のチェック方法と組み合わせることで、上/下チェックのボトルネックのほとんどを軽減できます。


は、さらに別の方法が必要リモートサービスは、(直接、そのポートを押すことによって、またはWMIでそれを照会することによってのいずれかで)実行されている場合ckeckすることでドアの

ノック

マシンが稼働しているときにWMIがほとんど常に稼働しているため、接続は成功または失敗のいずれかですばやく実行する必要があります。

+0

それは素晴らしい提案です、私はそれを実装すると思います。しかし、一般的にサーバーはダウンしていません。メンテナンスのためにすぐにスキップする必要があります。 – Weegee

+1

Hrm ...マシン上で確認できるリモートサービスはありますか?または、リモートWMIを使用しますか? –

+0

リモートWMIは素晴らしいアイデアです。私はすでにいくつかのPerf Countersをヒットしようとしているので、すべてのサーバ(%Processor Time \ _Total)に存在するダミーのものを作成してみてください。なぜ私はそれを以前考えなかったのか分かりません。再度、感謝します! – Weegee

2

pingに依存せずにアップしているかどうかを確認する唯一の方法は、ソケットを作成し、実際に到達しようとしているサービスのポートに接続できるかどうかを確認することです。

これは、のtelnet servername 135と同等です。そのRPCポートのいずれかに該当のサーバに接続するための非同期操作として

具体的に...

  1. .NETのTCPソケットクライアントを作成します(System.Net.Sockets.TcpClient
  2. コールBeginConnect()、あなたのディレクトリにはコードがとにかく使用されます(TCP 135,139、または445)。
  3. Xミリ秒以内に音声が聞こえない場合は、Close()に電話して接続をキャンセルしてください。

免責事項:私はこれを脅威として活動送られたデータなしで接続/切断のこのタイプを見ることができる任意の脅威/ファイアウォール保護に持っているだろうか効果見当がつかない。

0
  • 「本格的」オプションは、SCOM(System Center Operations Managerの)のような監視ツールをインストールすることです、これはされてマシンAVOUTあなたは(パフォーマンス)のためのSCOMを照会するために使用することができますSDKやメンテナンス情報を持っています監視される。遠くへの橋になるかもしれません....

  • Telnetは別のオプションです。ターゲットマシンにtelnettingして、応答するかどうか確認してください。

  • (単にサービスを開始し、ネットでnet stop /にバッチファイルを使用)、彼らがターゲットマシン上でメンテナンスを実行するときのsys管理者がそれを停止している、あなたは、ターゲット・マシンにインストールすることを

を小さなWindowsサービスを作成します。
1

特定のポートへのソケットのオープンは、通常、トリックを行います。本当に高速にしたい場合は、バッファリングがないように、新しいソケット(Nagleアルゴリズム)にNoDelayプロパティを設定してください。

Fastは主にレイテンシに依存しますが、これはおそらくエンドポイントに接続するための最速の方法です。非同期メソッドを使用して並列化するのは簡単です。どのくらい速くチェックできるかは、お使いのネット​​ワークトポロジに大きく依存しますが、1000台のサーバのテスト(0-75msのレイテンシ)では、接続状態を30秒以内に取得できました。科学的なデータではありませんが、あなたにその考えを与えるべきです。

また、UNCファイル共有によってこれを実行しないでください。サーバーが存在しなくなった場合、永遠にタイムアウトする大量の接続が発生するためです。したがって、無効なDNSレコードを持つ多数のサーバーがあり、それらをポーリングしようとすると、時間の経過とともにWindowsが完全に停止します。 File.Existsとファイルアクセスのようなものはこれを引き起こします。

関連する問題