2011-01-27 7 views
10

메모리 프로파일 러, dotTrace 및 perfmon 카운터를 사용하여 C# 응용 프로그램의 메모리를 프로파일 링합니다. 내가 대답 할 수 없었던 한 가지 질문은 가비지 콜렉션이 응용 프로그램에서 야기하는 최대 대기 시간은 얼마입니까? 가비지 컬렉션에서 % 시간을 사용하여 대략적인 값을 얻을 수 있지만 개별 컬렉션의 시간을 측정하는 방법은 있습니까?.NET 가비지 수집 대기 시간

+1

어떤 .NET 버전입니까? 애플리케이션에 몇 개의 스레드가 있습니까? 그것은 어떤 I/O를합니까? GC로 인해 대기 시간이 지연되지 않을 수도 있습니다. "대기 시간"이란 말은 GC가 끝나기를 기다리고 있기 때문에 프로그램이 아무런 도움이되지 않는 시간을 의미한다고 생각합니다. –

+0

예, 대기 시간을 의미합니다. 나는 이론적 인 대답이 아니라 그것을 측정 할 수있는 방법에 관심이 있습니다. 아니면 GC에서 (GCt1-GTt0) * % 시간보다 가비지 수집 대기 시간을 측정하는 더 좋은 방법이 있습니까? 여기서 t는 시간입니까? 또는 오류율이 값보다 높기 때문에 GC gen # 0이 유용하지 않습니까? – Patrick

답변

8

2 가지 질문을하시는 것 같습니다. 1- GC의 대기 시간은 최대입니까? 2 개별 GC 수집 시간은 어떻게됩니까?

# 1의 경우 GC 처리량은 대략 200MB/초/힙입니다. 이것은 GC가 1 초에 100MB 크기의 힙을 수집 할 수 있음을 의미합니다. perheap 개념은 서버 GC 때문입니다. CPU 당 1 힙을 생성하기 때문입니다.

거대한 힙이있는 경우 큰 대기 시간을 볼 수 있습니다. GC는 메모리를 수집 할 때 일시적인 방식으로 처리하므로 Gen0/Gen1 컬렉션은 전체 GC 컬렉션과 비교할 때 매우 저렴합니다.

.NET 4.0에서는 클라이언트 응용 프로그램의 GC 대기 시간을 최소화하는 기능을 추가했습니다.이 기능은 GC 동시 모드에서 기본적으로 사용됩니다. 이 모드에서는 응용 프로그램이 실행되는 동안 백그라운드 스레드에서 힙을 수집하려고합니다. 결과적으로 클라이언트 응용 프로그램의 일시 중지 시간이 단축됩니다.

# 2 : 우리는 ETW라는 매우 유용한 추적 기능을 제공합니다 (Windows에서 사용 가능하며 CLR에서이 기능을 활용합니다). ETW는 Event Tracing For Windows (을 의미합니다. GC가 시작될 때와 GC가 완료 될 때 ETW 이벤트를 시작합니다. 이 ETW 이벤트를 사용하여 각 GC에서 소요 된 시간을 계산할 수 있습니다.

자세한 내용은 CLR ETW reference을 참조하십시오. 또한 ETW 이벤트를 처리 할 수있는 멋진 관리 라이브러리의 경우 TraceEvent

희망이 도움이됩니다. 감사합니다.

+0

사실, 단 하나의 질문입니다. 애플리케이션에서 가비지 콜렉션의 최대 대기 시간을 어떻게 결정합니까? 그러나 추가 정보는 매우 환영 할 만하 며 .NET 4.0의 중요한 새 기능 목록에 ETW를 추가 할 수 있습니다. 감사. – Patrick

2

나는 '최대 대기 시간'이 있다고 생각하지 않습니다. GC는 메모리가 부족할 때 실행됩니다. 2GB가있는 컴퓨터에서 실행되는 동일한 앱은 4GB 컴퓨터의 동일한 앱보다 더 자주 수집합니다.

.NET으로 시작했을 때 정말 힘들었습니다. 메모리가 커지는 것을 지켜 보았습니다. 내가 누수가 있다고 생각해서 무서웠어요. 그러나 시간이 지남에 따라 GC가 안정되고 모든 것이 순조롭게 진행되는 것을 볼 수 있습니다.

OOM 예외 또는 기타 잘못된 동작이 발생하는 경우 걱정할 때입니다. 그렇지 않으면 GC가 그 일을하도록하십시오.

EDIT : zneak가 좋은 의견을 남깁니다. 질문에 대한 오해가있을 수 있습니다.

GC 소요 시간은 많은 요인에 따라 달라집니다. 어떤 세대가 수집되고 있습니까? Gen0은 매우 빠릅니다. Gen1은 오래 걸리고 Gen2는 더 오래 걸립니다. 좋은 메모리 활용도로 모든 Gen2에 대해 10 개의 Gen1 모음을 찾고 모든 Gen1에 대해 10 개의 Gen0을 찾습니다. 매일 많이 사용되는 웹 사이트에서 10,000 Gen0, 1000 Gen1 및 100 Gen2를 볼 수 있습니다. YMMV.

+1

그는 오히려 '어떻게 이론적으로 얼마나 오래 걸릴 수 있느냐'라는 '최악의 경기가 얼마나 오래되었는지'를 의미 할 수 있다고 생각합니다. – zneak

4

GC.RegisterForFullGCNotification() 메소드로 gen # 2 모음 (느린 모음)을 시간 지정하는 것이 가능합니다. 그러나 수집기의 서버 버전 (.config 파일의 <gcserver> 요소)이 필요합니다.

클래식 Heisenbergian은 워크 스테이션 버전 만 동시 gen # 2 모음을 지원하므로 지연을 크게 향상시킬 수 있습니다. 실제 지연 시간은 이며 예측할 수 없습니다. 동시 수집이 진행되는 동안 프로그램의 스레드가 할당량을 지정하고 gen # 0 및 # 1을 채우는 속도에 크게 좌우됩니다. 이 질문을 할 필요가 없습니다.