2010-02-08 2 views
6

프로파일 링 할 수있는 도구가 있습니까 .Net 스레드 경합. 느린 실행중인 Windows 서비스 스레드에 대한 성능 카운터를 추가했습니다. 그것은 약 150 스레드 경합을 보여줍니다. 나는 Thread Conflions의 많은 부분을 담당하는 코드의 영역을 분석하고 싶습니다. 올바른 코드 블록을 가리킬 수있는 도구가 있습니까?프로파일 링 .Net 스레드 경합

답변

2
+0

예 그와 같은 것을 찾고 있습니다. 하지만 불행히도 나는 VS.Net 2005에 있습니다. – Amitabh

+0

@Amitabh : 여기 VS2010을 다운로드 할 수 있습니다. http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx –

+2

VS2010은 .NET 2.0을 대상으로 할 수 있습니다. 프로젝트 파일 (.csproj, .vbproj) 및 솔루션 (.sln) 만 업그레이드하면됩니다. 코드를 마이그레이션 할 필요가 없습니다. .NET 2.0 프로젝트에서 프로파일 러를 사용할 수 있는지는 잘 모르겠지만, 그럴만 한 가치가 있습니다. –

0

프로파일 러가 아니지만 sosex.dll 확장명이 적용된 windbg로 인해 교착 상태를 알 수 있습니다. 이를 here으로 찾고! dlk 명령을 읽으십시오.

2

Visual Studio 2008 프로젝트에서 같은 문제가 발생하여 VS2010의 스레드 경합 프로파일 러를 사용할 수 없었습니다. 대신 진단 대기열 인 TimedMonitor을 작성하여 잠금 대기에 소요 된 시간을 추적합니다.

를 사용하려면, 당신은 대체 할 것이다 :

object myLock = new object(); 
lock (myLock) { /* do work */ } 

로 :

TimedMonitor timedLock = new TimedMonitor(); 
using (timedLock.Lock()) { /* do work */ } 
Console.WriteLine("Lock was entered {0} times; total wait time: {1}.", 
    timedLock.EnterCount, timedLock.WaitTime); 

만 Monitor.Enter 또는 잠금 장치, 즉 간단한 잠금 (작은 번호를 사용하는 경우 키워드)를 TimedMonitor로 대체하고 출력을 로깅하면 대기 시간이 가장 많이 걸리는 잠금을 식별 할 수 있습니다. 그러나 더 복잡한 관리 잠금 (예 : ReaderWriterLock) 또는 기본 동기화 (예 : ManualResetEvent)를 사용하는 경우 추적하지 않기 때문에 도움이되지 않습니다.