너무 많은 RAM을 사용하는 Windows, 리소스 돼지 진단 방법


73

16GB의 시스템 RAM이 있습니다. 작업 관리자를 제외하고 응용 프로그램이 열려 있지 않은 상태에서 시작할 때 Windows는 약 3GB의 RAM을 사용합니다. 프로세스 탭을 보았지만 평범하지 않은 것 같습니다. Windows에서 RAM이 많은 이유를 어떻게 알 수 있습니까?

여기에 이미지 설명을 입력하십시오

모든 사용자의 모든 프로세스

여기에 이미지 설명을 입력하십시오


poolmon에서 읽은 무선 광대역 드라이버가 약 0.4GB의 RAM을 사용하고있는 것 같습니다. 제거해도 시동시 여전히 2.6GB를 사용하고 있습니다. 여전히 너무 많습니다.

여기에 이미지 설명을 입력하십시오


메모리 누수와 관련된 무선 드라이버를 다시 설치 한 후 새 스크린 샷이 있는데 실제로 메모리 누수임을 확인하고 싶습니다.

여기에 이미지 설명을 입력하십시오


3
우선 12GB 만 있습니다. 4GB 스틱 4 개 중 하나가 잘못되었거나 제대로 장착되지 않았거나 메인 보드가 16GB를 지원하지 않습니다. 둘째, 맬웨어를 검사하기 위해 보안 프로그램을 실행 해 보셨습니까? Security Essentials는 기본 제공되므로 정의를 업데이트하고 스캔을 실행하십시오. 루트킷은 특히 숨겨져 있기 때문에 일부 안티 루트킷 프로그램을 사용해보십시오 (그러나 일반적으로 낮은 프로파일을 유지하여 눈에 띄지 않게하려고 시도하고 몇 기가 바이트의 RAM을 사용하는 것은 거의 혼합되지 않습니다).
Synetech

성능-> 리소스 모니터
Journeyman Geek

출력을 파일 C : \ blah> tasklist> aa로 리디렉션하여 tasklist 명령을 실행 한 다음 파일 aa를 열고 각 프로세스에 대한 총계 (예 : 15,100K)를 확인한 후 K를 제거하고 총계를 Excel로 합산하십시오. 작업 관리자가 사용 된 그래프 근처에 사용 된 수치와 총계가 일치하는지 확인하십시오. 나를 위해 작업 목록의 총계는 4GB이고 작업 관리자는 4.5GB입니다. 불일치를 설명 할 수는 없지만 크지 않습니다. 큰 불일치가 있으면 흥미로울 것입니다.
barlop

나는 엑셀이 없다
Vader

1
NDxx 태그는 ndis.sys입니다. BRCM이 Broadcom이라고 생각합니다. 네트워크 어댑터에 문제가 있음을 나타냅니다.
David Marshall

답변:


82

드라이버로 인한 메모리 누수가 있습니다. 비 페이징 커널 메모리의 높은 가치를보십시오. 귀하의 경우 이것은 3.7GB 이상입니다. poolmon 을 사용 하여 어느 드라이버가 많은 사용량을 일으키는 지 확인할 수 있습니다 .

Windows WDK를 설치하고 poolmon을 실행 P한 다음 풀 유형 이후를 정렬하여 페이징되지 않은 페이지가 맨 위에 오도록 B바이트 단위로 정렬 하여 대부분의 메모리를 사용하는 태그를 확인하십시오. WDK가 설치된 폴더로 이동하여 poolmon을 실행하고 도구 (또는 C : \ Program Files (x86) \ Windows Kits \ 10 \ Tools \ x64)로 이동 한 다음 poolmon.exe를 클릭하십시오.

이제 다음과 같이 어떤 풀 태그가 가장 많은 메모리를 사용하는지 확인하십시오.

여기에 이미지 설명을 입력하십시오

이제 cmd 프롬프트를 열고 findstr 명령을 실행하십시오. 이렇게하려면 cmd 프롬프트를 열고 "cd C : \ Windows \ System32 \ drivers"를 따옴표없이 입력하십시오. 그런 다음 "findstr / s __ . "를 입력하십시오 . 여기서 __은 태그 (poolmon에서 가장 왼쪽에있는 이름)입니다. 이 태그를 사용하는 드라이버를 확인하려면 다음을 수행하십시오.

여기에 이미지 설명을 입력하십시오

이제 드라이버 폴더 (C : \ Windows \ System32 \ drivers)로 이동하여 해당 드라이버를 마우스 오른쪽 단추로 클릭하십시오 (위 이미지 예에서 intmsd.sys). 특성을 클릭하고 세부 사항 탭으로 이동하여 제품 이름을 찾으십시오. 해당 제품의 업데이트를 찾으십시오.

pooltag가 Windows 드라이버 만 표시하거나 pooltag.txt ( "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\triage\pooltag.txt")에 나열된 경우

당신이 사용할 수있는 사용의 원인을 추적하는 xperf을 . Windows SDK에서 WPT를 설치하고 관리자cmd.exe를 열고 다음을 실행하십시오.

xperf -on PROC_THREAD + LOADER + POOL-스택 워크 PoolAlloc + PoolFree + PoolAllocSession + PoolFreeSession -BufferSize 2048 -MaxFile 1024 -FileMode Circular && timeout -1 && xperf -d C : \ pool.etl

30 ~ 60 초의 성장을 포착하십시오. WPA.exe로 ETL을 열고 풀 그래프를 분석 창에 추가하십시오.

pooltag 열을 먼저 놓고 스택 열을 추가하십시오. 이제 WPA.exe 안에 심볼을로드하고 poolmon에서 본 태그 스택을 확장하십시오.

여기에 이미지 설명을 입력하십시오

이제 스택에서 볼 수있는 다른 타사 드라이버를 찾으십시오. 여기서 Thre태그 (Thread)는 G-Data의 AVKCl.exe에 의해 사용됩니다. 드라이버 / 프로그램 업데이트를 찾아 수정하십시오.


1
미안 @Jebediah Kerman findstr 명령을 실행 했습니까? 이름에서 네트워크 카드 드라이버 관련이 될 수 있습니다. 여전히 문제가있는 경우 RAMMap을 실행하고 데이터를 RMP로 저장하고 RMP 파일을 압축 한 후 zip을 업로드하십시오.
magicandre1981

바보 같이 들릴 수도 있습니다. 그러나 나는 poolmon을 어떻게 시작합니까? 예전에는 "poolmon.exe"를 검색하고 시작했습니다.
Vader

@JebediahKerman 나는 당신이 이미 이것을하고 태그를 발견했다고 생각합니다. 게시물의 사진이 poolmon이 아닙니까?
magicandre1981

사진은 내 꺼야 어떤 이유로 검색 색인이 불완전했습니다.
베이더

@JebediahKerman이 NDFT가 무엇인지 보셨습니까? 또한 xperf를 사용하여 풀 사용량을 추적 할 수도 있습니다. channel9.msdn.com/Shows/Defrag-Tools/…
magicandre1981

15

우선, 더 자세한 답변을 시작하기 전에. 첫 번째 스크린 샷에서 비 페이징 풀 (커널 메모리 사용 유형)은 1.3GB입니다. 그것은 특히 부팅 후 30 분 동안 나에게 비정상적으로 높은 것 같습니다. 장기간 사용 후 또는 체처럼 누출되는 프로그램으로 NP Pool이 높은 것을 볼 수 있다고 생각합니다. 반대로 내 NP 풀은 일반적으로 100에서 200MB 사이이며 페이징 풀은 400 또는 500만큼 높을 수 있습니다 (그리고 몇 주 동안 재부팅하지 않고 시스템을 실행 한 후).


열 머리글을 마우스 오른쪽 단추로 클릭하고 열 선택을 선택하여 작업 관리자에서 몇 가지 추가 열을 활성화 할 수 있습니다. 당신은 추가해야합니다 Working Set (private), Working Set (shared), Commit,와 NP Pool. 모든 사용자의 모든 프로세스를 스캔하여 약 256KB 이상의 NP 풀이 있는지 확인하십시오. 특히 상당히 높은 것이 있으면 문제의 원인 일 수도 있고 적어도 일부일 수도 있습니다.

프로세스에서 사용중인 실제 메모리의 양인 총 작업 세트는 개인 및 공유 작업 세트 (WS)의 조합입니다. 개인은 대부분의 프로세스에서 일반적으로 더 크지 만 더 많은 양의 공유 WS를 사용하는 것이있을 수 있습니다. 둘은 일반적으로 총 WS에 합산되어야합니다. 커밋은 백업 저장소 (대부분의 경우 Windows 페이지 파일)에 커밋 된 작업 집합의 양입니다. 백그라운드 응용 프로그램은 종종 WS보다 커밋이 더 커져 페이징 풀의 많은 부분이 메모리와 페이징 파일로 스왑되었음을 나타냅니다 (최소한 한동안 사용되지 않은 데스크톱 앱의 경우 매우 정상 임).

비 페이징 풀은 실제 메모리에서 스왑 할 수없는 메모리이며 사실상 영구적 인 최소 실제 메모리 사용량입니다. NP 풀 메모리에는 종종 실제 또는 메모리에서 올바르게 또는 안전하게 동작하기 위해 필요한 특수 섹션 등의 프로그램 코드 및 중요 섹션이 포함되어 있습니다. 60 개의 프로세스 중 256KB의 NP 풀 메모리가있는 경우 60 개의 프로세스 중 절대 최소 실제 메모리 사용량 약 15,360KB입니다. 대부분의 경우 하나 또는 두 개의 앱에는 256KB NP 풀이있을 수 있지만 대부분은 더 적거나, 상당히 적습니다 (또는 없음). 시스템이 모든 프로세스 작업 세트 전체를 페이징 아웃하지는 않을 것이므로 메모리 사용량이 그렇게 낮아질 것으로 기대하지 마십시오.


마지막으로, 더 많은 메모리를 갖는 요점은 실제 디스크의 확장 메모리 공간 (스왑, 페이지 파일)으로 데이터를 페이징하지 않아도됩니다. 페이징은 할당 된 실제 메모리 블록을 이동하고 일부를 디스크로 푸시하고 다른 메모리를 디스크에서 실제 메모리로 가져 오는 프로세스입니다. 페이징은 간단하고 매우 바람직하지 않습니다. "나쁜"것은 아니지만 너무 자주 발생하면 성능에 실제로 끌릴 수 있습니다. 시스템에서 총 실제 RAM을 늘리는 궁극적 인 점은 더 많은 프로세스가 실제 메모리에 더 많은 커밋을 유지할 수 있도록하는 것입니다 (큰 작업 세트). 메모리 소비는 문제가되지 않으며, 더 많은 실행 프로세스가 더 많은 메모리를 사용하면 총 시스템 성능과 활성 프로세스 성능이 일반적으로 더 높아집니다.

Windows는 사용자를 위해 메모리를 관리하고 자동으로 페이지 (스왑) 파일에 대해 메모리 안팎으로 데이터를 페이징합니다. 9GB의 메모리가 필요한 프로세스를 실행하고 시스템에서 이미 4GB (12GB 중)를 사용중인 경우 시스템은 전체 작업 세트에 즉시 액세스 할 필요가없는 프로세스를 자동으로 파악하여 일부 또는 전부를 페이징합니다 여분의 1GB를 확보하기 위해 스 페이징 된 페이징 풀 중 대규모 프로세스에 결국 더 많은 메모리가 필요한 경우, 새로 요청 된 블록을 할당하기에 충분한 여유 공간이 확보 될 때까지 Windows는 다른 프로세스의 작업 세트를 추가로 줄입니다. 대규모 프로세스는 결국 NP 풀을 제외하고 사용 가능한 모든 메모리를 소비 할 수 있으며 Windows가 더 많은 작업 세트를 확보 할 수없는 프로세스를 주기적으로 실행하기위한 최소한의 추가 오버 헤드가 발생할 수 있습니다 (i. 이자형. Windows가 물리적 메모리에서 스왑 할 수있는 보류중인 페이지 결함이 있지만 요청되기 때문에 이동할 수 없습니다.)

프로세스가 액세스 할 수있는 것보다 더 많은 메모리를 필요로하는 경우 (32 비트 프로세스는 일반적으로 2Gb에 액세스 할 수 있고, 일부는 4Gb보다 약간 향상된 기술을 사용하지만 64 비트 프로세스는 일반적으로 각각 약 48Gb의 메모리에 액세스 할 수 있음) Windows는 때때로 시도합니다 스왑 공간으로 메모리를 가상화합니다. 32 비트 응용 프로그램이 최대 허용 2Gb의 공간을 사용하려고하지만 1.2Gb 만 사용할 수있는 경우 Windows는 페이지 파일에 전체 2Gb를 예약하고 필요에 따라 프로세스 자체 데이터를 페이지 파일 안팎으로 이동시킵니다. 앱의 메모리 사용량을 지원합니다. 이 경우 총 "메모리"사용량은 총 커밋으로 갈 때 사용 가능한 실제 메모리보다 더 큰 것으로 보일 수 있습니다. Total Commit은 일반적으로 시스템에서 관리 할 때 실제 메모리 양의 2-3 배인 총 페이지 파일 크기에서 최대 값을 초과합니다. 귀하의 경우


하나의 마지막 요점. 당신은 16Gb의 RAM을 가지고 있다고 대답했습니다. 여기서 작업 관리자는 12Gb의 RAM 만 보입니다. 두 가지 중 하나입니다. 시스템에 실제로 12Gb의 RAM 만 있거나 스틱 중 하나가 제대로 등록되지 않았습니다. 램 스틱 (4x 4Gb 스틱이라고 가정)이 잘못되었거나 마더 보드에 제대로 장착되지 않았거나 마더 보드에 메모리 감지 문제가있을 수 있습니다.

후자인지 확인하려면 먼저 메인 보드 BIOS를 최신 버전으로 업데이트해야합니다. 비슷한 문제가있었습니다 ... 램 (6x 2Gb)의 6 개의 Tripple-Channel DDR3 스틱은 각각 개별적으로 테스트 한 결과 모두 훌륭했지만 내 마더 보드는 무작위로 자주 하나 또는 두 개를 세지 않기로 결정했습니다. 종종 8Gb의 램으로 나를 떠나게합니다. BIOS 업데이트로 문제가 해결되었으며 지금은 12Gb의 모든 메모리에 안정적으로 액세스 할 수 있습니다.


흥미 롭다. 그리고 나는 단지 그의 비 페이징 메모리가 매우 크다는 것을 알아 차렸다. .mine은 539MB 페이징, 139MB 비 페이징. U 이것에 대해 나보다 더 잘 알고있다. "전체 커밋은 일반적으로 총 페이지 파일 크기에서 최대로 초과됩니다"라고 씁니다. RAM은 12GB입니다. 페이지 파일을 4000MB (3.8GB?) 분으로 설정하고 최대 1.5-2x 메모리를 최대로 설정합니다. 최대 커밋은 15GB (commit = 7) / 15 현재) 내 페이지 파일은 약 4GB 또는 아마도 3.8GB와 비슷합니다. 최대 커밋은 페이지 파일 크기 + RAM 크기와 비슷합니다. 페이지 파일이 12GB 일 때 내 최대 커밋은 약 24GB입니다. 페이지 파일 거의 3.8GB 또는 4GB 최대 커밋은 15GB
barlop

@ barlop : 음, 커밋이 무엇인지 약간 이해합니다. 엄밀히 말하면 커밋 요금은 확장 메모리 관리자가 지원하는 공간과 큰 주소 인식을 포함하여 총 "가상으로 주소 지정 가능한 메모리 공간"입니다. 최대 커밋은 페이지 파일 + RAM이 아니라 전체 시스템 관리 가상 주소 공간으로 설명됩니다. 페이지 파일은 일반적으로 최소한 총 실제 메모리 크기를 포함해야하며 총 실제 메모리 크기를 넘어서 확장해야합니다. 귀하의 경우, 최소 18Gb (1.5x) 또는 24Gb (2x)가 될 것으로 예상되지만 ...
jrista

... 시스템 관리 페이지 파일의 경우입니다. 페이지 파일 설정을 수동으로 조정 한 것처럼 들립니다.이 경우 현재 커밋이 15Gb 인 이유를 알려주기 위해 특정 구성에 대해 더 알아야합니다 (3.8 / 4Gb 페이지 파일은 15Gb가 아닌 16Gb의 커밋을 나타냅니다) .) 페이지 파일 또는 너무 작은 페이지 파일을 수동으로 구성 할 수 있으며 성능 문제 및 메모리 할당 문제가 발생할 수 있습니다. 매우 구체적인 서버 (예 : 데이터베이스) 설정이없는 경우 가장 좋은 방법은 창에서 페이지 파일을 관리하는 것입니다.
jrista

마지막 메모. 성능을 최대화하려면 창에서 최대 페이지 파일 크기를 미리 할당하는 것이 가장 좋습니다. 이는 일반적으로 SQL Server 데이터베이스와 같은 서버 설정에서 수행되며, 최대 성능을 위해 여러 물리적 디스크에 균등하게 분배되는 페이지 파일에 64Gb 이상 (일반적으로 실제 램 크기의 2 배, 따라서 128Gb 또는 256Gb의 2 배)을 미리 할당 할 수 있습니다. . 분산 페이지 파일, 특히 최대 크기로 사전 할당 된 경우 모든 참여 디스크에서 인터리브 된 읽기 / 쓰기가 가능하므로 병렬 I / O를 통해 페이징 성능이 향상됩니다.
jrista

과도한 메모리로드의 예로 내 시스템에는 현재 7.5 / 12Gb 실제 메모리 사용량; 14.7 / 23.3Gb 커밋; 491mb 페이징 풀; 145mb np 풀. 최대 페이징 풀 2276k 최대 np 풀 263k 인 146 개의 프로세스에 해당합니다. 가장 큰 커밋 크기는 696,396k이며 동일한 프로세스의 WS는 714,256k (오페라 탭 프로세스)입니다. (높은 프로세스 수는 웹 브라우저 때문입니다. 요즘에는 프로세스를 통해 탭을 분리합니다. 저는 하이퍼 태버입니다. ... 한번에 개방 추가 프로세스 수십 때문에 수십).
jrista

12

Windows에서 RAM이 많은 이유를 어떻게 알 수 있습니까?

그렇게 설계 되었기 때문에 너무 많은 RAM을 사용 하고 있습니다. RAM 사용과 관련된 비용은 전혀 없습니다. 실제로, 사용 된 RAM은 사용 가능한 RAM보다 낫습니다. 운영 체제가이를 사용하기 위해 아무것도 할 필요가 없기 때문입니다. 여유 RAM을 사용하려면 노력을 기울여야합니다.

"지금 RAM을 확보하여 나중에 사용할 수있게하려면"이라고 생각하면 잊어 버리십시오. 나중에 사용할 수 있도록 RAM을 확보 할 필요가 없습니다. 이제 사용할 수 하고 나중에 사용할 수 있습니다. 여기 에는 트레이드 오프 가 없습니다 . RAM 사용에 대한 단점은 전혀 없습니다.

RAM을 계속 사용하고 다시 사용하기 만하면 자유롭게 사용하지 않고도 한 사용에서 다른 사용으로 직접 전환 할 수 있습니다. 최신 운영 체제는 다른 선택이 없을 때만 RAM을 비워 둡니다.


12
내 Windows7 시스템이 시작시 3GB의 램을 사용하고 있으며 앱을 열지 않은 경우 문제가 발생합니다.
Vader

5
@JebediahKerman 왜 그렇게 말합니까? 왜 그런지 설명하지 않고 Windows가 그렇게하도록 설계된 이유를 설명하려고 노력했습니다. 내 설명을 이해하지 못했습니까? 또는 동의하지 않으면 내가 잘못되었다고 생각하는 부분을 설명해 주시겠습니까?
David Schwartz

11
@DavidSchwartz는 완전히 틀린 대답입니다. 그는 드라이버에 의해 메모리 누수가
magicandre1981

9
@DavidSchwartz : 설명하는 동작 (재사용 할 수있는 RAM 할당)은 반드시 페이징 가능한 메모리에서 이루어져야합니다. 걱정스러운 수치는 1.3GB의 비 페이징 메모리입니다. 1.3GB 바이트는 어디로 갈까요? "비 페이징 됨"은 소유자가 "이 바이트는 매우 중요하므로 디스크를 버릴 수없고 디스크에 버릴 수도 없습니다"라고 말했습니다.
MSalters

25
이“답변”이 왜 그렇게 많이 투표 되었습니까? 그것은 완전히 요점을 벗어났습니다. 사용 된 특정 단어에 관계없이 (처음부터 완벽하게 명확했던) 질문은 아닙니다 “Why is Windows using RAM?”.이 질문은 “Why do the RAM usage numbers not add up; why is one part reporting a higher usage than another part?”실제 질문을 다루지 않거나 심지어 답변을 시도 하지 않기 때문에 최선의 의견이어야 합니다. OP가 제안한대로 OP를 무시하면 메모리 누수가 발견되지 않기 때문에 약간의 조언만으로도 나쁜 조언을합니다.
Synetech

2

위에서 언급하지 않은 이유는 Hyper-V입니다.

뛰어난 유틸리티 RamMap 으로 확인할 수있었습니다 .

여기에 이미지 설명을 입력하십시오

스크린 샷은 이후부터입니다. "드라이버 잠금"메모리가 6GB를 넘기 전에이 특정 시스템에서 RAM의 80 % 이상. Hyper-V 관리자로 이동하여 "동적 메모리"를 비활성화해야했습니다. 흥미롭게도, 다시 활성화 한 후에도 "Driver Locked"메모리는 낮게 유지되었습니다. 이전 인스턴스 만 증가했다고 가정 할 수 있으며 Hyper-V는 할당 된 메모리를 자동으로 줄이지 않습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.