linux 를 기반으로 운영되는 android 에서 low memory killer (LMK) 가 동작하면 특정 app 들이 차례로 종료되게 됩니다. 이때 종료되는 순서를 정해주는 것이 oom_adj 값입니다.
Out Of Memory ADJust value 를 조절하게되면 일찍 종료될 app가 더 나중에 종료되게 되어 차후 해당 app가 재 실행될 때 빠른 속도로 실행될 수 있습니다. 해당 app 가 service 를 가지고 있고 LMK에 의해 service 가 종료되는 경우가 발생하게 되면 app가 정상적으로 동작하기도 힘들어 지겠죠.
이럴때 대응할 수 있는 방법 중 하나는 oom_adj 값을 조절해 주는 것 입니다.
oom_adj 값은 +15 에서 -15까지의 값 중 하나를 갖게 됩니다. LMK 에 의해 가장 먼저 종료되는 것은 +15이며 -15가 가장 마지막에 종료됩니다.
각 process에 대한 정보가 있는 /proc/ 폴더를 보면 현재 실행중인 process id 에 해당하는 폴더가 존재하고 그 내부에 process 의 정보가 저장되어 있으며 LMK에 대한 oom_adj 값이 있습니다.
dr-xr-xr-x 185 root root 0 Jun 17 22:57 ./
drwxr-xr-x 25 root root 4096 Mar 20 23:26 ../
dr-xr-xr-x 9 root root 0 Jun 17 22:57 1/
dr-xr-xr-x 9 root root 0 Jun 17 22:57 10/
dr-xr-xr-x 9 root root 0 Jun 17 22:57 1052/
dr-xr-xr-x 9 root root 0 Jun 17 22:57 1059/
dr-xr-xr-x 9 daemon daemon 0 Jun 17 22:57 1095/
dr-xr-xr-x 9 whoopsie whoopsie 0 Jun 17 22:57 1098/
process 3376 에 대한 정보 입니다.
jbon@isPC:~$ ll /proc/3376
total 0
dr-xr-xr-x 9 jbon jbon 0 Jun 17 23:58 ./
dr-xr-xr-x 185 root root 0 Jun 17 22:57 ../
dr-xr-xr-x 2 jbon jbon 0 Jun 17 23:59 attr/
-rw-r--r-- 1 jbon jbon 0 Jun 17 23:59 autogroup
-r-------- 1 jbon jbon 0 Jun 17 23:59 auxv
-r--r--r-- 1 jbon jbon 0 Jun 17 23:59 cgroup
--w------- 1 jbon jbon 0 Jun 17 23:59 clear_refs
-r--r--r-- 1 jbon jbon 0 Jun 17 23:59 cmdline
-rw-r--r-- 1 jbon jbon 0 Jun 17 23:59 comm
-rw-r--r-- 1 jbon jbon 0 Jun 17 23:59 oom_adj
-r--r--r-- 1 jbon jbon 0 Jun 17 23:59 oom_score
-rw-r--r-- 1 jbon jbon 0 Jun 17 23:59 oom_score_adj
-r--r--r-- 1 jbon jbon 0 Jun 17 23:59 pagemap
process 3376 의 oom_adj 값은 0 이네요.
jbon@isPC:~$ cat /proc/3376/oom_adj
0
이 값을 변경하기 위해서는 아래와 같이 명령을 실행하면 됩니다.
$ echo "-5" > /proc/3376/oom_adj
하지만 매번 process 의 process id 를 찾아 oom_adj 값을 바꿔주어야 하는 번거로움이 있습니다. 이를 편하게 하기 위한 sed 명령을 이용해 process 이름으로 process id 를 찾아 변경하는 방법입니다.
process 가 apk 이름이 monkey 라고 할 때 oom_adj.sh 파일을 만들어 아래 내용을 넣습니다.
export processid=$(ps | grep monkey | busybox sed -r 's/(root *)([0-9]{4,}) [a-zA-Z0-9.: ]{1,}[a-z.]{1,}/\2/g')
echo "-5" > /proc/$processid/oom_adj
프로그램을 실행시킬 때 oom_adj.sh 를 실행해 주면 됩니다.
아파치 웹서버 재실행 방법 (0) | 2015.12.21 |
---|---|
shell 명령어 find 사용시 find: paths must precede expression: error 처리 방법 (0) | 2015.12.07 |
Ubuntu shell script if 예제 (파일 존재 유무 확인) (0) | 2015.09.17 |
Ubuntu squirrel mail user 추가 및 그룹메일 설정 (group mail setting) (0) | 2015.08.20 |
크롬 브라우저 (Chrome browser) 에서 안드로이드 앱(android app) 실행하는 방법 (0) | 2015.04.15 |