2008-12-10 4 views
7

내 컴퓨터 (XP, 64)에서 ASP.net 작업자 프로세스 (w3wp.exe)는 항상 5.5GB의 가상 메모리가 예약되어 시작됩니다. 이것은 호스팅하는 웹 응용 프로그램과 상관없이 발생합니다 (아무 것도 될 수 있습니다. 심지어 aspx의 빈 웹 페이지 일 수도 있습니다).누가/무엇을 예약했는지 확인 w3wp.exe에서 5.5GB의 가상 메모리

가상 메모리의이 오래된 큰 덩어리는 프로세스가 시작될 때 예약되어 있으므로 점진적인 메모리 누출이 아닙니다.

windbg에서 주위를 기웃 거리며 설명하는 것은 메모리가 개인, 예약 및 RegionUsageIsVAD라는 것을 보여줍니다. 이는 VirtualAlloc을 호출 한 사용자의 작업 일 수 있음을 나타냅니다. 또한 문제의 메모리가 각각 1GB의 큰 덩어리 4 개와 작은 여러 개의 작은 덩어리 (각각 1/4GB)로 할당/예약된다는 것을 보여줍니다.

그래서 내가 VirtualAlloc을 호출하고이 메모리를 모두 예약해야 하는지를 알아야합니다. 어떻게해야합니까?

w3wp.exe가 svchost.exe (IIS/ASP.Net 필터)에서 시작한 프로세스이기 때문에 메모리 할당 전에 프로세스에 디버거를 연결하는 것이 어렵습니다. 그것을 디버그하기 위해서는 메모리를 많이 차지하지 않고 그냥 닫으십시오. 또한 명령 줄 매개 변수를 사용하지 않으면 명령 줄 매개 변수가 유효하지 않습니다 (호출 프로세스에서 생성 된 파이프이기 때문에 의미가 있습니다).

사실 (문제의 메모리 영역을 어떻게 찾았는지) 후에 프로세스에 windbg를 첨부 할 수 있지만 그 시점에서 할당 된 사람을 결정하는 것이 가능하지는 않습니다.

+1

나는 단지 "Oh My God"라고 말하고 싶습니다. – StingyJack

+0

NBC.com의 Heroes 페이지 외에도 새로운 태그를 사용한 첫 번째 관련 용도입니다. –

+0

서버 2008, IIS7에서 동일한 동작이 나타납니다. –

답변

7

다윗 왕 answers this to a similar question :

[...]를 ASP.Net 성능 개발까지 per는 다음과 같이 알려줍니다.

  • 예약 된 가상 메모리는 아무런 문제가되지 않습니다. 당신은 을 CLR의 성능/캐싱 전제 조건 으로 볼 수 있습니다. 그리고 무거운 하중 테스트 약 아무것도 걱정하지 않는다는 것을 보여줍니다 .
  • System.Windows.Forms - 비어있는 안녕하세요 세계 ASPX 페이지에서 가져온 것이 아닙니다. Microsoft 디버깅 도구와 "xxx system.windows.forms"를 사용하여 런타임에 실제로 이 무엇을 가져 오는지 확인할 수 있습니다. 또는 ildasm을 사용하여 종속성을 찾을 수 있습니다.
  • mscorlib - GAC로되어 있고 제대로 NGN되어 있는지 확인하십시오.
3

가상 메모리는 프로세스에 할당 된 주소 공간입니다. 메모리 사용과는 아무런 관련이 없습니다.

참조 :

  1. Virtual Memory
  2. Pushing the Limits of Windows: Virtual Memory
  3. http://support.microsoft.com/kb/555223
+0

예약 된 가상 메모리의 양이 프로세스의 "가상 크기"에 영향을 미치므로 가상 메모리 제한에 따라 asp.net에서 프로세스 재활용이 효과적이지 않습니다. –

+0

그게 무슨 뜻입니까? VM은 증가 된 주소 지정 요구로 인해 증가 할 수 있습니다. 이것이 너무 커질 지 확신하지 못합니다. 나는 정말로 시험 할 수 없다, 단지 32 비트의 비스타를 여기에서 가지고있다. 최대 3GB VM AFAIK를 얻을 수 있지만 프로세스 당 실제 메모리 최대 크기는 2GB에 불과합니다. – leppie

0

예약 메모리할당 된 메모리는 매우 다르다. 메모리를 예약하면 주소 공간 만 할당됩니다.물리적 페이지를 저 지르지 않습니다.

이 주소 공간은 IIS에서 해당 힙을 할당 할 가능성이 높습니다. 필요한 경우에만 페이지를 커밋합니다.

windbg에서 w3wp.exe를 실행하려면 유효한 명령 줄 인수로 실행해야합니다. Process Explorer을 사용하여 현재 w3wp.exe 프로세스의 명령 줄을 확인할 수 있습니다. 예를 들어, 내 서버에, 광산이었다 :

C :. 20 -ap -t \ 창 \ system32를 \ inetsrv를 \ W3wp.exe를 -a \ \ 파이프 \의 iisipmeca56ca2-3a28-452a-9ad3-9e3da7b7c765 " 을 DefaultAppPool "

나는이 지정에서 어떤 UID 모르겠지만, 아마이 지정된 파이프의 이름을 (W3wp.exe를 출시 무엇인가) W3SVC 서비스에 의해 즉석에서 발생하는 것 같습니다. 따라서 windbg에서 w3wp를 시작하기 전에 명령 행을 확실히 봐야합니다.

+0

이 명령 줄 인수는 한 번만 사용할 수 있으므로 재사용 할 수 없습니다. –