운영체제/Linux
[Linux] free - 메모리 사용량 확인하기
민돌v
2023. 8. 24. 19:29
해당 포스팅은 인프런 "리눅스 성능 분석 시작하기" 를 수강하고 정리한 글입니다 :)
- 리눅스 기반 os 에서 돌아가는 서버 시스템의 성능 측정 및 장애 대응에 대한 학습 내용 정리 글 입니다.
💡 리눅스 성능 분석의 기본 명령어
명령어 | 역할 |
uptime | 시스템 가동 시간, Load Average 확인 |
dmesg | 커널 메세지 확인 (OOME 발생 여부, SYN Flooding 여부) |
free | 메모리 사용 현황 확인 |
df | 디스크 여유 공간 및 inode 공간 확인 |
top | 프로세스들의 상태, CPU 사용률, 메모리 사용률 확인 |
netstat | 네트워크 연결 정보 확인 |
tcpdump | 네트워크 트러블 슈팅 분석을 위한 패킷 수집 명령어 |
✅ free 명령어
- 현재 사용중인 메모리 사용양과, 사용가능한 메모리양 등 전반적인 사용 현황을 확인할 수 있는 명령어 입니다.
- -m 옵션을 사용하여 megabite 단위로 조회할 수 있습니다.
✔️ free 와 available 의 차이점
- free : 어느 누구도 사용하고 있지 않은 메모리 (완전하게 자유인 메모리)
- available : 애플리케이션에 실질적으로 할당 가능한 메모리 (누군가가 사용중인 메모리 포함)
→ 왜 이런 차이가 발생하까? (free, available)
👏🏻 buff/cache 영역 때문에
- buff : 블록 디바이스가 가지고 있는 블록 자체에 대한 캐시
- cache : I/O 성능 향상을 위해 사용하는 페이지 캐시 (페이지 캐시가 중요함)
✔️ 페이지 캐시란
- 애플리케이션 A 가 open() System Call 을 사용하여 → 블록디바이스(EBS) 에서 test.txt 라는 파일을 불러오는 상황이 있다고 한다면
- 아래의 사진과 같은 흐름이 될 것 입니다.
but
하지만, 실제로는 블록 디바이스에서 바로 불러오는게 아닌, 커널이 가운데에서 페이지 캐시를 이용해서 파일을 돌려줍니다.
- 페이지 캐시에서 test.txt 를 저장해 두었다가 애플리케이션이 페이지 캐시에서 조회함
- 페이지 캐시는 (buff/cache 영역의 cache)
✔️ 페이지 캐시 존재 이유
- 블록 디바이스는 디스크 메모리이기 때문에, 지속적으로 읽기 현상이 일어나면 속도 지연이 생깁니다. → 메모리가 무조건 빠름
- 그래서 첫 조회때 페이지 캐시에 저장해두었다가 2번째부터는 페이지 캐시에서 바로 읽어들여→ I/O 성능을 향상(⬆️)시킬 수 있습니다.
- (블록 디바이스가 아닌 메모리에서 파일의 내용을 가져오기 때문에)
- 대표적인 애플리케이션이 = Elastic Search
👏🏻❗️ 즉, 페이지 캐시가 많다는 건 → I/O 가 많이 일어나는 서버라는 것
✔️ 그래서 available 이란?
- buff/cache 는 I/O 성능 향상을 위해 존재합니다.
↓
- 애플리케이션에서 메모리를 필요한다면 OOM 이 일어나는데
- OOM이 일어나기 전에 buff/cache 영역이 남아있으면, 이 영역을 해제하고
- 애플리케이션이 사용할 수 있는 영역으로 바꿔 버립니다. (프로세스를 종료해서 메모리를 확보하는 것 보다는 나으니까)
따라서
❗️ available = free + buff/cache
근데 buff/cache 가 높다면 I/O가 많이 일어나는 환경이기 때문에 → 이럴때는 더 많은 메모리를 주는게 합리적이라고 합니다.
✔️ swap 이란
- 다시 free 명령어를 보면 Mem 아래 Swap 영역이 표시됩니다.
- Swap 영역이란, 메모리가 부족한 상황에서 사용되는 가상 메모리 공간으로 주로 블록 디바이스(EBS)의 일부 영역을 사용 합니다.
(메모리가 아님)
OS Swap 동작과정 (Swap In/Out)
- 메모리가 가득찬 상태에서 프로세스가 메모리를 요구하면, 커널에서 특정 메모리를 Swap space 에 적재합니다. (Swap In)
- 여유공간이 생긴 메모리 공간을 프로세스에게 할당해 줍니다.
- 다시, Swap In 된 메모리 영역을 사용중이었던 또 다른 프로세스가 작업 요청을 보내면 Swap space 에서 해당 공간을 꺼내서 다른 메모리영역을 Swap In 시키고, 해당 공간에 메모리를 적재합니다. (Swap out)
👏🏻 특징
- swap in 이 되어도 swap 영역에서 지워지진 않습니다. → 나중에 또 swap in/out 이 될 수 있기 때문에 → 이를 swap cache 라 함
- swap 영역은 블록 디바이스기 때문에, I/O 가 발생 → swap 영역이 사용되면 성능 저하 발생
👏🏻 최근 트렌드는 swap 영역 비활성화
- 만약 도커 컨테이너로 띄웠다면 쿠버네티스 환경에서는 빠르게 다시 띄울 수 있기 때문에 성능 저하를 시키지 않고 빠르게 하드를 죽였다가 복구하는걸 추구한다고 합니다.
- API 서버 1,2 대가 죽었다가 살아나는 것은 크게 크리티컬하지 않다고 생각한다고 합니다/
- 단, DB 서버가 죽어버리면 문제가 있음
📌정리
- ✔️ free 명령어를 통해 메모리 사용 현황 (가용 메모리양) 을 확인할 수 있습니다.
- ✔️ SWAP은 상황에 맞게 잘 판단해서 사용하는게 좋습니다.
- ✔️ 메모리 공간에 여유가 없다면, 어디선가 메모리 누수가 일어나고 있는것은 아닌지 확인해 보는게 좋습니다
🧐 Swap Space 할당 방법 →https://thalals.tistory.com/431