리눅스 메모리 확인 및 캐시 삭제

신동수·2024년 2월 24일
1

Server

목록 보기
4/9

리눅스의 캐시와 메모리

리눅스에서 free 명령어를 사용하다 보면 buffer/cache라는 것이 존재. 이 부분은 직접 사용하고 있는 메모리가 아닌 버퍼와 캐시에 사용된 메모리.

버퍼와 캐시에 저장된 메모리 말고 Swap 메모리도 있는데 해당 메모리는 메모리의 사용량이 늘어남에 따라서 디스크의 일부를 Ram처럼 사용할 수 있게 해주는 영영을 의미한다. (커널에서 실제 메모리에 올라와 있지 않는 블록중 쓰이지 않는 것을 디스크에 저장하여 사용 가능한 메모리 영역을 늘림)

  • Buffer : 블록 디바이스에 대한 메타데이터를를 메모리에 저장, 메타데이터란 데이터에 대한 정보를 말함 
  • Cache : Page Cache + Slab
    - Page Cache : 저장 장치를 통해 한 번 읽어온 파일의 내용을 메모리에 저장한다. 여기서 Buffer 와 다른 점은 메타데이터를 저장하는 것이 아닌 파일의 내용을 저장한다는 점이다. 
    - Slab : 커널 내부에서 사용하는 메모리, 캐시라고 생각하면 된다.

버퍼와 캐시에 사용된 메모리

일반적으로 캐시는 느린 장치의 데이터를 빠른 장치에 임시로 보관해두고 사용하여 성능을 올리는 것이 목적이다.
따라서 캐시는 당연히 사용하는 것이 좋지만, 적중률(hit 라고도함)이 낮은 캐시의 경우에는 캐시를 사용하는 것이 성능에 좋지 않을 수 있음.

Linux에서의 캐시 관리

리눅스에서는 기본적으로 디스크 상의 파일을 읽고 난 뒤 (I/O입출력) 닫아도 메모리가 모두 반환되지 않음.
그 이유는 파일의 정보를 다음 사용해 대비하여 cache 하기 때문.
대용량의 파일이 관리되는 서버는 캐시의 적중률이 낮게 되기 때문에 cache기능을 끄거나 주기적으로 캐시를 지워주어야 한다.

메모리 확인 및 캐시 삭제

# aws EC2 에서 확인한 메모리 정보
$ free -h
              total        used        free      shared  buff/cache   avail
Mem:           486M         78M        297M        4.4M        110M        391M
Swap:          2.0G          0B        2.0G

[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 부분이 사라지고 생겼다.

free 와 available 차이

  • 차이점
    free: 현재 완전히 비어 있고, 어떤 것도 사용하지 않고 있는 메모리다. 이 값만 보고 메모리 사용 상황을 판단하는 것은 Linux에서는 적절하지 않을 수 있다.
    available: 현재 사용 중이지만 필요 시 다른 용도로 사용될 수 있는 메모리까지 포함한, 실질적으로 새로운 프로그램이 사용할 수 있는 메모리다.
  • free 메모리는 아무것도 채워져 있지 않은 빈 책상과 같다. 반면, available 메모리는 현재 서류로 채워져 있지만, 필요하면 언제든지 다른 일을 위해 치울 수 있는 책상 공간과 같다. 책상 위에 서류가 있어도, 서류를 치우면 바로 그 공간을 사용할 수 있는 것처럼, 캐시로 사용된 메모리도 필요하면 해제하여 다른 용도로 사용할 수 있다.
# Pagecache 비우기
$ echo 1 > /proc/sys/vm/drop_caches
or
$ echo sysctl -w vm/drop_caches=1
# Dentries, Inodes 비우기
$ echo 2 > /proc/sys/vm/drop_caches
or
$ echo sysctl -w vm/drop_caches=2

Dentries, Inodes : 파일의 자료구조를 의미한다. 보다 빠른 데이터 접근을 위해 Slab의 자료구조에 추가되어 사용, dentry는 경로명 탐색을 위한 cache 역할도 수행

# Pagecache, Dentries, Inodes 모두 비우기
$ echo 3 > /proc/sys/vm/drop_caches
or
$ echo sysctl -w vm/drop_caches=3

주의 사항

# /etc/crontab
0 0 * * 0 sync && echo 3 > /proc/sys/vm/drop_caches # 매일 오전 0시에 캐시 비우기

위와 같이 cron 으로 자동화를 할 수 있지만 파일 I/O 가 빈번하게 일어나는 시스템이라면 CPU 사용량이 높아질 수 있다.

참고

profile
조금씩 성장하는 DevOps 엔지니어가 되겠습니다. 😄

0개의 댓글