사용자 삽입 이미지


device 단가를 낮추기 위해 저용량의 DRAM을 사용하면
다양한 memory pressure상황에 직면하게 되는데,
이를 100% 해결하기란 불가능하지만 어느정도 튜닝은 해야지.

1. cache 설정

/proc/sys/vm/vfs_cache_pressure : default 100
:높은 값일수록 cache(inode, dentry..)에 대한 reclaim 성향이 강해지고,
cache를 회수하여 free memory로 회수하게 된다.

/proc/sys/vm/dirty_background_ratio : default 20
:flusher가 시작되는 dirty page 비율 (percentage of system memory)
작을수록 빨리 flusher가 시작되므로 cache를 낮추는 효과

/proc/sys/vm/dirty_ratio (default 40)
:process별 dirty page를 write out하는 비율
dirty_background_ratio와 동일하나 flush 주체가 다름

/proc/sys/vm/dirty_expire_centisecs (default 300 : 3000ms)
:dirty page의 cache 상주 수명
작을수록 flusher 동작시 flush할 page가 많아지겠지..

/proc/sys/vm/dirty_writeback_centisecs (default 500 : 5000ms)
:flusher 동작 interval


2. watermark 설정

/proc/sys/vm/min_free_kbytes (default : system memory에 따라 다름)
:zone별 최소 보장해야하는 memory watermark 설정 기준값
계산을 통해 [min/low/high] 로 설정되며 계산 결과는 /proc/zoneinfo로 참조할 수 있다. (page 단위임)
주기적인 kswapd 동작에서 watermark 값을 참조하여,
low 이하로 떨어지면 각종 reclaim/shrinker를 호출하여 high까지 확보하는 동작을 함.

/proc/sys/vm/extra_free_kbytes
: 별도 tunable이며 kernel 3.4이후에 들어온것 같은데 첫 버전은 모르겠음
watermark에 영향을 주는데 전체 min_free_kbytes가
min/low/high에 골고루 scaling되는데 반해 low,high에만 +되는 값으로
약간 땜빵성으로 보임
:android device에서는 framework의 screen buffer를 위해 전용되고 있는 것으로 보임.

3. swappiness
/proc/sys/vm/swappiness (default : 60)
swap device (zram, disk swap partition)을 사용할 때,
swap out tendency를 설정함
큰 값일수록 swap 성향이 강해지나, swap이 많이 발생한다는 것은 free memory 확보에는 이점이 있지만,
급작스러운 덩치큰 memory 할당 요청에 대해서는 버벅임을 감수해야 함
: CONFIG_MEMCG/CONFIG_MEMCG_SWAP : android의 특수성으로 activity manager에서 control 할수 있는 swapping group에 대한 patch.
android patch는 아니고, 특정 task에 대해 swappiness를 별도로 적용할 수 있는 cgroup 생성 (/sys/fs/cgroup/memory/sw) => 해당 cgroup에 등록된 task에 대해서 system default swappiness와 다른 값을 적용할 수 있고, 이를 android에서는 ActivityManager에서 control하게 된다.
:: Lollipop
ActivityManagerService.java::applyOomAdjLocked() (bg_non_interactive에 대해)
Process.java::setSwappiness()




2015/03/12 16:17 2015/03/12 16:17
Posted by scott
사용자 삽입 이미지

설치 환경 : Ubuntu 10.04 LTS / apache2

1. 검색 index 생성 utility인 glimpse 설치
$ wget http://webglimpse.net/trial/glimpse-latest.tar.gz
$ tar xzvf glimpse-latest.tar.gz
$ configure && make && sudo make install (/usr/local/bin)

2. lxr 패키지 설치
sudo apt-get install lxr (/usr/share/lxr 하위에 설치, http/source 디렉토리)

3. LXR 환경 설정
- /usr/share/lxr/http/lxr.conf 수정
================================
baseurl: http://ipaddr/lxr/http
sourceroot: /usr/share/lxr/source/$v/
srcrootname: $v
dbdir: /usr/shard/lxr/source/$v/
glimpsebin: /usr/local/bin/glimpse
================================

- /usr/share/lxr/http/.htaccess 설정 추가
================================
<Files ~ (search|source|ident|diff|find)$>
SetHandler cgi-script
</Files>
================================

4. Apache 설정
/etc/apache2/mod-available/lxr-apache2.conf 생성 및 lxr 관련 설정 추가
================================
Alias /lxr    /usr/share/lxr/http
<Directory /usr/share/lxr/http>
Option All
AllowOverride All
</Directory>
================================
$ ln -s /etc/apache2/mod-available/lxr-apache2.conf /etc/apache2/mod-enabled/lxr-apache2.conf
$ sudo /etc/init.d/apache2 restart

cd /usr/share/lxr/http
ln -s blurb.html index.html

5. Linux source 설정, index 생성
- source copy
$cp -rf $(linux-kernel-dir) /usr/share/lxr/source

- versions & defversion 파일 생성 
$ sudo echo 'linux-kernel' >> /usr/share/lxr/source/versions
$ sudo echo 'linux-kernel' >> /usr/share/lxr/source/defversion

- symbol, file index 생성
$ cd /usr/share/lxr/source/$(linux-kernel-dir)
$ sudo genxref ./
=> xref, fileidx 파일이 생성된다.

- glimpse index 생성
$ sudo glimpseindex -H ./ fileidx xref

- 권한 설정
$ sudo chmod 644 .glimpse_*
$ sudo chmod 644 fileidx
$ sudo chmod 644 xref


http://ipaddr/lxr로 접속
2011/10/20 19:02 2011/10/20 19:02
Posted by scott

#1. mainmenu

예> mainmenu "Linux Kernel Configuration"

--> mainmenu 뒤에 있는 문장을 타이틀 로 사용한다. 이게 무슨말이고하니...

make menuconfig 를 실행 하였을때 파란 파탕에 회색 창이 뜨는데 회색창의 타이틀로 여기서 지정한 문장을 쓰겠다는 얘기가 되겠다.

 

#2. config

예> config ARM

--> Kconfig 파일에서 가장 많이 볼 수있는 명령어이다. 그도 그럴것이 이 config란 것이 menu entry 를 정의 할때 쓰는 것이기에 가장 많이 나오는 것이 당연하다 할것이다. menu entry 란 커널 옵션 항목을 말한다. config 뒤에 붙은 ARM은 feature 명이다. 이는 또 무슨 말이고 하니.... config ARM 이라는  커널 옵션 항목을 만들었다면, 결국 만들어 지는 feature는 CONFIG_ARM 이라는 feature 가 만들어 진다. 또 feature가 또 무었이냐라고 한다면 주로 #define 문으로 정의되는데 어떤 코드를 상황에따라 넣어다가 뺐다가 할수 잇도록 하는 용도로 사용되어 지는 것인데..... 마찬가지로 커널에서도 필요한 항목만 넣기 위해서 이 방법을 사용한다. 설명이 장황해 졌는데......

config ARM 에 대한 코드를 알고 싶으면..

linux-x.x.x>grep -w "CONFIG_ARM" ./  -rn

을 실행하면 사용한 위치가 보이고.. 그중에서 눈여겨 볼 파일이

include/linux/autoconf.h 이다.

이 파일은 make menuconfig 나 혹은 다른 방법으로 .config 파일이 생성되면 최종적으로 만들어 지는 파일인 것이다.

 

보통 config 문은 이러한 구조로 되어 있다.

 

config EXAM
      bool "Exam Menu"

      default y
     depends on MODULES

     select TEST
     help
       Usually, modules have to be recompiled whenever you switch to a new
       kernel.  ...
config  이후의 문장들은 메뉴 속성을 지정하는 부분이다.

 

#3. bool

메뉴 속성에서

      bool "Set version information on all module symbols"
는 메뉴타입을 지정하는 것이다.

여기서 bool 은 tristate / string / hex / int 가 될 수 있으며

bool 은 두가지 상태 즉 yes/no, true/false, 등과 같은 것들을 지정....

tristate는 세가지 상태, Y / M / N  즉 커널에 넣기 / 모듈로 넣기 / 빼기 이다.

string 은 스트링을 입력 받으 수 있는 타입이며 마찬가지로 hex int 는 각각 hexa 와 integer 값을 입력 받는 타입이다.

 

#4. prompt

모든 메뉴엔트리는 하나의 prompt를 가진다. prompt 라는 것은 사용자가 볼수 있도록 화면에 출력시켜주는 문자열이다. 즉 메뉴상에 나타나는 문장이다.

하지만 이 prompt 는 생략 가능하므로, 위의 예는

bool "Exam Menu" 는

bool

prompt "Exam Menu" 과 같은 의미이다.

 

#5. default

메뉴 엔트리의 기본 값을 정하는 명령어 이다.

 

#6. depends on

현재 메뉴엔트리의 종속성 설정하는 명령어 이다. 종속성이라.... 쉽게 말하자면 , "나는 철수가 학교가면 나도 갈것이다"라고 생각하면 되겠다. 즉 다른 feature가 선택이 되면 현재 메뉴 엔트리가 활성화가 되게끔하는 명령어이다.

위의 예에서

     depends on MODULES

은 MODULES 가 yes , active , on 등 긍정적인 설정이 되면 현재 메뉴 엔트리가 활성화 된다는 것을 의미한다.

 

#7. select

역종속성을 설정하는 명령어 이다. 역종속성.. 영어로는 ,reverse dependencies 라고 한다. "내가 학교가니깐 영희도 철수도 학교간다." 정도로 생각하면 정확한다. 즉 현재 menu가 선택되면 다른 메뉴 항목도 선택 되게끔 설정하는 명령어이다.
역종속성이라는 말처럼.. 잘못하면하면 종속성을 거스르는 문제가 발생하기도 한다.

즉 A에 종속 되어 있는 메뉴가 A가 on 되기 전에 select 명령어로 활성화가 될수도 있다는 말이다.

그래서 select는 주로 non-visisible symbols 과 종속성이 없는 것에 일반적으로 사용되어 진다.

2010/07/21 15:23 2010/07/21 15:23
Posted by scott
kernel boot
init.c:main() - init process 실행
app_main.cpp:main() - zygote service 실행
AndroidRuntime.cpp:start() - java VM 실행
ZygoteInit.java:main()
SystemServer.java:main()
system_init.cpp:system_init()
SystemServer.java:init2()
ServerThread.run()
ActivityManagerService.java:startRunning()
systemReady()
resumeTopActivityLocked()
startHomeActivityLocked()
startActivityLocked()
2010/07/05 16:27 2010/07/05 16:27
Posted by scott