본문 바로가기
OS/Linux

[Linux] Cached Memory 비우고 Free Memory 늘리기

by 신군. 2019. 7. 14.
반응형

http://mcchae.egloos.com/11217429

리눅스 터미널에서 

 

$ head /proc/meminfo

라는 명령을 내리면

 

MemTotal:        4652384 kB

MemFree:         2108012 kB

Buffers:           13096 kB

Cached:            33808 kB

SwapCached:            0 kB

Active:          1655428 kB

Inactive:          14316 kB

Active(anon):    1622824 kB

Inactive(anon):       32 kB

Active(file):      32604 kB

 

와 같이 결과가 나옵니다.

전체 4G 메모리 (가상머신이나 임베드인 경우 요즘 이 정도 하지요...)에

Free 메모리가 약 2.1GB 이고 Cached 메모리가 약 33MB 정도 입니다.

 

이 상태에서는 Cached 메모리가 Free 메모리에 비하여 상대적으로 작습니다.

 

처음에는 작은 Cached 가 있었는데 아래와 같은 명령을 수행하고 나면 Cached가 꽉 찹니다.

 

# dd if=/dev/sda1 of=/opt/aaa bs=1024 count=10000000

 

위의 명령은 dd (dick dump) 명령을 이용하여 /dev/sda1 파티션의 내용을 /opt/aaa 라는 파일로

1024바이트(1kB)씩 천만개 (약 10GB) 연속하여 읽고 쓰는 역할을 진행합니다. 

(/dev/sda1 등은 mount 혹은 df -h 또는 fdisk 등으로 확인 가능합니다)

 

문제는 위와 같은 dd 라는 명령을 실행하고 몇 초 있으면

 

$ head /proc/meminfo

MemTotal:        4652384 kB

MemFree:          404700 kB

Buffers:          679676 kB

Cached:          1040276 kB

SwapCached:            0 kB

Active:          1643952 kB

Inactive:        1682864 kB

Active(anon):    1606848 kB

Inactive(anon):       32 kB

Active(file):      37104 kB

 

MemFree와 Cached 가 역전이 되면서 심하게 Free가 부족함에 시달린다는 것입니다.

 

그 이유를 찾아 보았더니, 파일 입출력을 할 때에도 페이지 캐쉬 라는 이유로 메모리를 사용한다는 것입니다.

Block IO 를 하는 디바이스를 읽고 쓰기 위하여 시스템 Cache 메모리에 넣고 재사용을 위해

기다린다는 의미이지요. (참고 [FAQ] Linux 메모리 효율을 위한 vfs_cache_pressure)

 

위에 보면 Cached 된 메모리가 Free 에 비하여 상당히 많이 존재 합니다.

 

위와 같이 되어 있는 경우 

 

/proc/sys/vm/vfs_cache_pressure

내용을 수정하여 얼아마 캐쉬를 많이 사용하고 자주 돌려주는가를 지정할 수 있다고 합니다.

 

또한 다음과 같이

 

# echo 3 > /proc/sys/vm/drop_caches

(root 권한)

 

명령을 주고 모든 캐쉬를 한꺼번에 비워버릴 수가 있습니다.

 

3대신 1 또는 2도 가능한데 다음과 같은 의미 입니다.

 

  • drop_caches = 1 : Page cache를 해제 한다.
  • drop_caches = 2 : inode, dentry cache를 해제 한다.
  • drop_caches = 3 : Page cache, inode cache, dentry cache를 모두 해제 한다.

이제는 위와 같이 페이지 캐쉬를 유발하는 프로그램이 존재한다고 가정하고

이를 실행시키는데 그 위에 Wrapper 로써 캐쉬 메모리를 살펴보고 특정 이상 너머가면

위와 같은 방법을 깨끗이 하는 간단한 Python 스크립트를 만들어 보았습니다.

 

limit_cachedmem.py

 

이제 위의 프로그램을 이용해서

root 권한의 터미널에서 아래와 같이 돌려보면,

 

# python limit_cachedmem.py -v dd if=/dev/sda1 of=/opt/aaa bs=1024 count=10000000

RUN: ['dd', 'if=/dev/sda1', 'of=aaa', 'bs=1024', 'count=10000000']

NOT EXCEED limit 1024 > 33

NOT EXCEED limit 1024 > 458

NOT EXCEED limit 1024 > 597

NOT EXCEED limit 1024 > 668

NOT EXCEED limit 1024 > 787

NOT EXCEED limit 1024 > 920

NOT EXCEED limit 1024 > 874

EXCEED limit 1024 <= 1059

NOT EXCEED limit 1024 > 390

NOT EXCEED limit 1024 > 670

NOT EXCEED limit 1024 > 790

NOT EXCEED limit 1024 > 930

EXCEED limit 1024 <= 1051

NOT EXCEED limit 1024 > 504

NOT EXCEED limit 1024 > 713

NOT EXCEED limit 1024 > 1018

EXCEED limit 1024 <= 1048

NOT EXCEED limit 1024 > 453

...

10000000+0 records in

10000000+0 records out

10240000000 bytes (9.5GB) copied, 282.125753 seconds, 34.6MB/s

 

위의 내용은 dd ... 명령을 수행하는데

limit_cachedmem.py 를 -v (재잘거리기 모드)옵션 으로 실행한 것입니다.

디폴트로 캐쉬 메모리가 1024MB 가 넘어가면 Free 시키고

다시 증가되는 것을 알 수 있습니다.

체크 시각은 -p 3 과 같이 지정할 수도 있지만 디폴트로 5(초)를 의미합니다.

 

 

옵션은 아래와 같습니다.

 

# python limit_cachedmem.py -h

Error:Run command must not empty

usage: limit_cachedmem.py [options] exe param [param ...]

  check the cached memory and if exceed the limit then free it

  [options] are:

    -c --cache n : set limit of cached mem to check (MB unit; default is 1024MB)

    -p --period n : set checking period to check (sec unit; default is 5sec)

-v --verbose : set verbose mode on

-h --help : show this help message

 

 

어느분께는 도움이 되셨기를...

반응형