2012-02-28 1 views
3

동일한 프로세스를 실행하는 여러 Windows 2008 R2 24 코어 서버가 있지만 프로세스의 각 인스턴스마다 다른 데이터 세트가 있습니다. 일반적으로 프로세스의 2-4 인스턴스는 각 서버에서 실행됩니다. 프로세스는 x64 용으로 컴파일되고 GUI가 있으며 Workstation GC를 사용합니다..NET 4.0 프로세스 실행이 몇 초 동안 일시 중지되고 스왑 파일 작업으로 인해 Full GC가 진행됩니까?

초마다 프로세스는 GC 수를 로컬 디스크의 로그 파일로 출력합니다. 로그는 다른 많은 것들에도 사용됩니다. 가끔씩,이 프로세스 중 하나가 5 초 이상 실행을 일시 중지합니다. 나는 아무 것도 그 기간 동안 기록에 쓰여지는 것을 볼 수 없다. 이런 일이 발생할 때마다 Gen2 GC의 수가 1 씩 증가하는 것으로 나타납니다.

이것은 드물게 발생합니다. 이것은 모든 프로세스에서 10000 Gen2 GC마다 한 번 발생합니다.

각 시스템에는 RAM의 모든 프로세스를 유지할 수있는 충분한 RAM이 있습니다.

오늘 아침에 프로세스 중 하나에서 9 초의 일시 중지가 발생했으며 이번에는 영향을받은 프로세스와 전체 시스템에 대한 성능 카운터를 캡처했습니다. 당시 실행중인 다른 프로세스는 영향을받지 않았습니다.

일시 정지 이전에 일시 정지 한 후 비교 : 하락 프로세스에 대한

  • 가상 바이트, 페이지 파일 바이트, 가상 바이트, 작업 설정 및 작업 세트 - 개인 성능 카운터의 분석은 다음을 보여줍니다 대략 같은 금액 - 1Gb. Private Bytes는 프로세스의 크기에 대한 아이디어를 제공하기 위해 3.1Gb에서 2.1Gb로 떨어졌습니다. 프로세스에 대한
  • 핸들 수는 일시 정지 중에
  • CPU 사용량이 안정 스파이크하지 않은 약 1 기가
  • 페이지 오류/초 증가, 전체 시스템에 대한 8705에 8835에서
  • 가능한 바이트 감소

누구든지이 활동이 스와핑의 원인 일 수 있음을 확인할 수 있습니까? 컴퓨터에 충분한 RAM이있는 것을 감안할 때 이러한 일시 중지를 수정하기위한 제안이 있습니까?

업데이트 # 1 (2012년 3월 5일는) :

는 프로세스 중 하나 오늘 6.5 초 일시 정지를 경험했다. .NET Clr 메모리 성능 카운터는 LOH의 크기가 변경되지 않았지만 Gen 2 힙의 크기와 모든 힙의 크기 및 총 커밋 된 바이트가 700MB로 감소한 것을 보여줍니다. 예약 된 총 예약 바이트 수 250 Mb. 그래서 Gen2의 많은 쓰레기가이 특정 GC에서 회수 된 것처럼 보입니다.

업데이트 # 2 (2012년 3월 6일는) :

는 프로세스 중 하나 오늘 7 초간 정지를 경험했다. 다음은 누적되었습니다. Gen 2 힙 크기 (.NET CLR 메모리) by 900Mb 모든 힙의 숫자 바이트 (.NET CLR 메모리) 900Mb로 총 수탁 바이트 수 (.NET CLR 메모리) by 800Mb 총계 예약 된 바이트 (.NET CLR 메모리) 가상 바이트 (프로세스) : 550Mb 작업 집합 (프로세스) : 800Mb 작업 집합 - 개인 (프로세스) 페이지 파일 바이트 (프로세스) by 800Mb 개인 바이트 800 메가

은 LOH가 있었다 같은

+1

이것을 고려해 보셨나요? http://marcgravell.blogspot.com/2011/10/assault-by-gc.html? –

+1

.Net 성능 카운터를 보았습니까? 예를 들어 전후 LOH의 크기를 보면 재미있을 수 있습니다. – svick

+0

이 질문에 대한 답변을 검색하는 동안 Marc Gravell의 게시물을 보았습니다. LOH가 범인 인 것으로 밝혀지면 Marc의 게시물에서 제안 사항을 사용하여 문제를 완화 할 수 있습니다. – sevzas

답변

2

진실한 Gen2 GC는 몇 기가 바이트 크기의 과정에서 몇 초가 걸린 것처럼 보입니다.

왜 일부 Gen2 GC는 5 초가 걸리지 만 다른 사람들은 거의 시간을 들이지 않습니까? Concurrent/Background Gc가 활성화되어 있고 Concurrent GC가 완료되면 Gen2 GC 카운터가 증가하는 것처럼 보입니다. 나는 이것이 오도 된 것이라고 생각한다.

동시 GC를 비활성화하면 Gen2 GC 수가 현저하게 감소하고 모든 Gen2 GC가 몇 초가 걸립니다.

3

응용 프로그램의 동작은 대형 오브젝트 힙의 세그먼트 많은 (this link in msdn 참조) 같은 GC 2 사이클 내에서 "죽은 자"가 될 수 있도록 인 것 같습니다. GC 2 이후에 LOH의 세그먼트가 죽어 버리면 OS로 돌아오고, 많은 양을 동시에 반환 할 때 비용이 많이 든다.

응용 프로그램이 CLR GC 모드가 조정되는 봉투 밖으로 떨어질 수 있습니다. 응용 프로그램에서 큰 배열과 같은 큰 개체를 반복적으로 할당하는 경우 GC를 사용하는 대신 풀링하고 다시 사용하여 더 많은 예측 가능한 GC 동작을 얻을 수 있는지 확인할 수 있습니다.

+0

Svick과 antlersoft의 의견은 지연의 가능한 원인으로 LOH 가비지 수집을 가리 킵니다. 나는 이것을 고려하지 않았다. 필요한 성능 카운터를 캡처하고 몇 가지 결과를 얻으면이 스레드를 업데이트하도록 설정했습니다. – sevzas

관련 문제