2009-11-02 8 views
7

Mam projekt, w którym trafiam kilka niestandardowych liczników wydajności systemu Windows na wielu serwerach i gromadzę je w bazie danych. Jeśli serwer jest wyłączony, chcę go pominąć i kontynuować pracę z moim dniem.Szybki sposób na sprawdzenie, czy serwer jest dostępny przez sieć w C#

Obecnie sprawdzam, czy serwer jest aktywny, wykonując numer DirectoryInfo w udziale, który i tak powinienem sprawdzić później, a następnie sprawdzając właściwość .Exists. To jest mój obecny fragment kodu dla testowanie:

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. 
} 

To działa, ale jest dość powolne. Średnio trwa to ok. 68 sekund dla di.Exists bit do zakończenia swojej pracy, i najlepiej powinien wiedzieć w ciągu sekundy, czy serwer jest dostępny. Pingowanie również nie jest opcją, ponieważ serwer można pingować, ale nie "żyć" w naszym środowisku.

Wciąż jestem świeży dla świata .NET, więc jestem otwarty na wszelkie rady, które mogą zaoferować ludzie.

Z góry dziękuję.

-Weegee

+0

Czy trwa 68 sekund, gdy serwer jest dostępny, gdy serwer nie jest dostępny, lub jedno i drugie? –

+0

Gdy nie ma serwera. Kiedy serwer jest dostępny, zajmuje to mniej niż sekundę. – Weegee

+0

Co zrobić z uruchomieniem sprawdzenia w osobnym wątku roboczym i po prostu pozwolić, aby trwało to tyle czasu, ile potrzeba? – Dolphin

Odpowiedz

8

Ping pierwsze, potem zadawać pytania

Dlaczego najpierw nie ping, a następnie wykonaj di.Exists jeśli dostaniesz odpowiedź?

Pozwoliłoby to wcześnie zawieść w przypadku, który nie jest dostępny, i nie marnować czasu na maszyny, które są mocno obciążone.

Tak naprawdę użyłem tej metody z powodzeniem wcześniej.


Paralellize

Inną opcją masz jest paralellize sprawdzanie i działania na serwerach, ponieważ wiadomo, że są dostępne.

Można użyć metody Paralell.ForEach() i użyć kolejki wątków bezpiecznej wraz z prostym wątkiem konsumenckim, aby wykonać wymagane działanie. W połączeniu z powyższą metodą sprawdzania może to złagodzić prawie wszystkie twoje wąskie gardła podczas sprawdzania w górę/w dół.


pukanie do drzwi

Jeszcze inny sposób byłoby ckeck jeśli wymagana jest uruchomiona usługa zdalnego (poprzez uderzanie jej port bezpośrednio lub poprzez odpytywanie go z WMI).

Ponieważ usługa WMI prawie zawsze działa, gdy urządzenie jest włączone, połączenie powinno być bardzo szybkie, aby się powiodło lub się nie powiodło.

+0

To doskonała sugestia i myślę, że ją wdrożę. Jednak zazwyczaj mamy serwery, które nie są trudne; tj. do konserwacji, które muszę szybko pominąć. – Weegee

+1

Hrm ... Czy istnieje usługa zdalna, którą można sprawdzić na komputerze? Lub użyć zdalnego WMI? –

+0

Zdalny interfejs WMI to świetny pomysł. Już próbuję trafić kilka Perf liczników, więc po prostu spróbuję stworzyć fikcyjną wersję, którą znam na każdym serwerze (% Processor Time \ _Total), a jeśli to się nie powiedzie, pomijam ten serwer.Nie wiem, dlaczego wcześniej o tym nie myślałem. Dzięki jeszcze raz! – Weegee

2

Jedynym "szybkim" sposobem, jak sądzę, aby sprawdzić, czy to działa bez pingowania, byłoby utworzenie gniazda i sprawdzenie, czy rzeczywiście można połączyć się z portem usługi, do której próbujesz dotrzeć.

To będzie odpowiednik serwera telnet 135, aby sprawdzić, czy jest włączony.

Konkretnie ...

  1. Tworzenie klienta gniazdo NET TCP (System.Net.Sockets.TcpClient)
  2. połączeń BeginConnect() jako operacja asynchroniczna, aby połączyć się z serwerem w pytaniu na jednym z portów RPC, które Twój katalog istnieje mimo wszystko (TCP 135, 139 lub 445).
  3. Jeśli nie usłyszysz go z powrotem w ciągu X milisekund, zadzwoń pod numer Close(), aby anulować połączenie.

Zastrzeżenie: nie mam pojęcia, jaki wpływ będzie to miało na jakiekolwiek zagrożenia ochrony/zapory, które mogą zobaczyć tego typu podłączyć/odłączyć bez danych przesyłanych działalność jako zagrożenie.

0
  • "Full-Blown" rozwiązaniem byłoby zainstalować narzędzie do monitorowania jak SCOM (System Center Operations Manager), to ma SDK można użyć kwerendy SCOM za (wydajność) oraz informacje konserwacji avout maszyn bycia monitorowane. Może być mostem daleko ....

  • Telnet to kolejna opcja. Spróbuj połączyć się z maszyną docelową, aby sprawdzić, czy odpowiada.

  • Tworzenie małych okien usługę, którą zainstalować na komputerze docelowym, mają admin sys zatrzymać go, gdy wykonywanie czynności konserwacyjnych na maszynie docelowej (wystarczy użyć pliku wsadowego netto Stop/netto uruchomić usługę)

1

Otwieranie Gniazdo do określonego portu zwykle działa. Jeśli naprawdę chcesz, aby była szybka, należy ustawić właściwość NoDelay na nowym gnieździe (algorytm Walkera), aby nie było buforowania.

Szybkość będzie w dużej mierze zależeć od opóźnienia, ale jest to prawdopodobnie najszybszy sposób, jaki znam, aby połączyć się z punktem końcowym. Proste jest równoległe używanie metod asynchronicznych. Szybkość, z jaką można sprawdzić, zależy w dużej mierze od topologii sieci, ale w testach na 1000 serwerów (opóźnienie w zakresie od 0 do 75 ms) udało mi się uzyskać stan łączności w ~ 30 sekund. Nie dane naukowe, ale powinny dać ci pomysł.

Nie rób tego nigdy poprzez udostępnianie plików UNC, ponieważ jeśli serwer już nie istnieje, będziesz miał wiele zwisających połączeń, które trwają wiecznie, aby upłynąć limit czasu. Więc jeśli masz dużo serwerów z nieprawidłowymi rekordami DNS i próbujesz je odpytać, całkowicie z czasem zamkniesz system Windows. Rzeczy takie jak File.Exists i każdy dostęp do plików spowoduje to.

Powiązane problemy