클라우드 아카이브

[프로세스] VIRT, RES, SHR과 Memory Commit 본문

OS 및 스토리지/Linux

[프로세스] VIRT, RES, SHR과 Memory Commit

Cloud Engineer 2022. 5. 25. 21:39

0. 들어가기 전

Linux에서 top 명령어를 입력하면 특정 Interval 간격마다 화면을 갱신하면서 보여줍니다. 출력값에서 OS의 구동 시간(uptime), 접속 유저, Load Average, 메모리 사용량, 전체 프로세스 현황 등 시스템 운영에 필요한 다양한 정보를 확인할 수 있습니다. 특정 프로세스에 대한 정보를 확인하고자 할 때, VIRT, RES, SHR 그리고 S라는 용어가 등장하는데 해당 용어가 어떤 것을 의미하는지 알아보는 포스팅을 작성하겠습니다.

1. VIRT, RES, SHR 개념

VIRT, RES, SHR 구조

VIRT, RES, SHR 용어의 개념을 먼저 정의하겠습니다.

  • VIRT : 프로세스가 리눅스 커널로부터 할당받은 최대 가상 메모리(Virtual Memory) 전체 크기
  • RES : 프로세스가 실제로 최대 물리 메모리(Physical Memory)에서 사용하고 있는 전체 크기
  • SHR : 다른 프로세스와 공유하는 최대 공유 메모리(Shared Memory)의 전체 크기

즉 특정 프로세스가 커널로부터 RES, VIRT, SHR를 할당받고 실제 물리 영역의 메모리에서 사용하는 공간은 RES를 통해 확인할 수 있습니다. 따라서 top 명령어를 통해 메모리 점유율이 높은 프로세스를 찾고싶을 경우 RES값이 높은 프로세스를 찾으면 됩니다. 위에서 각 용어 별로 최대 메모리라고 표현한 이유는 프로세스가 최대로 사용 가능한 메모리 크기를 의미하기 때문입니다. 즉, 커널로부터 사용을 예약받은 메모리 크기입니다. 해당 개념은 디스크의 thin provisioning과 유사한 느낌을 가지고 있습니다. 이를 그림으로 표현하면 아래와 같습니다.

위 그림을 해석하면 프로세스는 커널로부터 물리 디스크 2GB까지 사용 가능하도록 할당받았으며, 가상 메모리는 2GB까지 사용할 수 있도록 할당받았습니다. 따라서 프로세스는 자신이 2GB까지 사용이 가능한 것 처럼 인식하는 반면, 커널은 해당 프로세스가 현재 점유 중인 메모리 크기는 2GB 미만이며 최대 2GB까지 사용이 가능한 것으로 인지합니다. 이처럼 물리 메모리와 가상 메모리가 고정 크기로 할당받지 않는 상태로 메모리 사용이 가능한 이유는 커널에서 Memory Commit이라는 동작 방식을 기반으로 메모리를 할당/관리하기 때문입니다. 이는 커널 파라미터 중 vm.overcommit_memory라는 파라미터를 통해 구동방식을 설정할 수 있습니다.

2. Memory Commit 작동 원리

Memory Commit 작동 방식

Memory Commit은 위와 같은 방식으로 작동하며 파라미터값은 아래와 같습니다.

  • vm.overcommit_memory=0 : default로 설정되는 값이며, page cache/swap 영역/slab reclaimable 값을 합해서 최대값을 선정하는 방식
  • vm.overcommit_memory=1 : Memory WWrite 요청 즉시 Commit을 진행하는 방식
  • vm.overcommit_memory=2 : 또다른 커널 파라미터인 vm.overcommit_ratio 값과 swap 영역 크기를 바탕으로 계산하는 방식

3. 마무리

한정된 자원의 사용량을 높이기 위해 서버는 CPU에서 하이퍼스레딩 기술, 메모리에서 Memory Commit 기술, 디스크에서 thin 프로비저닝 등 다양한 고성능 컴퓨팅 기술을 적용합니다. 이 중 메모리 부분에서 알아야 할 부분인 VIRT, RES, SHR과 Memory Commit에 대한 포스팅을 마무리하겠습니다.

Comments