2010-07-31 2 views
4

Environment.WorkingSet이 Windows 2003 Server에서 실행되는 웹 사이트의 메모리 사용을 잘못보고합니다 (OS 버전 : Microsoft Windows NT 5.2.3790 서비스 팩 2, .NET Vers : 2.0.50727.3607).)Environment.WorkingSet이 메모리 사용을 잘못보고 함

메모리를 Working Set (Physical Mem.) : 1952MB (2047468061)로보고합니다.

같은 웹 사이트는 작업 세트 (실제 메모리)가있는 Windows Vista에서 로컬로 실행됩니다 : 49MB (51924992). 내가 서버 및 지원에 대한 액세스가 제한

는 :(너무 제한되어 는 그래서 난 VirtualQuery으로 통과하여 총 메모리를 계산 상태 페이지의 총있다 :.. MEM_FREE 1300 MB입니다 (I는 서버가 같아요. 4GB의 RAM 및 PAE가 활성화되어 있지 않으면 최대 사용자 모드 가상 주소는 0x7fff0000입니다.)

그래서 작업 세트는 가상 메모리에 관한 것만은 아니지만 일반적으로 높은 작업 세트는 다른 컴퓨터에서 매우 낮음

답변

1

나는 문제가 this article에 설명 된 것과 관련이있다 생각 :

2005년 5월 4일은 WorkingSet와
재미와
이 int32가 드디어에서 선 (善)의 버그 정직한를 발견했다. 넷 프레임 워크.

... WorkingSet은 프로세스에서 사용중인 메모리 양을 정수 (32 비트 부호있는 정수)로 반환합니다. 그렇기 때문에 정수의 최대 값은 2,147,483,647입니다. 이는 프로세스가 작업 집합에 가질 수있는 전체 메모리 양인 에 매우 가깝습니다.

... 실제로 Windows에서 스위치가 2 기가 아닌 3 기가를 사용할 수 있도록하는 스위치가 있습니다. 이 스위치는 이 Analysis Services를 다룰 때 켜지는 경우가 많습니다.이 것은 메모리가 될 수 있습니다. 그래서 이제는 작업 세트를 폴링 할 때 음수가 큰 음수 인 숫자를 얻습니다. 보통 -2,147,482,342의 영역에 있습니다.

... 문제는 오버플로 비트입니다.

작업 집합은 이진 값으로 .NET Framework에 반환됩니다. 정수의 첫 번째 비트는 부호 비트입니다. 0은 양수, 1은 음수입니다. 따라서 값이 (이진) 1111111111111111111111111111111에서 (이진수) 10000000000000000000000000000000으로 바뀌면이 값은 2147483647에서 -2147483647로 변경됩니다.

그래, 그래도이 문제를 해결해야합니다.다음은 내가 (C#에서) 생각해 낸 것입니다.

long lWorkingSet = 0; 
if (process.WorkingSet >= 0) 
lWorkingSet = processWorkingSet; 
else 
lWorkingSet = ((long)int.MaxValue*2)+process.WorkingSet; 

이제는 문제가 해결되기를 바랍니다.

실제 질문은 길 아래로 올 것입니다. Microsoft knows 약 이 문제는. 나는 그들이이 문제를 해결할 방법을 여전히 알고있다. Win64 ...이 트릭은 더 이상 작동하지 않을 것이다.


http://msdn2.microsoft.com/library/0aayt1d0(en-us,vs.80).aspx

:
이 될거야 Process.WorkingSet64 변수가있을 수있어, 그들은 비하은 WorkingSet입니다.

런타임에서 메모리를 여러 힙으로 분할하기 때문에 접두사에서 관리 된 프로세스가 3GB 한계에 도달하는 것이 불가능하다고 생각했습니다. 이것은 사실이 아닌가?

+2

이 답변은 링크 일뿐입니다. 링크가 죽었습니다. –

1

Environment.WorkingSet은 아마도 GetProcessWorkingSetSize, w hich는 기본적으로 SetProcessWorkingSetSize으로 설정된 것입니다. 기본적으로 시스템이 가장 큰 작업 세트 크기로 선택되었으므로 이고이 프로세스는 실제로 얼마나 많은 메모리를 사용하는지와 관련이 없습니다. 기본적인 효과는 프로세스가 메모리보다 더 많은 메모리를 사용할 때 시스템의 작업 세트 트리머가 메모리 중 일부가 디스크로 페이징 될 수 있는지를보기 위해 작동한다는 것입니다.

+0

아니요, GetProcessWorkingSetSize를 사용하지 않고 psapi.dll의 GetProcessMemoryInfo()를 사용하여 프로세스 메모리 카운터 값 인 WorkingSetSize에 액세스합니다. – lockedscope

관련 문제