top 커맨드의 메모리 관련 내용(VIRT, RES, SHR, %MEM)를 설명한다.


이를 설명하기 좋은 프로세스는 mongodb인 듯 해서 그 부분만 정리했다. 


실제 메모리를 보기 위해 free 커맨드를 실행하면 cached 메모리 때문에 마치 used 메모리가 상승했다.



$ free

                     total       used              free         shared    buffers     cached

Mem:      16289804   15621900     667904        188     148776    7787380

-/+ buffers/cache:     7685744      8604060

Swap:     10485756          0            10485756




top으로 보면 대략 전체 메모리는 16G이고 사용 중인 메모리는 15G이다. 

VIRT는 12.8G, RES는 6.7G, SHR은 6512로 나타난다. 


$ top

Mem:  16289804k total, 15621300k used,   668504k free,   148776k buffers

Swap: 10485756k total,        0k used, 10485756k free,  7787328k cached


PID USER      PR   NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

17075 www    20   0 12.8g 6.7g 6512 S  0.7        43.2   4321:34 mongod




이것만 보고 정말 물리 메모리를 더 꽂아야 하냐고 묻길래. 아니라고 답변해 주었다. 



top 커맨드의 중요 메모리 설정을 살펴본다.


* VIRT는 프로세스의 가상 크기를 의미한다. 실제로 사용하고 있는 메모리의 총합을 의미한다. VIRT는 
 디스크의 파일을 읽으면서 사용했던 메모리도 포함될 수 있다. VIRT는 프로그램이 현재 얼마나 많은 메모리를 접근할 수 있는지 나타낸다. (즉 물리 메모리의 사용한 공간을 의미하지 않는다.) 


* RES는 실제 물리 메모리를 얼마나 쓰고 있는지 나타낸다. 따라서 VIRT보다는 작은 값을 보여준다.
%MEM의 내용에 연관된다.


* SHR은 VIRT 메모리 중 공유 메모리를 보여준다.



참고로 리눅스에서 물리 메모리 페이지 영역을 볼 수 있다. 
특정 PID의 세그먼트(segment)에 할당된 물리 메모리 페이지를 보여준다.

$ cat /proc/${PID}/smaps
..
7f8248fb2000-7f8249223000 rw-p 00000000 00:00 0
Size:               2500 kB
Rss:                1492 kB
Pss:                1492 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:      1492 kB
Referenced:         1488 kB
Anonymous:          1492 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
7f8249223000-7f8249472000 ---p 00000000 00:00 0
Size:               2364 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
7f8249472000-7f824948c000 r-xp 00000000 08:02 1326344                    /usr/java/jdk1.8.0_25/jre/lib/amd64/libzip.so
Size:                104 kB
Rss:                  84 kB
Pss:                  43 kB
Shared_Clean:         60 kB
Shared_Dirty:          0 kB
Private_Clean:        24 kB
Private_Dirty:         0 kB
Referenced:           84 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
...


이 정보의 간략화된 버전이다. 

$ cat /proc/${PID}/maps

7f8248fb2000-7f8249223000 rw-p 00000000 00:00 0
7f8249223000-7f8249472000 ---p 00000000 00:00 0
7f8249472000-7f824948c000 r-xp 00000000 08:02 1326344                    /usr/java/jdk1.8.0_25/jre/lib/amd64/libzip.so





더 깊이 보면 보면 재미있어야 할 내용들 레퍼런스 

1. https://en.wikipedia.org/wiki/Virtual_memory의 address space swapping


2. https://www.youtube.com/watch?v=twQKAoq2OPE


3. https://web.eecs.umich.edu/~pmchen/eecs482/handouts/memory.pdf






Posted by 김용환 '김용환'

댓글을 달아 주세요