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 스크립트를 만들어 보았습니다.
이제 위의 프로그램을 이용해서
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
어느분께는 도움이 되셨기를...
'OS > Linux' 카테고리의 다른 글
화면녹화 프로그램 (Linux에서!)[출처] 화면녹화 프로그램 (Linux에서!)| (0) | 2019.08.04 |
---|---|
How to install Google Drive on Linux Mint 18.1, 18.2 (0) | 2019.07.27 |
CentOS 7에서 Postgresql 9.6.2, Postgis 2.3.2-1 설치(인터넷 환경) (0) | 2019.03.05 |
CentOS 7 방화벽 해제 (0) | 2019.02.16 |
CentOS에 Python 3.x 설치하는 방법 20 Feb 2018 | Python (0) | 2019.02.16 |