2009-11-02 24 views
7

我有一個項目,我打了一堆多個服務器上的自定義Windows性能計數器,並將它們聚集到一個數據庫中的網絡訪問。如果服務器關閉,我想跳過它,然後繼續我的一天。快速的方式,如果一臺服務器是在C#中

目前我正在檢查,以查看服務器是否是由活對我有在這個過程中,在以後反正看A股做DirectoryInfo,然後檢查.Exists property.This是我當前的代碼片段測試:

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秒,理想情況下需要在一秒鐘內知道服務器是否可訪問。 Pinging也不是一種選擇,因爲服務器可以是可以ping通的,但不能在我們的環境中「活着」。

我仍然有種新鮮的.NET世界,所以我願意接受任何建議人可以提供。

在此先感謝。

-Weegee

+0

當服務器在那裏,服務器不在時或者兩者都需要68秒? – 2009-11-02 19:42:06

+0

當服務器不在那裏。當服務器在那裏時,它不到一秒鐘。 – Weegee 2009-11-02 19:45:14

+0

怎麼樣在一個單獨的工作線程運行檢查,只是讓它拿但是需要多長時間? – Dolphin 2009-11-02 19:46:53

回答

8

平首先,提問後來

爲什麼不先PING,然後做di.Exists如果你得到一個迴應?

這將讓你在不可達的情況下早期失效,而不是浪費的時間是很難下來的機器。

事實上,我以前成功地使用過這種方法。


Paralellize

你有另一種選擇是paralellize服務器上的檢查,並採取行動,因爲他們被稱爲是可用的。

你可以使用Paralell.ForEach()方法,並沿着使用線程安全的隊列用一個簡單的消費線程來完成所需的操作。結合上面的檢查方法,這可以緩解上/下檢查的幾乎所有瓶頸。


敲門

又一方法是,如果所需的遠程服務正在運行ckeck(或者通過直接撞擊其端口或通過用WMI查詢它)。

由於WMI幾乎總是運行時,一臺機器,你的連接應該是非常快成功或失敗。

+0

這是一個很好的建議,我想我會執行它。但是,我們通常有服務器並不困難;即出於維護,我需要快速跳過。 – Weegee 2009-11-02 19:44:40

+1

Hrm ...有沒有可以在機器上檢查的遠程服務?或者使用遠程WMI? – 2009-11-02 19:48:01

+0

遠程WMI是一個好主意。我已經試圖打一些Perf Counters的所以我就嘗試創建,我知道存在每個服務器(處理器時間百分比\ _Total)上,如果失敗的話,我會跳過服務器虛擬之一。不知道爲什麼我沒那麼早想到。再次感謝! – Weegee 2009-11-02 20:02:22

2

唯一的「快」的方式,我認爲,看就看不依賴於平是創建一個插座,看看你是否能真正連接到你想達到服務的端口。

這將是的telnet服務器名相當於135,看它是否到了。

具體...

  1. 創建.NET TCP套接字客戶端(System.Net.Sockets.TcpClient
  2. 調用BeginConnect()作爲一個異步操作,連接到有問題的服務器上的RPC端口的一個你的目錄存在的代碼會反正使用(TCP 135,139或445)。
  3. 如果您在X毫秒內沒有收到迴音,請致電Close()取消連接。

免責聲明:我不知道什麼樣的影響,這將有任何威脅/防火牆保護,可能看到這種類型的連接/斷開的,沒有發送活動的威脅數據。

0
  • 的「全面爆發」的辦法是安裝像SCOM(系統中心操作管理器)監控工具,這有一個SDK你可以用它來查詢SCOM的(性能)和維護信息AVOUT機是監控。可能是一個很遠的橋樑......

  • Telnet是另一種選擇。嘗試telnet到目標機器,看看它是否響應。

  • 創建您在目標機器上安裝一個小的Windows服務,有系統管理員阻止它,當他們在目標機器上執行維護(只需使用批處理文件來淨停止/淨啓動服務)

1

打開到特定端口的套接字通常會有訣竅。如果你真的希望它速度很快,一定要在新套接字上設置NoDelay屬性(Nagle算法),這樣就不會有緩衝。

快速將主要取決於延遲,但這可能是我知道連接到端點的最快方式。使用異步方法並行化非常簡單。您可以檢查的速度很大程度上取決於您的網絡拓撲,但在測試1000臺服務器時(延遲在0-75毫秒之間),我可以在約30秒內獲得連接狀態。根本不是科學數據,但應該給你這個想法。

此外,永遠不要通過UNC文件共享執行此操作,因爲如果服務器不再存在,您將有很多掛起的連接需要永久超時。所以如果你有很多服務器的DNS記錄無效,並且你試圖對它們進行輪詢,你會隨着時間的推移完全讓Windows下載。像File.Exists和任何文件訪問會導致這種情況。