2011-10-19 2 views
8

클라이언트/서버 앱이 있습니다. 서버 구성 요소가 실행되고 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. 왜 이런 일이 무엇입니까?
    2. # 1 알 수없는 경우 어떻게 진단하고 확인할 수 있습니까?
  • +1

    첫 번째 예외 예외를 사용 했습니까? 또한 .NET 서버 소스 스테핑을 사용하여 디버그 모드에서 기본 "숨겨진"예외를 잡을 수 있습니다. 특히 예외가 있습니다. 또한, 흔적 (outputdebugstring 또는 기타)은 어떨까요? –

    +0

    예, 예외는 전혀 발생하지 않습니다. 모든 예외 카테고리 (예 : .NET 포함)가 첫 번째 기회로 사용됩니다. 디버그 콘솔 출력이 없습니다 (콘솔 출력의 의미입니다 - 명확하게 편집 할 것입니다). .NET Framework Source Stepping (서버 소스 스테핑을 볼 수 없음)을 사용했습니다. 몇 가지 예외가있었습니다. 일시적으로 업데이트됩니다. –

    +0

    WCF의 예외 : " ''문자 (16 진수 값 0x20)는 이름에 포함될 수 없습니다."나는 이런 식으로 예외를 숨길 수 있다는 생각을하지 못했다. 예외적 인 예외는 아닌가? 내가 해결할 수있는 것을 볼 수 있습니다. 아마도 당신은 답변을 게시 할 수 있으므로 일부 upvotes/수락 얻을 수있는이 수정하면? :) –

    답변

    9

    예외는 특히 응용 프로그램의 성능에 영향을 미칠 수 있습니다. 예외에는 두 가지 유형이 있습니다. 첫 번째 예외 (try/catch 블록으로 정상적으로 처리 된 예외)와 처리되지 않은 예외 (결국 응용 프로그램이 중단됨)입니다.

    기본적으로 디버거에는 첫 번째 예외가 표시되지 않고 처리되지 않은 예외 만 표시됩니다. 또한 기본적으로 코드에서 발생하는 예외 만 표시합니다. 그러나 표시하지 않더라도 여전히 처리하므로 성능이 영향을받을 수 있습니다 (특히로드 테스트 또는 큰 루프 실행시).

    Visual Studio에서 첫 번째 기회 예외를 표시하려면 예외 대화 상자를 호출하는 "디버그 | 예외"를 클릭하고 "공용 언어 런타임"섹션에서 "던져진"을 선택하십시오 (보다 구체적으로 1 차 선택 가능 당신이보고 싶은 기회 예외).

    "도구 | 옵션 | 디버깅 | 일반"을 클릭하고 "내 코드 만 사용"옵션을 해제하여 응용 프로그램의 모든 위치에서 발생하는 첫 번째 기회 예외를 표시 할 수 있습니다.

    이러한 "포렌식 모드"의 경우 .NET Framework 원본 스테핑을 사용하도록 설정하는 것이 좋습니다 ("내 코드 만 사용함"을 사용하지 않도록 설정해야합니다). 그것은 때로는 호출 스택을보고 매우 감동입니다 무슨 일이 일어나고 있는지 이해하는 데 매우 유용하다 - 특히 :-) 우주 방사선 호환 문제의 경우에 도움

    두 관련된 흥미로운 기사 :

    +1

    다른 의견에 따르면, 예외는 완전히 '숨김'으로, '.NET Framework Source Stepping'을 사용할 때까지는 예외였습니다. 'SerializationInfo.SetValue()'가 유효한 XML 요소 이름이 아닌'string' 매개 변수에 대한 예외를 던지는 오류가있었습니다. 작동을 계속할지라도 NetTcpBinding (즉, 바이너리 포맷터)을 사용하고있었습니다. . –

    2

    내가 좋아하는 사람에게 연구의 2 시간 절약의 희망 여기 내 문제 솔루션을 추가 할이 문제에 대한 인터넷 검색을 최초의 결과 중 하나입니다 내 경우.

    내 코드는 디버거없이 4 분에 연결된 디버거없이 30 초에서 느려졌습니다. 조건부 중단 점을 삭제하는 것을 잊었 기 때문에. 이것들은 실행 속도를 엄청나게 늦추는 것처럼 보이므로주의하십시오.

    관련 문제