2009-04-05 4 views
3

터미널 서비스 환경에서 .NET 2.0 WinForms 응용 프로그램을 실행하면 예기치 않은 결과가 나타납니다. 내가 읽은 모든 것은 JIT 어셈블리 (즉, 네이티브 이미지를 생성하기 위해 NGen을 사용하지 않음)가 모든 코드 공간을 사적 페이지에 저장함으로써 작업 세트 크기/메모리 압력을 증가 시킨다는 것을 나타냅니다. 그러나 실제 결과 (Process Explorer, VMMap 및 WinDbg를 사용하여 검증 됨)는 실제로 JIT의 어셈블리가 공유 가능 페이지에 배치되었음을 보여줍니다. (실제로 실행중인 응용 프로그램이 여러 개인 경우에도 별도의 TS로 공유됩니다. 세션/사용자)..NET JIT'ed 어셈블리 (공유 가능 페이지에 있음)

이유가 무엇인지 설명 할 수 있습니까? 이것은 W2K8 서버 환경에서 실행되므로 ASLR은 각 어셈블리에 대해 특정 기본 주소가 부족한 이유를 설명합니다 & 결과 리베이스가 문제를 일으키지 않습니다. 그럼에도 불구하고 이러한 것들이 원시 PE 이미지가 아닌 것으로 보이기 때문에 개인 페이지에 저장되는 어셈블리에 대한 코드가 생성되어야합니다.

이것은 우리가 NGen을 사용하여 메모리 부족을 줄이기 위해 조사를 시작했을 때 발견되었지만 JIT의 어셈블리가 이미 공유되었으므로 실제로 작업 세트 크기가 늘어난 것을 발견했습니다.

http://blogs.msdn.com/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx

편집 :

내가 발견 한 가장 최근의 참조는 다시 우리의 실제 결과는 다른 어떤 여기 나는 그것을 추가해야합니다 첫번째 질문, 윈도우에 대한 실험을 게시 이후 Server 2003 테스트 상자는 프로세스간에 공유 할 수있는 JIT의 어셈블리를 분명히 보여줍니다. 나는 내가 발견 할 수있는 모든 조언이 NGen이 필요하다는 것을 나타내는 이유에 관해서는 여전히 혼란 스럽다. 그러나 모든 현실 세계의 증거들은 그와 모순된다. 나는 여기 전문가들이 약간의 빛을 발할 수 있기를 정말로 바라고있다.

감사합니다.

편집 : 나는 모든 .NET/CLR 서적을 정리했으며이 문제를 해결하기 위해 검색 쿼리 아이디어가 부족합니다. 누가 나에게 무슨 일이 일어나고 있는지 이해하지 못한다는 끔찍한 잔소리 같은 감정을 없애기 위해 하루를 보냈습니다! :)

+0

NGen이 메모리 사용에 실제로 도움이된다는 (그리고 우리 환경에서 시작 시간의 영향을 무시할 수 있음) 어떠한 확실한 증거가 없으면 우리는 어셈블리의 기본 이미지를 생성하지 않기로 결정했습니다. 나는 아직도 우리가 왜 이런 예기치 않은 행동을하고 있는지 알고 싶습니다! – allgeek

답변

4

저는 모듈 페이지를 직접보고 있다고 생각합니다. JIT 코드를 실행하면 DLL에 나타나지 않고 런타임에 할당 된 메모리에 표시됩니다. 보고있는 모듈 페이지는 주로 메타 데이터와 일리노이로, 이는 여전히 공유 할 수있는 이유입니다.

실험으로 나는 30K 개의 정적 메서드를 생성하고 호출하는 작은 프로그램을 작성했습니다. 내 시스템에서이 프로그램의 JIT 버전은 8.2 MB의 전용 컴파일 메모리를 가지고 있으며 NGEN 버전은 3.8입니다.

그러나 모듈 페이지 내에서도 NGEN은 메모리 사용에 도움을줍니다. 런타임에서 NGEN 이미지를로드 할 수 있으면 코드를 JIT하기 위해 모듈의 메타 데이터를 읽을 필요가 없습니다. 테스트 응용 프로그램의 JIT 버전은 2.3MB의 작업 세트를 사용합니다. NGEN 버전은 32 킬로바이트를 사용하고 있습니다.

NGEN도 시작 시간에 도움이됩니다. 웜업 시작 시간에 미치는 영향은 무시할 만하지만, 콜드 스타트 ​​업 시간에 미치는 영향 (디스크에서 모든 페이지 읽기가 저장 됨)이 눈에 띄게됩니다.

+0

응답 해 주셔서 감사합니다!나는 물건을 무너 뜨리고 간단한 테스트를 해보 겠지만 같은 결과를 보지 못했다. 그리고 내가 읽은 (그리고 내가 언급 한 블로그 게시) 것을 보면, 나는 모듈 페이지의 차이를 실제로 볼 수 있어야한다. AFAIK, CLR은 리플렉션, CAS 정책 검사 등을 지원하기 위해 메타 데이터를 읽어야합니다. NGEN은 그것을 제거하지 않습니다. 많은 사용자가 실행하는 TS 서버 기반 응용 프로그램이므로 메모리 사용이 중요하며 콜드 스타트 ​​시간은 본질적으로 관련이 없습니다. – allgeek

+0

괜찮습니다. 리플렉션 등의 메타 데이터 액세스는 모두 게으르며 이러한 시나리오를 지원하기 위해 열심히로드되지 않습니다. TS 시나리오에서 메모리 사용이 핵심 요소라는 것을 알고 있습니다. 이 기사를 읽으시기 바랍니다 : http://msdn.microsoft.com/en-us/magazine/cc163610.aspx. 모듈 페이지를 다시 보면 크기/커밋 대신 vmmap의 WS 열을 살펴보십시오. WS는 2.3MB에서 32KB 크기의 실제 사용 페이지 크기입니다. 행운을 빕니다! –