2016-09-01 2 views
0

WCF 서비스에서 문제가 발생했습니다. 잠시 후 요청 처리를 중지합니다. 우리는 정기적 인 간격으로 (거의 4 시간에 1 회) 자동 재활용을 일시적으로 조정했습니다. 서버에서 메모리 덤프를 가져 왔는데 실제로는 1 개의 스레드 (엔터프라이즈 라이브러리를 사용하여 실제로 로깅을 수행함)가 잠겨 있고 다른 스레드는이를 기다리고 있지만 약간 혼란스러워 보입니다. WCF 성능 문제 : 요청 처리가 중지됨

내가 성능 통계를 얻을 수 Windbg에서 도구를 사용하여 : - 을 스레드 데이터 아래 줘 -!의

74 60 202c 000000000f1fce10 3029220 Preemptive 0000000000000000:0000000000000000 000000000252a6b0 1  MTA (Threadpool Worker) System.Messaging.MessageQueueException 00000003ffc67350 

syncblk 아래 나와 있습니다 : -

Syncblk output

로깅 구성 요소를 비동기이며 메시지를 MSMQ로 보냅니다. 외부 시스템 예외가 발생하면 한 스레드가 잠기고 대기중인 스레드는 약 1000 스레드 (syncbklk의 Monitorthread)이고 모든 스레드는 로깅을 기다리고있는 스레드입니다. 내가 이해할 수없는 이유는 다른 응용 프로그램이 동일한 MSMQ를 사용하고 정상적으로 작동하므로 MSMQ가 차단되지 않았기 때문에 1 스레드가 잠긴 이유는 다른 스레드를 거부하는 이유입니다. 둘째, 로깅 구성 요소가 MSMQ로 메시지를 보냅니다. MSMQ를 실제 응용 프로그램에 잠재적 인 막힘이라고 생각할 수 있습니다. 로깅에 사용 비동기 코드는 다음과 같습니다 -

enter code here action = new Action<LogEntry>(Logger.Write); 
      IAsyncResult iAr = action.BeginInvoke(entry, CallbackHandler, action);action.EndInvoke(iar); 

가 친절 위의 문제 문에 좋습니다. 당신은 당신이 (리소스가 부족합니다 "와 같은 windbg를 도구에서! DSO 명령을 사용하여 같은 것을 예외 메시지를 얻을 수 있습니다 스레드 (74)에 System.Messaging.MessageQueueException 예외를 받고있는 windbg를 도구에 나타낸 바와 같이 Exception details


답변