클라이언트/서버 앱이 있습니다. 서버 구성 요소가 실행되고 WCF를 'remoting'방식 (바이너리 포맷터, 세션 객체)으로 사용합니다.C# 코드가 매우 느리고 디버거가 연결되어 있습니다. MemoryMappedFile의 오류?
서버 구성 요소를 시작하고 클라이언트를 시작하면 서버가 완료하는 첫 번째 작업은 < 0.5 초입니다.
VS 디버거가 연결된 서버 구성 요소를 시작한 다음 클라이언트를 시작하면 작업을 완료하는 데 20 초 이상이 소요됩니다.
코드가 변경되지 않고 조건부 컴파일이 변경되지 않습니다. 32 비트, 64 비트, VS 호스팅 프로세스, VS 호스팅 프로세스 또는 이들 조합의 서버 구성 요소가 컴파일되어 실행 중인지 여부는 동일합니다.
는 아마 중요한 : 나는 VS.NET을 프로파일 (샘플링 모드)를 사용하는 경우 첨부 된 디버거가 없었다 것처럼, 다음 응용 프로그램은 빠르게 실행됩니다. 그래서 나는 그렇게 진단 할 수 없다. 그냥 확인, 계측 모드도 빠르게 실행됩니다. 동시성 프로파일 링 모드와 동일하게 빠르게 작동합니다.
주요 데이터 :
가- 응용 상당히 무거운 멀티 쓰레딩 (표준 스레드 풀 40 스레드)를 사용합니다. 스레드 생성은 관계없이 빠르게 발생하며 느린 지점이 아닙니다. 많은 자물쇠가 있습니다.
WaitHandle
s 및Monitor
패턴 - 앱에서 예외가 전혀 발생하지 않습니다.
- 응용 프로그램이 콘솔 출력을 만들지 않습니다.
- 앱은 완전히 관리되는 코드입니다. 1x750MB 및 12x8MB 몇 작은 것들
측정 성능 :
- CPU 사용이 두 경우 모두에서 최소한의; 디버거가 장착 된 경우 CPU는 <에 위치합니다. 1 %
- 두 경우 모두 메모리 사용이 최소화됩니다. 어쩌면 두 경우 모두 50 또는 60MB
- 디버거가 연결될 때 페이지 폴트가 많이 발생하지만 (디버그가 연결될 때) 느리게 발생합니다.
- VS 호스팅 프로세스가 사용되지 않거나 기본적으로 '원격 디버깅 모니터 '가 작동하면 은이 적절한 양의 CPU를 사용하고 페이지 폴트가 많습니다. 그러나 문제가 발생하는 유일한 시간은 아닙니다.
- 성능 차이는 클라이언트 실행 방법에 관계없이 나타납니다. 변경되는 유일한 변수는 탐색기에서 시작한 '디버깅 시작'을 통해 실행되는 서버 구성 요소입니다.
내 아이디어 : 디버깅 할 때
- WCF가 느린?
- 디버깅 할 때 MemoryMappedFiles가 느려 집니까?
- 40 개의 스레드가 사용되었습니다 - 디버그 속도가 느 릅니까? 아마도 모니터/잠금 장치가 디버거에 알릴 수 있습니까?스레드 스케줄링이 비정상적인/문맥 전환이 매우 드물게됩니까? VS
모든 지능과 유머의 잔인한 감각을 부여
그래서, 내 질문 :
- 왜 이런 일이 무엇입니까?
- # 1 알 수없는 경우 어떻게 진단하고 확인할 수 있습니까?
첫 번째 예외 예외를 사용 했습니까? 또한 .NET 서버 소스 스테핑을 사용하여 디버그 모드에서 기본 "숨겨진"예외를 잡을 수 있습니다. 특히 예외가 있습니다. 또한, 흔적 (outputdebugstring 또는 기타)은 어떨까요? –
예, 예외는 전혀 발생하지 않습니다. 모든 예외 카테고리 (예 : .NET 포함)가 첫 번째 기회로 사용됩니다. 디버그 콘솔 출력이 없습니다 (콘솔 출력의 의미입니다 - 명확하게 편집 할 것입니다). .NET Framework Source Stepping (서버 소스 스테핑을 볼 수 없음)을 사용했습니다. 몇 가지 예외가있었습니다. 일시적으로 업데이트됩니다. –
WCF의 예외 : " ''문자 (16 진수 값 0x20)는 이름에 포함될 수 없습니다."나는 이런 식으로 예외를 숨길 수 있다는 생각을하지 못했다. 예외적 인 예외는 아닌가? 내가 해결할 수있는 것을 볼 수 있습니다. 아마도 당신은 답변을 게시 할 수 있으므로 일부 upvotes/수락 얻을 수있는이 수정하면? :) –