인프라/서버(OS)

리눅스 커널 이야기 - 2) top명령어, 메모리 관련 항목 알아보기

인프라베어 2025. 5. 7. 00:31

저번 글에서는 리눅스 서버의 정보를 확인할 수 있는 uname, dmesg, dmidecode등에 대해 알아보았다. 커널에 대한 정보, CPU 및 메모리, 디스크정보에 대해 알아보았으며 실제 장비의 구성과 시스템이 인식하는 설정이 다를 수도 있음을 확인해보았다.

이번 글에서는 top명령어를 통해 프로세스의 상태를 확인해보고 메모리와 관련된 VIRT, RES, SHR, 메모리 커밋에 대해 알아보려고 한다.

실습환경

AWS EC2

Type : t2.micro

OS: RHEL 9.5

top명령어란?

3초 간격으로 리눅스 환경에서 실행중인 프로세스와 시스템 자원(CPU, MEM)의 상태를 확인하는 명령어이다.(실행주기는 -d 옵션을 통해 변경가능하다.)

top명령어에서 확인 가능한 정보

  • 현재시간 및 uptime
  • 로그인한 사용자 수
  • load average: 1, 5, 15분 간의 평균 시스템 부하
  • Tasks: 전체 프로세스 수, 실행중/ 대기 / 중지 / 좀비 프로세스
  • %CPU(s): CPU사용률 
  • MiB Mem: 전체 RAM용량, 사용량, 프로세스에 의해 사용중인 메모리,
    • buff/cache: 버퍼/캐시 용도로 쓰이는 메모리, 리눅스는 여유메모리를 캐시로 사용한다.
  • MiB Swap: 전체 메모리 스왑 공간(total), 사용가능한 스왑 공간(free), 사용 중인 스왑 공간(used), 즉시 할당가능한 메모리(avail Mem)

top 명령어 하단 프로세스정보

  • PID: 프로세스 ID
  • USER: 프로세스를 실행한 사용자
  • PR(Priority): 프로세스 실행 우선순위(default 20)
  • NI(Nice): 프로세스 nice값, PR을 얼마만큼 조절할 것인지, CPU점유 우선도를 의미함
  • S(State): 프로세스 상태, Sleep, Running, Zombie, Uninterruptible sleep(U), Traced/Stopped(T)

프로세스가 사용하는 메모리 양을 확인하는 항목들

  • VIRT(Virtual Memory)
  • RES(Resident Memory)
  • SHR(Shared Memory)

VIRT, RES, SHR 이란?

리눅스에서는 man을 통해 해당 명령어의 manual 을 확인 할 수 있다. top에 대한 내용을 알아보고 싶다면 man top을 실행하면 된다.

man top을 수행한 결과

이후, VIRT, RES, SHR 항목에 대해 궁금하다면 /VIRT 와 같이 검색기능을 이용하면된다, 여러개가 검색될텐데 그럴때는 n을 누르면 다음 문자열로 넘어갈 수 있다.

VIRT, RES, SHR에 대한 설명은 다음과 같다.

  • VIRT: 해당 task(process)가 요청한 모든 virtual 메모리 영역
  • RES: VIRT의 일부이며 프로세스가 실제 물리메모리상에서 사용하고 있는 양을 의미(heap, stack 등등)
  • SHR: 다른 프로세스들과 공유하고 있는 메모리의 크기로 RES의 하위 집합. 대부분의 프로세스들은 glibc 라이브러리를 참고하므로 커널은 공유메모리를 통해 다수의 프로세스가 함께 사용하는 라이브러리를 공유메모리에 올려서 사용한다. 

VIRT/RES의 구분이유는?

프로세스의 메모리 할당 과정

기본적으로 VIRT는 가상메모리를 미리 할당받은 것이기 때문에 용량이 커도 문제가 없지만 RES는 실제 메모리를 사용하는것이기 때문에 사용량을 잘 살펴보아야 한다. 그렇다면, VIRT와 RES를 구분하는 이유는 무엇일까?

리눅스 환경에서 프로세스는 malloc을 통해 메모리를 커널에 요청하게 된다. malloc은 실제 메모리를 바로 할당하지 않고 가상 메모리의 주소를 요청하게 되는데 커널은 해당 프로세스에 가상메모리의 주소를 할당하게 된다. 이 시점에서 물리메모리는 아직 할당되지 않은 상태이다.

가상 메모리를 할당 받은 프로세스가 해당 가상메모리 주소에 접근하여 읽기 및 쓰기 작업을 하려고 하면 물리메모리와 연결되어있지 않기 때문에 Page Fault가 발생하고 이때 커널은 실제 물리 메모리 공간(메모리 페이지)을 가상 주소에 매핑시킨다. 이러한 매핑정보를 Page Table이라고 하며 실제 물리 메모리에 올라온 페이지 수와 페이지의 크기(4KB)를 곱해서 RES의 값을 계산하게 된다.

Overcommit?

오버커밋이란, 리눅스 커널이 프로세스의 메모리 요청에 대해 실제 물리 메모리가 존재하지 않더라도 가상 주소 공간을 우선적으로 할당해주는 동작 방식으로 프로세스가 malloc를 통해 메모리를 요청하더라고 커널이 물리메모리를 할당하지 않고 가상 메모리 주소만 미리 할당하게 된다.

vm.overcommit_memory

메모리 오버커밋에 대한 동작 방식은 vm.overcommit_memory 파라미터를 변경하여 제어할 수 있으며 기본값은 0이다.

0: Huristic 모드, 경험적 판단을 통해 커널이 메모리 오버커밋을 허용할지 자동으로 결정, page cache, swap, slab, slab reclaimable등을 기준으로 오버커밋을 허용할지 판단.

1: 무조건 commit 허용

2: 제한적으로 commit진행, 커밋된 메모리 총량이 Commit_Limit을 초과하면 메모리 요청 거부

해당 파라미터에 대한 정보는 /proc/sys/vm/overcommit_memory, overcommit_ratio 에서 확인 가능하다.

 

물리 메모리를 바로 할당하지 않는 이유는?

리눅스에서 새 프로세스를 실행하는것은 fork() -> exec()과정을 통해 수행된다. fork는 기존 프로세스의 메모리 공간을 공유하여(Copy-On-Write)하며 새롭게 생성된 자식프로세스는 exec를 통해 완전히 새로운 프로세스가 실행되게 된다. fork는 기존의 메모리 공간을 모두 공유하게 되는데 이때 자식 프로세스에 동일한 크기의 메모리가 바로 물리메모리에 할당된다면 기존 프로세스가 사용하고 있는 메모리 양만큼 그대로 추가가 되는것이므로 메모리 사용량이 급증하게된다. 

 

리눅스는 가상의 주소 공간을 Task(프로세스)에 할당하고, 실제로 필요한 자원은 실제로 필요할때 자원을 할당하는 방식으로 자원을 효율적으로 사용하기때문에 VIRT/RES가 구분되어 있는것 같다.

'인프라 > 서버(OS)' 카테고리의 다른 글

리눅스 커널 이야기 - 서버 정보 확인하기  (0) 2025.04.30