대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 리눅스 free 메모리의 이해
등록일 조회수 10655
첨부파일  

리눅스 free 메모리의 이해

㈜엑셈 컨설팅본부 /DB컨설팅팀 임 경석



개요

리눅스 환경에서 메모리 사용률을 모니터링 하기위해 명령어를 실행하다 보면 시스템을 기동한 지 얼마 되지 않아 free 영역의 지표가 급격히 줄어드는 것을 쉽게 확인할 수 있다 . 리눅스 어드 민 경험이 있는 사람이라면 이것이 무엇을 의미하는지 알수 있지만 그렇지 않을경우 흔히들 메 모리 사용률이 높다고 판단할 수 있다 . 따라서 , 결과로 보여주는 지표들이 의미하는 바를 정확히 이해하지 못할 경우 잘못된 판단을 할 수 있다 . 이번 문서 에서는 리눅스에서 메모리 사용률을 모니터링 하는 방법과 각각의 지표가 의미하는 바는 무엇인지 간단히 살펴보기로 하자 .


free 메모리의 의미 ?

유닉스 계열의 시스템에서 메모리 사용률을 확인하기 위해 top, free, vmstat, sar, topas 등의 명령어를 주로 사 용한다 . 리눅스 에서는 단순히 free 명령어를 실행하면 현재 시점의 메모리 상 태를 쉽게 확인할 수 있다 . 필자의 테스트 장비는 오라클 리눅스 2.6 - 64bit 에 오라클 11.2.0.3 버젼으로 시스템을 기동하자마다 free 를 실행하면 아래와 같은 결과를 확인할 수 있다 .



전체 메모리 크기는 2,002 MB 이고 , 서버가 기동되면서 사용된 메모리는 325 MB, 여유메모리 는 1,676 MB 이다 . 여기서 한가지 주의해서 볼 것은 각각 22 MB, 124 MB 로 표시되는 buffers 와 cached 부분이다 . 이미 단어의 의미에서 유추해 볼 수 있듯이 buffers 는 메모리에 존재하는 데이터 영역 중 디스크로 플러시될 데이타 영역을 의미한다 . 흔히 더티 페이지로 표현되는 데이타 구조나 청크의 개념이 들어가 있는 메모리가 여기에 속한다 . buffers 는 주기적으로 bdflush 데몬에 의해서 디스크로 플러시 된다 . 임의로 플러시 하기 원한다면 sync 명령어를 실 행하면 되는데 이럴경우 buf fers 에서 더티페이지 크기만큼만 플러시 된다 . 현재 더티페이지 크 기는 /proc/meminfo 의 Dirty 라고 표시된 부분을 통해 확인할 수 있다 .

반면 cached 는 기존에 실행된 프로그램들이 사용했던 메모리로 실행 중 이거나 새로 시작될 프 로그램들이 필요 시 빠르게 재사용 할 수 있는 메모리 영역을 의미한다 . 흔히 디스크 캐시라고 도 하는데 , 캐시를 유지하는 이유는 동일한 데이터를 요구하는 프로그램이 있을 경우 디스크로 부터 다시 읽어 들 이는 것보다는 캐시된 데이터를 읽는 것이 성능에 유리하기 때문이다 . 따라서 , Cached 영역은 실행중인 프로그램이 메모리가 필요할 경우 바로 사용되어지는 free 메모리라 고 생각할 수 있다 . 유닉스 계열의 시스템에서 메모리 사용은 크게 프로세스가 사용하는 heap 영역과 디스크 캐시 영역으로 나눌 수 있다 . aix 의 경우 대부분의 메모리를 디스크 캐시에 할당 한다 . 따라서 , 일정시간이 경과하면 free 메모리가 감소하는 것을 볼 수 있다 . 리눅스의 경우 도 마찬가지이다 . cached 영역에 page cache 뿐 아니라 파일의 자료구조인 inode 와 dentry 정보 를 저장하여 cached 영역이 증가할수록 free 영역은 감소하게 된다 . 그러나 , 실제 메모리의 여 유가 없는 것은 아니고 커널이 필요할 때마다 cached 영역을 알아서 조정하게 된다 . inode 와 dentry 는 빠른 데이터 접근을 위해 필요한 것인데 , 커널의 자원할당자 역할을 하는 slab allocator 라는 것에 의해서 저장 된 다 . cached 영역에서 slab 이 차지하는 영역의 크기는 /proc/meminfo 를 통해 확인할 수 있다 .



모니터링

지금까지의 내용을 정리하면 리눅스의 경우 메모리 실제 사용률을 구하기 위해서는 실제 free 크기는 free 영역에 buffers 와 cached 를 더하여 계산해야 한다는 것이다 . 이를 토대로 실제 free 와 used 크기를 구하게 되면 - /+ buffers/cache: 에 표시된 값과 거의 일치한다는 것을 알 수 있다 .



이 상태에서 오라클을 기동하면 메모리 사용량은 어떻게 변하는지 살펴보자 .



SGA 크기가 1GB 인 인스턴스를 기동한 후 used 는 733 MB, cached 영역이 416 MB 로 증가 한 것을 확인할 수 있다 . 이는 오라클을 기동하여 오라클이 소유한 shared memory 가 2GB 임 에도 불구하고 처음부터 SGA 전부를 메모리에 생성하지 않는다는 것이다 . SQL*P lus 에서 대량 의 테이블을 select 하는 쿼리를 특정세션에서 실행해 보자 .



오라클에서 세그먼트 크기가 440 MB 인 테이블을 select 할 경우 cached 898 MB 까지 증가한 것을 확인할 수 있다 . 결과적으로 free 영역도 769 MB 로 감소 하였다 . 이때 , 크기가 1GB 인 파 일을 하나 생성해보자 .



크기가 1 GB 인 파일을 생성할 경우 , free 는 19 MB 로 급격히 감소하고 used 부분이 1,983 MB 까지 증가하였다 . 이중 1,654 MB 가 cached 영역에 생성되었으며 , buffers 영역도 일부 감 소한 것을 볼 수 있다 . 그렇다면 현재 메모리 전체 사이즈보다 큰 파일을 생성할 경우 메모리 변 화는 어떻게 되는지 살펴보자 .



4GB 크기의 파일을 생성하는 동안 vmstat 으로 메모리 변화를 살펴보면 , free 영역이 16 MB 인 상태에서 cached 영역의 메모리 일부를 free 상태로 전환한다는 것을 알 수 있다 . free 로 전 환된 메모리는 파일이 생성되는 시점에 다시 cached 상태가 되고 free 및 cached 크기가 현재 상태로 수정됨을 알 수 있다 . 즉 , free 메모리가 부족할 경우 cached 영역 일부를 free 상태로 전환하여 사용한다는 것이다 . 이는 앞에서 설 명했듯이 cached 영역이 실제로 free 메모리로 사 용되고 있음을 보여준다 . 여기서 한가지 확인할 것은 free 메모리가 부족함에도 swap 은 발생하 지 않았다는 것이다 . swap 의 used 는 여전히 0 인 상태로 남아있다 .

이어서 4GB 파일을 바로 삭제하면 아래와 같이 cached 영역의 상당부분의 메모리가 다시 free 영역으로 전환된다 . 파일을 생성하면서 cached 영역의 대부분을 차지한 데이터들이 동시에 삭 제 되므로 오라클 인스터스만 생 성된 시점으로 메모리 상태가 변경된다 . 이때래와 같이 시스템을 처음 기동할 때의 메모리 상태로 변경된 다 .



지금까지 테스트를 위해 수행된 모든 내용을 메모리에서 제거하였어도 cached 영역에는 아직 119 MB 가 남아있다 . 만약 이 부분 또한 free 로 전환하고 싶다면 어떻게 하면 될까 ? 리눅스에 서는 메모리의 buffers 와 cached 상태의 메모리를 free 영역으로 임의로 변경하기 위해 /proc/sys/vm/drop_caches 파일의 내용을 0 에서 1, 2, 3 중 하나의 값으로 변경하면 된다 .



파일의 값을 '1' 로 변경하였더니 cached 값이 대부분 free 영역으로 전환되었음을 볼 수 있다 . 해당 파일을 직접 수정할 수도 있지만 명령어로도 가능하다 .



결론

유닉스 계열의 O/S 에서 메모리 사용률을 정확하게 모니터링 하기란 쉽지 않다 . 그 이유는 빠른 CPU 성능에 I/O 속도를 맞추기 위해 메모리의 상당부분을 디스크 캐시로 사용하기 때문이다 . 디스크 캐시는 I/O 가 발생할 때마다 유동적으로 변화하고 특정 커널 파라미터를 통해 임계 값 을 설정하여 그 이상으로는 증가하지 못하게도 할 수 있다 . 이러한 기능은 각 벤더마다 조금씩 차이가 있다 . 메모리 사용률을 정확한 수치로 계산하기란 쉽지 않으며 메모리를 확인하는 명령 어에 따라 약간의 차이가 있다 . 따라서 , 메모리를 모니터링 할 때 얼마나 가용한 메모리가 남았 는지 , 현재 메모리가 부족하여 SWAP 을 지속적으로 사용하고 있는지 등을 확인하는 것이 올바 른 모니터링 방법이라 할 수 있겠다 .


참고 문헌

http://stackoverflow.com/questions/9724396/understanding - buffers - and - cached - from - free - command , http://www.slideshar e.net/yvelikanov/all - oracle - dbas - have - to - know - about - unix - memory - monitoring



출처 : (주)엑셈

제공 : DB포탈사이트 DBguide.net