[Linux] free 명령어에 대해
1. 개요
free 명령어는 커널에서 사용되는 버퍼와 캐시뿐만 아니라 시스템에서 사용 가능한 물리적 메모리와 스왑 메모리의 총량을 표시한다. free 명령어는 /proc/meminfo에서 메모리 정보를 가져와 분석하여 수집된다.
간단히 말해, 리눅스 시스템에서 전체적인 메모리에 대한 현황을 보여주는 명령어이다.
그럼 free명령어로 볼 수 있는 메모리 정보와 이와 관련된 meminfo의 값들을 알아보자.
2. 사용법
[사용법]
$ free [옵션]
[옵션]
-b, -k, -m, -g : 바이트, 킬로바이트, 메가바이트, 기가바이트 단위로 출력
--tera, --peta : 테라바이트, 페타바이트 단위로 출력
-h, --human : 자동으로 단위를 조정해서 출력
-w, --wide : 와이드 모드로 실행. cache와 buffers 를 따로 출력
-c, --count : 지정된 반복만큼 결과 출력
-l, --lohi : 최고/최저 메모리 상황 출력. Low 와 High 로 구분되어 출력
-s, --sceonds : 지정된 n초 마다 출력
-t, --total : 합계가 계산된 결과를 Total line 에 출력
3. 실행결과
free 명령어를 사용하면 다음과 같이 결과를 확인할 수 있다.
free 명령어를 실행하게 되면 물리 메모리와 스왑 메모리에 대해 각 컬럼에 대한 값들이 나오게 된다.
- [total]
설치된 총 메모리의 크기 (/proc/meminfo 의 MemTotal 및 SwapTotal) - [used]
사용중인 메모리 크기 또는 사용중인 스왑 메모리 크기 (total - free - buffers - cache 으로 계산) - [free]
사용하지 않은 메모리 크기 또는 사용되지 않은 스왑 메모리 크기 (/proc/meminfo 의 MemFree 및 SwapFree)
total - used - buff/cache - [shared]
주로 tmpfs(메모리 파일시스템) 에서 사용하는 메모리. 여러 프로세스에서 사용할 수 있는 공유 메모리 - [buffers]
커널 buffer 로 사용중인 메모리 - [cache]
page cache 와 slab 으로 사용중인 메모리 - [buff/cache]
버퍼와 캐시 메모리의 합 - [available]
Swapping 없이 새 응용 프로그램을 사용하는 데 사용할 수 있는 메모리의 크기.
기존에 존재하던 -/+buffer/cache 부분이 사라지고 생겼다.
4. Cache와 Buffer
리눅스는 항상 여유 메모리 공간을 Buffer와 Cache로 사용하려고 시도한다. 메모리에 데이터를 저장해서 느린 디스크로의 접근을 최대한 줄여 성능을 향상 시킨다.
Buffer는 버퍼 캐시로 디바이스 블록에 대한 메타데이터들을 메모리에 캐싱한 크기이다. 블록 디바이스로부터 데이터를 읽어오기 위해 필요한 정보들을 메모리에 저장해 둔다.
Cache는 페이지 캐시와 slab으로 사용중인 메모리 크기이다.
- 페이지 캐시는 한 번 디스크로 읽어온 데이터를 메모리에 저장하여 같은 데이터를 다시 읽을 때 디스크로 요청하지 않고 메모리에서 바로 읽어올 수 있게 한다.
- slab은 커널에서 관리하는 커털 오브젝트를 저장하는 단위이다. 커널은 애플리케이션 할당 단위인 페이지보다 작은 단위인 slab 단위로 메모리를 사용한다. 하나의 메모리 페이지에 여러 slab들이 존재할 수 있다.
- slab에 파일의 inode나 dentry 정보들을 캐싱할 수 있다.
5. SWAP
스왑(SWAP)은 디스크의 일정 부분을 메모리 공간 부족시 메모리처럼 사용하기 위해 설정해둔 공간이다.
커널은 메모리가 부족한 상황에서는 Buffer와 Cache로 할당된 것 중에 자주 사용되지 않은 것들을 비우고 메모리에 할당을 하려고 시도한다. 또한 메모리에 있는 데이터중 최근 자주 사용되지 않은 데이터를 SWAP공간으로 이동시킨다.(SWAP-OUT)
그리고 SWAP으로 옮겨진 데이터를 프로세스가 읽기 위해 메모리로 데이터를 다시 가져온다.(SWAP-IN)
이는 디스크로부터 옮겨졌던 데이터를 다시 메모리로 가져오기 때문에 Latency가 길어져 결국 성능 저하로 이어진다.
일시적인 메모리 사용 증가로 일정 SWAP을 사용하는 상황과 지속적인 메모리 부족으로 인해 SWAP이 커지는 경우를 지속적으로 모니터링하여 메모리 증설 시점을 고려해야 한다.
6. 마무리
유닉스 계열의 O/S에서 메모리 사용률을 정확하게 모니터링 하기란 쉽지 않다. 그 이유는 빠른 CPU 성능에 I/O속도를 맞추기 위해 메모리의 상당 부분을 디스크 캐시로 사용하기 때문이다. 디스크 캐시는 I/O가 발생할 때마다 유동적으로 변화하고 특정 커널 파라미터를 통해 임계 값을 설정하여 그 이상으로는 증가하지도 못하게도 할 수 있다. 이러한 기능은 각 벤더* 마다 조금씩 차이가 있다.
(벤더: 시스템 제품 제조회사나 판매 회사)
메모리 사용률을 정확한 수치로 계산하기란 쉽지 않으며 메모리를 확인하는 명령어에 따라 약간의 차이가 있다. 따라서, 메모리를 모니터링할 때 얼마나 가용한 메모리가 남았는지, 현재 메모리가 부족하여 SWAP을 지속적으로 사용하고 있는지 등을 확인하는 것이 올바른 모니터링 방법이라 할 수 있겠다.
#References
https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?mod=document&uid=235927
https://jaynamm.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-free-%EB%AA%85%EB%A0%B9%EC%96%B4
https://www.whatap.io/ko/blog/37/