728x90
반응형
메모리 재할당이란?


리눅스 커널은 기본적으로 메모리가 유휴 상태로 있는것을 선호하지 않는다. 특정 프로세스에 할당되어 있지 않은 메모리는 커널이 사용하게 되고 주로 캐시 용도로 사용한다. 이런식으로 메모리를 사용한다면 사용가능한 메모리가 줄어들텐데 이때 사용하지 않는 메모리를 필요로 하는 다른곳에 재할당 하는것을 메모리 재할당이라한다. 주로 page cache가 반환이 되고 특정 조건이 되면 프로세스에 할당된 메모리를 회수하고 다른 프로세스에 할당하는 swapping도 발생한다. page cache는 캐시 메모리이기 때문에 회수하여도 시스템 성능에 영향이 없지만 swapping의 경우 프로세스에 할당된 메모리이기 때문에 시스템 성능에 영향을 줄 수 있다.



메모리 재할당이 발생하는 시기


프로세스로부터 메모리 할당 요청이 들어오면 커널은 FreeList에서 사용가능한 메모리 영역을 찾아서 반환한다. 이 때 사용가능한 메모리 영역이 없다면 사용하고 있는 메모리 중에 반환할 수 있는 메모리가 있는지 찾아서 반환해 준다. vm.swappiness 커널 파라미터가 이 과정에서 사용되며 이 값에 따라 page cahce에서 찾아서 반환할 것인지 다른 프로세스에 할당되어 있는 메모리를 찾아서 반환할 것인지를 결정한다.
또한 시스템 메모리가 임계치 이하로 내려갈 경우 kswapd 데몬을 통해서 메모리 반환이 일어난다. 이 임계치 값은 vm.min_free_kbytes 커널 파라미터로 관리된다.




vm.swappiness




swap tendency 계산식으로 mapped_ratio는 현재 사용중인 메모리 사용률, distress는 현재 scan 중인 메모리 영역의 priority에 따른 가중치, swappiness 는 커널 파라미터 갑이다.
mapped_ratio와 distress는 사용자가 수정할 수 없지만 swappiness는 sysctl을 통해 수정할 수 있다. 결과적으로 저 계산식의 값이 100 이상이되면 page cache를 반환하지 않고 프로세스에 할당된 메모리를 재할당한다.

※ 프로세스에 할당된 메모리를 재할당 한다고해서 active 메모리를 재할당하는것이 아닌 프로세스에 할당된 메모리중에서도 inactive 메모리를 재할당 하는데 회수된 메모리를 가진 프로세스의 메모리 영역은 메인메모리에서 지워지고 동시에 swap 영역으로 이동한다. 반환된 메모리를 가진 프로세스는 RAM을 사용하는 것이아닌 Disk의 swap 영역을 사용하게 된다는 의미이다.  

※ 리눅스 Buddy System이란?
- Buddy System은 내부적으로 11개의 Zone을 가지고 있다. 연속된 Page의 개수를 가지고 정렬하는데 1,2,4,8,16,32,64,128,256,512,1024 개로 관리한다. 즉 물리적으로 연속된 Page가 1개인지 2개인지 4개인지등을 가지고 관리한다. Buddy System이 이렇게 관리하는 이유는 8KB의 메모리 할당 요청이 들어왔을때 1개(4KB)짜리 리스트에서 2개를 주는것보다 2개(8KB)짜리 리스트에서 1개를 주는것이 더 효율적이기 때문이다.

메모리 재할당을 하기위해 shrink_active_list() 함수가 scaning 하는 메모리 존이 어디냐에 따라 distress 값이 결정된다.  처음 scaning할 때 1개짜리 존부터 1024개의 영역까지 scan하는데 1024개의 존까지 왔다면 메모리 재할당은 실패했다고 봐야한다. 그래서 distress의 값은 상당히 커진다.



만약 swappiness 값을 0으로 준다면 distress의 값이 100이 되어야 스왑을 사용하게 된다. mapped_ratio 값이 50보다는 클 수 없고 distress가 50이 되어도 swap_tendency는 100을 넘지 못하기 때문이다.
그래서 가능한 page cache를 비우고나서 스왑을 사용하도록 하게 하려면 swappiness의 값을 0으로 해주는 것이 좋다.



vm.min_free_kbytes


이 값은 kswapd가 깨어나서 메모리 재할당을 하느냐 마느냐 결정하는데 사용하는 값이다. 

※ kswapd : 커널에 의해 백그라운드로 동작하는 데몬이며 현재 남아 있는 메모리가 어느정도 이냐에 따라 page cache, dentry cache, inode cahce 등을 미리 비워두는 작업을 한다.

메모리 재할당을 할당이 실패할때만 진행한다면 시스템 성능이 낮아질 수 있기 때문에 특정 임계치 밑으로 내려가게 되면 백그라운드에서 미리 재할당을 해두어 시스템 성능을 유지할 수 있도록 도와준다.



여기서 min_pages 값이 min_free_kbytes 값이고 low_pages 는 min_free_kbytes 값의 2배, high pages는 3배를 의미한다. min_free_kbytes 값의 2배에 해당하는 값 밑으로 내려온 순간부터 kswapd가 메모리 재할당을 시작하며 min_free_kbytes 값까지 내려온다면 백그라운드 데몬이 아닌 포어그라운드 프로세스로 동작하면서 메모리를 재할당을 시작한다. 그리고 min_free_kbytes의 3배에 해당하는 값까지 재할당이 완료되면 더 이상 재할당을 하지 않는다. (min_free_kbytes의 값이 너무 낮으면 백그라운드 재할당이 제대로 되지 않고 너무 높으면 시스템에 악영향을 끼칠 수 있다. 보통 이 값은 설치된 물리 메모리의 값을 기준으로 설정되며 특별한 이유가 있지 않는 한 기본값을 수정할 필요가 없다.)



vm.vfs_cache_pressure


해당 값은 메모리 재할당 시 dentry cache, inode cache를 재할당 할 때 영향을 주는 값이다. 



위의 내용은 dentry cache 개수를 100으로 나눈 후 해당 파라미터 값을 곱하게 되는데 기본으로 설정된 100으로 계산하면 딱  사용하지 않는 dentry cache만 반환을 한다.
이 값을 크게 하면 더 많은 dentry cache, inode cache가 반환되지만 inactive list에 있는 메모리뿐만 아니라 active list에 있는 메모리까지도 반환이 되기때문에 성능에 큰 영향을 미칠 수 있다.

※ 많은 양의 파일을 열어 놓고 I/O 작업을 하는 서버들의 경우 이 값이 커서 active cache 까지 반환이 된다면 커널 내부적으로 할당과 반환을 반복하면서 무리한 CPU usage를 점유하고 커널의 행까지 일으킬 수 있다.


위의 값들 중 vm.swappiness 값을 제외하고는 수정하지 않는 것이 가장 좋다.



반응형

'Linux' 카테고리의 다른 글

Linux Memory Slab 관리  (0) 2018.08.08
Linux strace  (0) 2018.08.08
Linux rsync  (0) 2018.08.08
Linux xargs  (0) 2018.08.08
Linux Multipath Error  (0) 2018.08.08

+ Recent posts