Understanding and Trobleshooting Memory Problems

2014. 6. 13. 11:34C++

http://blogs.msdn.com/b/kocoreinternals/archive/2008/10/15/david-solomon-understanding-and-trobleshooting-memory-problems.aspx

Soft page fault 는 이미 메모리에 존재하는 것을 다루는 것입니다. 

hard page fault 는 Memory mapped file 을 사용할 때 사용됩니다. Hard page fault가 많이 발생한다고 Physical Memory 를 늘려도 성능이 늘어나지는 않습니다. 

APP 가 실행될 때 작은 code 만이 memory 에 있고 실제 사용될 때 Disk 에서 Memory 로 load 됩니다. 

prefatch 의 경우 exe 의 page fault 를 기록하고 미리 load 해놓습니다. 이 결과 작은 disk read 를 여러번 하지 않고 큰 Disk read 를 한번하여 성능 향상을 가져옵니다. 

memory를 사용하는 것이 없을 경우 page out 됩니다. 

변경되지 않는 code 는 page out 되지 않고 삭제된 후 나중에 다시 page in 합니다. pageout 되는 것은 private virtual memory 입니다. 

Process 의 Memory 의 사용이 높아지거나 사용되지 않을 경우 Workning set thread 가 동작하면서 Page out을 발생 시킵니다. 

540MB 의 큰 code 를 가진 exe 파일이 작은 private memory 를 사용한다면 작은 RAM 으로도 실행 가능합니다. code 가 계속 page in 하면 되기 때문입니다.( code 는 page out 되지 않고 private memory 만이 page out 됩니다.) 


MIPS processor 를 지원하기 위해 2GB 로 user mode memory 가 제한되어 있었으나 MIPS 지원을 하지 않은 이후 NT4 SP3 이후 3GB 가 추가되었습니다. (MIPS 는 Memory 를 반으로 나누어야 합니다.) 

UserVA 를 사용하여 3GB 와 2GB 사이의 값을 설정할 수 있습니다. 

3GB 를 사용하는 Application 은 large address space aware option 사용하여 compile 되어 있어야 합니다. 

imagecfg \windows\system32\*.exe > x.txt 를 사용하여 확인할 수 있습니다. ( imagecfg 는 os 에 포함된 것이 아닙니다.) 

lsass, exchange, sql 등이 3GB 를 사용합니다. 

64Bit를 사용하면 17,179,869,184 GB 가 사용 가능하나 약 8192GB 의 User space 와 6657 GB 정도의 system space 가 사용 가능합니다. 


what limits total process private virtual memory?


  • Commit limit 이란 page file size + (대부분의)physical memory (일부는 OS 가 차지합니다.) 을 이야기 합니다.
  • limit - page file size -physical mem = OS 가 차지한 영역, 예제에서는 90MB 정도 10% 정도를 차지합니다.
  • working set 은 process 가 사용하는 물리 메모리 양으로 0에서 시작해서 page fault 가 발생하면서 증가합니다. 같은 app 가 2번 실행되면 code 영역은 공유됩니다.
  • Memusage 은 working set size 입니다. VM size 은 private committed vitual space 입니다. Status bar 의 Mem usage 는 각각의 Memusage 의 합이 아닙니다. (VM = Virtual Memory)
  • Memory leak 의 경우 memusage 는 증가 되다가 Memory Manager 에 의해서 멈추게 되고 VM 은 계속 증가하게 된다. 

process explorer 에서의 메모리 표현


Private bytes = Task manager VM size

Working set = Task manager Mem usage

 


trim 은 physical 메모리가 부족할 때 process 의 working set 을 줄여 page file 로 보내는 것입니다. 

page out 되기 위해 standby 나 modified 상태에 있는 memory 를 다시 process 의 working set 에 넣어 주는 것은 soft page fault 입니다. 

working set 은 code 와 data 가 같이 있는 것이고 VM size 는 data 만 있는 것 입니다. Mem usage(working set) 의 내용 중 일부는 VM size 에 있을 입니다.



Modified page list 에는 working set 에서 변경된 사항이 들어가 있고 standby page list 에는 변경되지 않은 사항이 들어가 있습니다. modified writer thread 가 modify 된 내용을 저장한 후 standby list 에 넣습니다. standby list 는 이미 disk 에 write 를 한 page 이고 modified 는 아직 disk 에 write 하지 않은 것입니다. page file 에서 read 를 많이 한다는 것은 RAM 을 추가 해야 한다는 것을 의미 합니다. (실제로 RAM 을 추가해야 하는지는 더 많은 Data 를 확인 하고 결정 해야 합니다.) 


program 을 강제 종료 하였을 경우 standby list 에 code 가 들어가고 free page list 에는 data 가 들어갑니다. standby list 는 다시 사용할 수 있으나 free list 에 들어가면 재 사용할 수 없습니다. 

새로운 process 를 생성하고자 할 때 zero page 리스트가 부족하면 free page 리스트를 사용하고 이것도 부족하면 standby list 를 사용합니다.


 


task manager 에서 physical memory 의 total 은 free, standby, zero page list 의 합입니다. 

Active 에는 os code, working set 등의 값이 들어 있습니다. 


WinDbg 명령 중 !memusage 는 pfn database 를 확인하여 값을 계산합니다. 

system cache 는 얼마나 많은 file cache 정보를 memory 에 가지고 있느냐 입니다. (standby list + os code, data + file cache) 

standby list 는 사용된 page 로도 계산되고 사용 가능한 page 로도 계산할 수 있는 양면성이 있습니다.


작업관리자에서는 MAX size를 보여주지 않고 사용률만 보여줍니다.레지스트리 키를 사용하여 MAX size 를 수정할 수 있습니다. WinDbg 의 명령중 !vm 명령으로 MAX size 를 알 수 있습니다. 또한 Process explorer 를 통해서 MAX 값을 알 수 있습니다. 


DriverVerifier 와 PoolTag, PoolSnap 등에 대한 설명을 하였습니다. 아래와 같은 명령을 CMD shell 에서 실행하여 특정 tag 를 사용하는 Driver 를 찾을 수 있습니다. 이 예제에서는 Xyzz 입니다.