2014-09-06 3 views
0

[stackoverflow 또는 serverfault에 게시할지 여부는 모르겠지만 C# 개발 프로젝트이므로 stackoverflow를 고수 할 것입니다 ...]다중 서버 n 계층 동기화 타이밍 및 성능 메트릭?

우리는 다음과 같은 다중 계층 응용 프로그램을 제공합니다. 예측할 수없는 시간대에 성능이 저하되고 있으며 그 원인을 추적하려고합니다. 개발 환경에서 재현 할 수 없으므로 수정하기가 특히 어렵습니다. 이는 프로덕션 서버에서만 발생하는 산발적 인 문제입니다.

아키텍처는 다음과 같습니다. MVC 응용 프로그램 (C#)을 실행하는로드 균형 조정 된 프런트 엔드 웹 서버 (IIS). 도메인 통합 모드에서 실행되는 MSMQ로 구현되는 자체 서비스 버스. 버스에 배치 된 요청에 응답하는 Windows 서비스를 실행하는 다섯 개의 '작업자 풀'서버. 백 엔드 SQL Server 2012 데이터베이스, 미러 및 복제.

모든 서버에는 Windows Server 2012, 최신 릴리스, 최신 Windows 업데이트를 실행하는 높은 사양의 하드웨어가 있습니다. 모든게 최신이야.

사용자가 MVC 앱에서 액션을 클릭하면 컨트롤러 자체가 매우 얇아집니다. 거의 모든 일은 버스에서 요청 메시지를 보내고 (MSMQ 메시지를 보냄) 응답을 기다리고 있습니다.

작업자 풀에있는 서버 중 하나가 메시지를 선택하고 수행 할 작업을 수행 한 다음 SQL Server 백 엔드에 대한 쿼리를 수행하고 기타 과장된 작업을 수행합니다. 그 결과는 상관 ID를 사용하여 MVC 앱이 다시 선택하도록 버스에 다시 배치됩니다.

각 구성 요소의 단순성과 관련하여 작업하기에 좋은 아키텍처입니다. 수요가 증가함에 따라 단순히 작업자 풀에 서버를 추가 할 수 있으며 일반적으로 모든 서버가 정상적으로 작동합니다. 또한 중간 계층에서 코드를 핫 스왑 할 수 있습니다. 대부분의 경우, 솔루션은 매우 잘 수행됩니다.

그러나 성능이 문제가되는 순간이 있습니다. 병목 현상이 아키텍처의 어느 지점에서 발생했는지 추적하는 것은 어렵습니다.

우리가 시도한 바는 메시지를 전체 타이밍과 메트릭과 함께 버스로 보내고 MVC 앱으로 왕복하는 것입니다. 경로의 각 정류장에서 시간 소인 및 기타 메트릭이 메시지에 추가됩니다. 그런 다음 MVC 응용 프로그램이 응답을 받으면 타임 스탬프 및 메트릭을 화면에 표시하고 프로세스의 어느 부분에서 문제를 일으키는 지 확인할 수 있습니다.

그러나 우리는 많은 프로세스가 5-100ms 레벨로 내려 가고 메시지가 5 개의 서버를 통과 할 수 있기 때문에 정확한 시간으로 Windows 시간에 의존 할 수 없다는 것을 곧 알게되었습니다 다시). 서버 전체의 시간을 해당 분석과 동기화 할 수는 없습니다. MS 문서 : http://support.microsoft.com/kb/939322/en-us

문제를 복합화하려면 요청을 보낼 때마다 어떤 특정 작업자 풀 서버가 메시지를 처리 ​​할 것인지 예측할 수 없습니다.

5ms 레벨까지 정확하고 조정되고 동기화 된 시간을 얻는 가장 좋은 방법은 무엇입니까? 각 단계에서 외부 (웹) 서비스를 호출해야하는 경우 프로세스에 시간이 추가 될 수 있으며 각 호출이 각 서버에서 동일한 시간이 걸릴 것을 어떻게 보장 할 수 있습니까? 한 서버의 외부 통화에서 대기 시간이 적어 지더라도 결과가 왜곡되고 잘못된 결과가 발생할 수 있습니다.

희망은 우리 곤경을 설명하고 당신의 도움을 기대합니다.유망한 수 있습니다 http://www.pool.ntp.org/en/use.html : 난 그냥이를 발견했습니다

업데이트. 아마도 동기화 된 시간을 유지하기 위해 매 x 시간마다 예정된 작업을 수행하면 필자가 필요로하는 5ms 이하의 해상도로 나를 안내 할 수 있습니다. 의견이나 경험?

업데이트 2

FWIW, 우리는 성능 문제의 원인을 발견했습니다. 대기열이 열리기 전에 대기열이 생성되었는지 소프트웨어가 테스트 할 때 발생합니다. 근본적으로 대기열을 두 번 찾고 있었기 때문에 상당히 비쌉니다. 그래서 문제는 사라졌습니다.

답변

0

당신이 시도해야 할 것은 Windows 자체의 성능 모니터를 사용하는 것입니다. 수행 할 수있는 작업은 각 서버에 Data Collector Set을 작성하고 모니터링하려는 메트릭을 선택하는 것입니다. 요청 실행 시간 같은 것이 모니터 할 수있는 좋은 방법입니다. 데이터 수집기 ​​집합에 대한

여기 튜토리얼입니다 : https://www.youtube.com/watch?v=591kfPROYbs

는 희망이 문제를 해결하는 당신에게 시작을 줄 것이다.

+0

우리는 perf mon을 많이 사용하지만 모든 서버와 계층에 걸쳐 전체 스택에서 추적을 조정해야합니다. 각 서버에서 실행되는 프로세스뿐만 아니라 네트워크 경계를 통한 전송 및 수신을 계측해야합니다. 그것이 없으면 코드, 레이어, 하드웨어 또는 기타 요소인지 확인할 수 없습니다. – SimonGoldstone

+0

아마도 5 대의 서버를 통과하는 네트워크 문제 일 수 있습니까? – Ryan

+0

수 있지만 광범위한 테스트를 수행했습니다. 네트워크가 거의 5 %를 넘지 않습니다. 그래서 전체 스택을 검사해야합니다. – SimonGoldstone

관련 문제