Skip to content

Latest commit

 

History

History
27 lines (15 loc) · 3.29 KB

free.md

File metadata and controls

27 lines (15 loc) · 3.29 KB

free

시스템의 메모리 사용 현황을 확인할 수 있는 명령어다.

주요 지표로 free, available이 있으며, free는 어느 누구도 사용하지 않는 메모리, available은 application(process)에 할당할 수 잇는 메모리 양이다.

available은 free에 buff/cache를 더한 값이라고 볼 수 있는데, buff/cache중 buff는 블록 디바이스가 갖고 있는 블록 자체의 캐시 양이고 cache는 페이지 캐시를 의미한다.

  • 페이지 캐시: 는 간단히 프로세스가 디스크에 저장된 파일을 읽거나 사용할 경우 메모리에 파일 내용을 캐시하는데 이때 사용되는 메모리를 페이지 캐시 혹은 캐시메모리라고 한다.

이처럼 블록 디바이스의 파일 내용을 메모리에 두어 불필요한 disk io를 줄여 시스템의 성능을 향상시킬 수 있다. 하지만 애플리케이션이 사용할 메모리가 부족할 경우 페이지 캐시 메모리는 해체되어 반납된다. (buff는 블록 디바이스가 가지고 있는 블록 자체에 대한 캐시를 나타낸다.)

swap은 블록 디바이스의 일부분을 마치 메모리 처럼 사용하는 기능이다.

  • swap은 메모리 사용량이 부족하게 된다면 디스크의 특정 부분을 가상 메모리 처럼 사용하는 기능이다. 서버 메모리가 부족하면 메모리의 특정 구간을 디스크로 swap out해서 대기중인 다른 프로세스가 메모리르 사용하도록 하고, swap out된 메모리를 다시 호출하게 되면 해당 메모리를 다시 메모리 영역에 올려놓는다 이를 swap in이라고 한다.
  • swap in이 되어도 실제 메모리에 변화가 없다면 디스크 원본을 그대로 남겨놓는것이 좋으므로 실제 디스크에는 swap in에 되어있던 메모리가 남아있고 이를 swap cached라고 한다.
  • 하지만 swap은 계속 사용할수록 성능 저하가 발생한다 그 이유는 프로세스의 메모리 참조 블록 디바이스에 io가 계속 발생하는 것이기 때문에 속도가 느려지고 성능 저하가 발생한다.
  • application 특성에 따라 스왑의 사용 여부가 좋거나 나쁠수 있다. api 서버같은 애플리케이션은 빠르게 재시작하는 것이 swap보다 성능면에서 좋고 데이터베이스 서버같은 경우 다운타임이 발생하면 리스크가 크기 때문에 swap을 사용하더라도 가용성을 보장하는것이 좋다.

하지만 컨테이너 배포 환경에서 k8s와 같은 시스템은 기본적으로 swap 설정이 off되어있다. 이는 container를 재실행하는 것이 속도가 매우 빠르기 때문에 메모리 문제가 발생했을 경우 swap을 사용하는 것 보다 재시작이 성능상 이점을 가져다주는 시대가 되었기 때문이라고 볼 수 있겠다.

정리하면 free를 통해서 시스템의 메모리 사용 현황, 메모리의 buff/cache가 높다면 io가 많이 일어나는 상황이고, swap이 사용중이라면 메모리가 부족한 상황이라고 볼 수 있어 메모리 증설이 요구된다.

서버의 메모리가 부족하다면 buffer/cache 메모리 반납하여 사용 -> swap 사용 -> oome 발생 순으로 증상이 나타난다.