안드로이드의 SWAP

안드로이드의 SWAP

SWAP 이란?

리눅스 성능관련 지표를 확인할때 확인하는 것중에 SWAP 이라는 것이 있다.
바로 메모리가 모자르게 될 경우 사용하는 가상메모리로 인해 발생하는 Page swap 을 의미한다.

SWAP 에 대한 자세한 설명은 아래 링크로 대체한다.

SWAP 관리

그렇다면 이제 이러한 SWAP이 안드로이드에서는 어떻게 적용되는지 살펴 보도록 하자.


안드로이드의 메모리 관리

안드로이드는 앱마다 메모리 사용량이 정해져있고 종료된 앱은 액티비티가 서스펜드 되어 메모리에 적재된다.

아래는 안드로이드에서 앱 별 메모리 할당에 관한 글이다.

To allow multiple running processes, Android sets a hard limit on the heap size alloted for each app. The exact heap size limit varies between devices based on how much RAM the device has available overall. If your app has reached the heap capacity and tries to allocate more memory, the system throws an OutOfMemoryError.

원문 : Manage Your App's Memory


잠깐 정리하자면, 안드로이드는 매우 제한된 리소스를 가지고 있기때문에 힙사이즈를 앱마다 할당하여 사용한다는 것이다. 즉, 제한된 메모리가 실제 기기의 메모리보다 작기 때문에 OOM 발생 확률이 높아지는 것이다.

또한, 앱이 서스펜드 된다는 부분은 LMK 를 보면되는데 이에대해 잘 작성된 글이 여기있다.

이 커널이 등장한 배경은 리눅스 메모리 정책이 현재 임베디드 환경에 맞지 않다는 것이다. 리눅스 커널의 기본 메모리 정책은 OOM Killer로 대표되는데 메모리가 부족한 상황에서 최대한의 가용성을 확보하기 위해 가상 메모리를 가장 많이 할당한 프로세스를 죽이는 형태로 되어 있다. 이런 정책은 서버나 임베디드 환경에서 주요 서비스나 주요 어플리케이션을 죽일 수 있다.

원문 : 안드로이드 메모리 관리 Low Memory Killer


어플리케이션은 자신의 상태(adj)를 항상 가지고 있는다. (/proc/<pid>/oom_adj) 6개의 메모리 임계값(minfree)으로 단계별로 메모리 문제를 다룬다. 어플리케이션의 상태 변화를 인지하여 어플리케이션 상태를 수정한다. adj과 minfree 값은 짝을 이룬다. (529, 24576) (1000, 30720) minfree값 이하로 메모리가 남은 경우 adj 값 이상의 어플리케이션을 제거한다. adj 값이 높을 수록 먼저 제거되고 다음 단계는 가상 메모리 양을 비교한다.

원문 : [Android memory management] OOM Killer vs LMK


즉, 현재 리눅스 커널의 메모리 정책이 제한된 장비인 안드로이드와 맞지 않아 새로운 방식이 필요하다는 것이다.
안드로이드는 앱마다 ADJ(Adjustment) 를 관리하고, 이를 기준으로 메모리에 상주하는 앱과 필요없는 앱을 구분하고 제거를 해준다. 이것을 안드로이드 LMK 에서 관리를 해준다.
이때 서스펜드된 앱은 프로세서의 자원은 사용하지 않고 적재만 되어있다.


안드로이드에서 SWAP 사용?

이에 대한 안드로이드 엔지니어의 멘션은 여기있다.

To be a little more specific, it does use paging but not swap space. That is, it relies heavily on being able to mmap() files and have the kernel page in data from the file as needed (and drop those pages when not needed). It does not however use swap space for paging out dirty pages. - Dianne Hackborn

원문 : android-platform group forum


swap space가 없다. 즉, swapping이 발생하지 않는다는 것이다.

왜냐하면, 위와같은 상황에서 메모리 swap이 발생하게 되면 오히려 자원사용량만 늘릴뿐 큰 이득을 볼 수 없다고 한다.

또한, 안드로이드 기기가 사용하는 디스크는 쓰기 횟수에 영향을 받을 수 있기 때문에 swap을 사용할 이유가 더더욱 없어진다.

안드로이드 엔지니어들도 이미 고민해본결과 안드로이드 리눅스에서 swap을 제외시키기까지 하였다.


결론

리눅스 OOM Killer 와 안드로이드는 맞지 않아 LMK가 생겼다.

안드로이드에서는 자체적으로 앱을 메모리에서 관리한다.

안드로이드는 swap space가 없으며, swap이 발생하지 않는다.

참조

'android' 카테고리의 다른 글

[Android] Handler, HandlerThread, AsyncTask  (0) 2017.07.05

+ Recent posts