2009-11-02 1 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 초가 걸리고, 서버에 액세스 할 수 있는지 여부를 초 단위로 알아야합니다. 서버는 ping 할 수 있지만 우리 환경에서는 "라이브"가 아니기 때문에 ping도 옵션이 아닙니다.

저는 여전히 .NET 세계에 신선한 것이기 때문에 사람들이 제공 할 수있는 조언을드립니다.

미리 감사드립니다.

-Weegee

+0

서버가있을 때, 서버가 없거나 둘 다있을 때 68 초가 걸립니까? –

+0

서버가없는 경우. 서버가있을 때 1 초도 걸리지 않습니다. – Weegee

+0

별도의 작업자 스레드에서 수표를 실행하는 데는 시간이 오래 걸릴까요? – Dolphin

답변

8

핑 먼저 질문을 나중에

왜 첫번째 핑 (ping) 한 다음 응답을받을 경우 di.Exists합니까?

이렇게하면 도달 할 수없는 경우 일찍 실패하고 열심히 기계가 작동하지 않는 시간을 낭비하지 않아도됩니다.

실제로이 방법을 성공적으로 사용했습니다.


MSDN Ping Documentation

  • Paralellize

    당신이 가지고있는 또 다른 옵션은 그들이 사용할 수 알려진대로 서버에서 점검 및 조치를 paralellize하는 것입니다.

    메서드를 사용할 수 있으며 간단한 소비자 스레드와 함께 스레드 안전 큐를 사용하여 필요한 작업을 수행 할 수 있습니다. 위의 검사 방법과 결합하면 위/아래 검사에서 거의 모든 병목 현상을 완화 할 수 있습니다. 필요한 원격 서비스가 실행중인 경우

    는 또 다른 방법이 될 것이다 문에


    노크는 (직접의 포트를 타격하거나 WMI로를 조회하여)을 체크 인하합니다.

    컴퓨터가 작동 중일 때 WMI가 거의 항상 실행되기 때문에 연결이 성공하거나 실패하는 속도가 매우 빨라야합니다.

+0

그것은 훌륭한 제안이며 구현할 것입니다. 그러나 일반적으로 서버는 다운되지 않습니다. 즉, 유지 보수를 위해 빨리 건너 뛸 필요가 있습니다. – Weegee

+1

Hrm ... 컴퓨터에서 확인할 수있는 원격 서비스가 있습니까? 또는 원격 WMI를 사용합니까? –

+0

원격 WMI를 사용하는 것이 좋습니다. 나는 이미 일부 Perf Counters를 치려고 시도하고 있으므로 모든 서버 (% Processor Time \ _Total)에 존재하는 더미 서버를 만들려고 시도하고 실패 할 경우 해당 서버를 건너 뛸 것입니다.내가 왜 그렇게 생각하지 않았는지 모르겠다. 다시 한 번 감사드립니다! – Weegee

2

ping에 의존하지 않으면 서 볼 수있는 유일한 "빠른"방법은 소켓을 만들고 도달하려는 서비스 포트에 실제로 연결할 수 있는지 확인하는 것입니다.

텔넷 서버 이름 135은 과 동일합니다. 특히

...

  1. 는 .NET의 TCP 소켓 클라이언트 만들기 (System.Net.Sockets.TcpClient) 비동기 작업으로
  2. 전화 BeginConnect()는 RPC 포트 중 하나에 해당 서버에 연결하는 어쨌든 코드가 사용할 디렉토리가 있습니다 (TCP 135, 139 또는 445).
  3. X 밀리 초 이내에 소리가 들리지 않으면 Close()으로 연락하여 연결을 취소하십시오.

면책 조항 : 나는이 위협으로 활동을 전송 데이터없이 연결/분리의 유형을 볼 수있는 위협/방화벽 보호에 미칠 어떤 영향을 모르겠어요.

0
  • 은 "완전한"옵션 SCOM (시스템 Center Operations Manager)와 같은 모니터링 도구를 설치하는 것, 이것은 SDK은 당신이 SCOM를 조회하는 데 사용할 수있다 (성능) 및 기계 avout 유지 보수 정보 인 모니터링. 멀리는 다리가 될지도 모르지만 ....

  • 텔넷은 다른 옵션입니다. 대상 시스템에 telnetting하여 응답하는지 확인하십시오.

  • 당신이 당신의 대상 컴퓨터에 설치하는 작은 윈도우 서비스를 만드는

    , 그들은 대상 시스템에 대한 유지 보수를 수행 할 때 SYS 관리자가 중지가

(단지 NET STOP/NET START 서비스에 배치 파일을 사용)
1

특정 포트로 소켓을 열면 대개 트릭이 수행됩니다. 정말로 속도를 높이려면 새 소켓 (Nole 알고리즘)에 NoDelay 속성을 설정하여 버퍼링이 없어야합니다.

패스트는 대기 시간에 크게 좌우되지만, 이는 아마도 엔드 포인트에 연결하는 가장 빠른 방법 일 것입니다. 비동기 메서드를 사용하여 병렬 처리하는 것은 매우 간단합니다. 얼마나 빨리 확인할 수 있는지는 주로 네트워크 토폴로지에 따라 다르지만, 1000 대의 서버 (0-75ms 사이의 대기 시간)에 대한 테스트에서 ~ 30 초 내에 연결 상태를 얻을 수있었습니다. 과학적 데이터가 아니지만 아이디어를 제공해야합니다.

또한 UNC 파일 공유를 통해이 작업을 수행하지 마십시오. 서버가 더 이상 존재하지 않으면 시간이 오래 걸릴 수있는 매달린 연결이 많기 때문입니다. 따라서 잘못된 DNS 레코드가있는 많은 서버가 있고이를 폴링하려고하면 시간이 지남에 따라 Windows가 완전히 다운됩니다. File.Exists 및 파일 액세스와 같은 것들이 원인이됩니다.

관련 문제