본문 바로가기
Old Posts/Linux

[Linux] free 명령어 사용법 - 메모리 상태 확인

by A6K 2022. 2. 10.

free 명령어는 전체 메모리에 대한 상태를 확인할 수 있는 명령어다. 사용하고 있는 메모리와 남은 메모리, 캐싱으로 사용되는 메모리 정보등을 확인할 수 있다. free 명령어는 ‘/proc/meminfo’ 파일에서 메모리 정보를 가져와 보여준다.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           124G         15G        8.3G        4.7M        101G        109G
Swap:            0B          0B          0B

출력되는 항목의 의미는 다음과 같다.

  • [total] : 현재 시스템에 설치되어 있는 전체 메모리 사이즈
  • [used] : 현재 사용중인 메모리 사이즈 (total - free - buffer/cache)
  • [free] : 사용 가능한 여유 메모리 사이즈
  • [shared] : tmpfs, ramfs 등으로 사용되는 메모리. 여러 프로세스에서 사용할 수 있는 공유 메모리
  • [buff/cache] : 버퍼와 캐시를 더한 사용량. 버퍼는 커널 버퍼로 사용중인 메모리, 캐시는 페이지 캐시와 슬랩(slab)으로 사용중인 메모리
  • [available] : Swapping 없이 새로운 프로세스에서 할당 가능한 메모리의 예상 크기

free 명령어가 참조하는 ‘/proc/meminfo’ 파일에서 메모리에 대한 좀 더 자세한 정보를 확인할 수 있다.

$ cat /proc/meminfo
MemTotal:       130978652 kB
MemFree:         8711988 kB
MemAvailable:   114274688 kB
Buffers:            2560 kB
Cached:         44653464 kB
SwapCached:            0 kB
Active:         34442200 kB
Inactive:       21589168 kB
Active(anon):   10533896 kB
Inactive(anon):   846368 kB
Active(file):   23908304 kB
Inactive(file): 20742800 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               784 kB
Writeback:             0 kB
AnonPages:      11375404 kB
Mapped:           196556 kB
Shmem:              4920 kB
Slab:           62762032 kB
SReclaimable:   61618300 kB
SUnreclaim:      1143732 kB
KernelStack:       44208 kB
PageTables:        76548 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    65489324 kB
Committed_AS:   36566088 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      563484 kB
VmallocChunk:   34358892540 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     3880512 kB
DirectMap2M:    126328832 kB
DirectMap1G:     5242880 kB

옵션

옵션 긴버전 설명
-h   사람이 읽기 쉬운 단위로 출력
-b | -k | -m | -g   바이트, 키비바이트, 메비바이트, 기비바이트 단위로 출력
  --tebi | --pebi 테비바이트, 페비바이트 단위로 출력
  --kilo | --mega | --giga | --tera | --peta 킬로바이트, 메가바이트, 기가 바이트, 페타 바이트 단위로 출럭
-w   와이드 모드로 cache와 buffers 값을 별도의 컬럼으로 출력
-c 숫자   지정한 숫자만큼 free를 연속해서 실행
-s 초   지정한 초 만큼 딜레이를 두고 지속적으로 실행
-t   합계가 계산된 total 컬럼 줄을 추가로 출력

커널의 캐싱 전략

리눅스 커널은 블록 디바이스라고 불리는 하드디스크 등의 저장장치에 데이터를 쓰고 읽는다. 메인메모리에 비해 많은 양을 저장할 수 있지만 속도가 느리다는 치명적인 단점이 있다. (SSD 역시 정도의 차이일뿐 동일하다고 봐도 된다) 따라서 하드디스크에 저장되어 있는 데이터에 접근할 때마다 하드디스크로의 입출력을 발생시킨다면 시스템이 너무 느려지게 된다.

이런 한계를 극복하기 위해서 캐싱 전략을 사용한다. 커널은 속도가 느린 디스크 입출력의 속도 향상을 도모하기 위해서 메모리의 일부를 캐싱 영역으로 사용한다. 한번 읽은 데이터는 버리지 않고 캐싱 영역에 두고, 동일한 데이터에 대한 요청이 다시 들어오면 디스크 입출력을 발생시키는 대신 캐싱 영역에 있는 데이터를 사용한다.

Cache와 Buffer 영역은 이런 캐싱 영역으로 사용되는 메모리 영역을 의미한다. 리눅스 커널은 전반적인 성능 향상을 위해 남는 메모리 영역을 Cache와 Buffer 영역으로 사용하려고 시도한다.

Page Cache

페이지 캐시(Page Cache)는 디스크 입출력 성능 향상을 위해 리눅스 커널이 사용하는 메모리 영역이다. 리눅스 커널은 속도가 느린 디스크에 있는 정보를 읽은 후, 페이지 캐시 영역에 저장한다. 그리고 나서 데이터를 요청한 사용자 프로세스의 메모리 공간으로 복사한다. 이후 동일한 데이터에 대한 읽기 요청이 들어오면 디스크에서 읽는 대신 페이지 캐시 영역에 있는 데이터를 사용자 메모리 공간으로 복사한다. 디스크에서의 읽기가 수행되지 않기 때문에 좀 더 빠르게 입출력이 처리된다.

한편 페이지 캐시에 있는 데이터가 수정이 되면 dirty 플래그가 붙어 메모리에 있는 데이터와 디스크에 있는 데이터가 다름을 표시해두고, 백그라운드 작업으로 디스크에 데이터를 쓰게 된다. 쓰기 작업 자체는 페이지 캐시에만 적용하기 때문에 응답시간이 빨라진다.

페이지 캐시 사이즈는 프로세스가 캐시에 없는 파일을 읽을 때마다 점점 증가하게 된다. 이후 가용 메모리가 적어지면 dirty 페이지가 아닌 것들부터 회수해서 가용 공간으로 만들고, 그 마저도 부족하면 dirty 페이지를 디스크에 쓰고 공간을 회수하게 된다.

Buffer Cache

버퍼 캐시(Buffer Cache) 역시 커널이 입출력 성능을 향상시키기 위해 사용하는 메모리 영역이다. 페이지 캐시에는 파일의 데이터가 저장되는 반면 버퍼 캐시에는 파일의 메타 정보들이 저장된다.

Slab

커널에서 동작하는 여러 서비스들도 프로세스로 동작하기 때문에 메모리 공간이 필요하다. Slab 영역에는 dentry cache와 inode cache 등이 기록된다. 즉 커널이 내부적으로 사용하는 캐시라고 생각하면된다.

Swap

스왑(Swap)은 디스크의 일정 부분을 메모리 스페이스 부족시 메모리처럼 사용하기 위해 설정해둔 공간이다. 리눅스 커널은 메모리가 부족해지면 Buffer와 Cache로 사용되는 정보들 중 자주 사용되지 않는 정보들을 디스크에 위치한 스왑 공간으로 내리고, 가용 공간을 추가로 확보하게 된다. 또 한, 메모리에 있는 데이터 중 자주 사용되지 않는 데이터도 SWAP 공간으로 내릴 수 있다. 이를 스왑 아웃(Swap-out)이라고 한다.

나중에 스왑 아웃된 데이터를 프로세스가 접근하면 다시 디스크에서 읽어 메모리로 로드한다. 이를 스왑 인(Swap-in)이라고 한다. 이 과정에서 디스크 입출력이 발생하기 때문에 메모리 연산만 했을 뿐인데도 성능저하가 발생한다.

따라서 스왑 공간의 사용량을 모니터링해서 불필요한 스왑이 발생하지 않도록 설정을 관리하거나 물리 메모리의 증설이 필요할 수 있다.


관련글

 

리눅스 명령어 사용법들

리눅스 명령어 사용법 ifconfig 네트워크 인터페이스 설정관련 ls 디렉토리 엔트리 정보 출력

hbase.tistory.com

 

댓글