운영체제/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

 

✔️ 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 성능 향상을 위해 존재합니다.

  1. 애플리케이션에서 메모리를 필요한다면 OOM 이 일어나는데 
  2. OOM이 일어나기 전에 buff/cache 영역이 남아있으면, 이 영역을 해제하고 
  3. 애플리케이션이 사용할 수 있는 영역으로 바꿔 버립니다. (프로세스를 종료해서 메모리를 확보하는 것 보다는 나으니까)

 

 

따라서

❗️ available = free + buff/cache

 

 

근데 buff/cache 가 높다면 I/O가 많이 일어나는 환경이기 때문에 → 이럴때는 더 많은 메모리를 주는게 합리적이라고 합니다.

 


✔️ swap 이란

  • 다시 free 명령어를 보면 Mem 아래 Swap 영역이 표시됩니다.
  • Swap 영역이란, 메모리가 부족한 상황에서 사용되는 가상 메모리 공간으로 주로 블록 디바이스(EBS)의 일부 영역을 사용 합니다.
    (메모리가 아님)

free

 

OS Swap 동작과정 (Swap In/Out)

  1. 메모리가 가득찬 상태에서 프로세스가 메모리를 요구하면, 커널에서 특정 메모리를 Swap space 에 적재합니다. (Swap In)
  2. 여유공간이 생긴 메모리 공간을 프로세스에게 할당해 줍니다.
  3. 다시, Swap In 된 메모리 영역을 사용중이었던 또 다른 프로세스가 작업 요청을 보내면 Swap space 에서 해당 공간을 꺼내서 다른 메모리영역을 Swap In 시키고, 해당 공간에 메모리를 적재합니다. (Swap out)

 

👏🏻 특징

  1. swap in 이 되어도 swap 영역에서 지워지진 않습니다. → 나중에 또 swap in/out 이 될 수 있기 때문에 → 이를 swap cache 라 함
  2. swap 영역은 블록 디바이스기 때문에, I/O 가 발생 → swap 영역이 사용되면 성능 저하 발생

 

👏🏻  최근 트렌드는 swap 영역 비활성화

  • 만약 도커 컨테이너로 띄웠다면 쿠버네티스 환경에서는 빠르게 다시 띄울 수 있기 때문에 성능 저하를 시키지 않고 빠르게 하드를 죽였다가 복구하는걸 추구한다고 합니다.
  • API 서버 1,2 대가 죽었다가 살아나는 것은 크게 크리티컬하지 않다고 생각한다고 합니다/
  • 단, DB 서버가 죽어버리면 문제가 있음

 

📌정리

  • ✔️ free 명령어를 통해 메모리 사용 현황 (가용 메모리양) 을 확인할 수 있습니다.
  • ✔️ SWAP은 상황에 맞게 잘 판단해서 사용하는게 좋습니다.
  • ✔️ 메모리 공간에 여유가 없다면, 어디선가 메모리 누수가 일어나고 있는것은 아닌지 확인해 보는게 좋습니다

 

 

 

🧐 Swap Space 할당 방법 →https://thalals.tistory.com/431

 

[Jenkins 설치 및 사용 가이드] ec2 가 계속 죽음 → 빌드 자동화 개선 (with 프리티어에서 젠킨스 사

이번 게시물에서는 Jenkins 사용방법에 대해서 기록해보고자 합니다. 초기 설정부터 하는건 처음이라 두근두근 하네요 ===== Jenkins 간단 CI/CD 구축해보기 Series. ===== 👉🏻 [Jenkins 설치 및 사용 가이

thalals.tistory.com