플랫폼 /app 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉...

54
플플플 /App 플플플플플 플플 플플플플플 플플플플플 플플플 플플플 플플플 Function Tracer(Ftrace) Technology Session 회회회 : 회회회 (Nickname: 회회회 ) 회회회 : leemgs.at.gmail.com (http://leemgs.fedorapeople.org) 회회회 : 2011 회 10 회 17 회 ( 회 )

Upload: giolla

Post on 23-Feb-2016

172 views

Category:

Documents


0 download

DESCRIPTION

플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace ) Technology Session. 작성자 : 임근식 (Nickname: 인베인 ) 이메일 : leemgs.at.gmail.com (http://leemgs.fedorapeople.org) 발표일 : 2011 년 10 월 17 일 ( 月 ). 본 세션에서 무엇을 배울 것인가 ?. Highe st. Lowest. Who Am I ?. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 1/43

플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉

Function Tracer(Ftrace) Technology Session

작성자 : 임근식 (Nickname: 인베인 )이메일 : leemgs.at.gmail.com (http://leemgs.fedorapeople.org)발표일 : 2011 년 10 월 17 일 ( 月 )

Page 2: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 2/43

본 세션에서 무엇을 배울 것인가 ?

안드로이드 플랫폼을 상용 모바일 디바이스에 탑재후 많은 개발자들이 디버깅 문제 , 프로파일링 문제 , 튜닝 문제 , 트레이싱 문제 등의 최적화 이슈에 직면하게 됩니다 . 본 세션에서는 플랫폼 및 APP 개발자들이 안드로이드 커널을 쉽고 효과적으로 Tracing 을 할 수 있기 위한 방법들을 공개합니다 .

특히 , 안드로이드 플랫폼으로 상용 제품을 준비하는 개발자 분들에게 소프트웨어 품질 경쟁력을 확보하기 위해 안드로이드 플랫폼의 OS 내부를 기반 지식 없이도 쉽게 Tracing 할 수 있는 Know-How 를 제시합니다 .

Page 3: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 3/43

Summit : 수뇌 [ 정상 ] 회담 , 최고 전문가들이 해당 기술에 대해 회의

Conference: ( 보통 여러 날 동안 대규모로 열리는 ) 회의 [ 학회 ]

Symposium: 특정 주제를 놓고 연구 · 토론하기 위한 전문가들의 모임

Seminar: ( 대학에서의 ) 토론식 수업

Lecture : ( 특히 대학 ) 강의 , 강연 , 설교

Education: ( 특정 종류의 ) 교육 [ 지도 / 훈련 ] / ( 교훈이 되는 ) 경험 , 교육

애정남 (애매한걸

정해주는 남자 !!! )

본 세션의 기술 지식

난이도 분류를 한다면 ?

Highest

Lowest

Page 4: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 4/43

Who Am I ?• 이름 / 닉네임 : Geunsik Lim ( 임근식 ) / 인베인 (in+va+in)• 이메일 / 홈페이지 : leemgs.at.gmail.com / http://leemgs.fedorapeople.org • 현재하는 일 : 코리아 안드로이드 기술 커뮤니티 운영진 (http://www.kandroid.org ) OS(Scheduler, MM, 최적화 ), Tool-chain, Linker & Loader, Debugging

• 안드로이드 관련 국내외 주요 발표 활동 내역 ( 요약 ) 2011 7th Korea Android Conference (Android Network & Enhancement) 2010 Android Mini Seminar (Real Phone Anatomy: 안드로원 , 옵티머스원 ) 2010 6th Korea Android Conference ( 클라우드 컴퓨팅 기반의 크롬 웹 OS) 2010 5th Korea Android Conference (GCC 컴파일러로 안드로이드 성능 최적화하기 ) 2009 4th Korea Android Conference (Prelink/Preload 기술에 기반한 Zygote 분석 ) 2009 3G Mobile Phone Design Conference ( 초대 , 발표 , 홍콩 , 중국심천 ) 2009 1st Asia Pacific Android Technical Conference ( 키노트 발표 , S3C6410 ,Netbook, 베이징 , 상하이 ) 2009 3rd Korea Android Conference ( 발표 , 안드로이드 전체소스를 유지 / 관리하기 위한 Repo 이해 ) 2009 리눅스 국제 컨퍼런스 [LCA 2009; linux.conf.au] – (CFP, 발표 , 호주 태즈매니아 , Mobile Experience with Android) 2008 CELF Korea Technical Jamboree 3rd – Android Platform Internals( 발표 ) 2008 KIPA 오픈소스 비즈니스 모델 및 안드로이드 플랫폼 세미나 2008 제 3 회 임베디드 기술 국제 심포지엄 (ISE2008, 대구 , 발표자 ) 2008 2nd Korea Android Conference ( 발표 , 안드로이드 포팅 및 개발 프로세스의 이해 ) 2008 1st Korea Android Conference ( 발표 , 리눅스 기반의 안드로이드 커널 이슈 ) 2007 Joined the Korea Android Community as technical co-founder (www.kandroid.org) 2007 Android Tech-Hub 네이버 카페 개설 / 운영

Page 5: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 5/43

• Ftrace 이론편 for Platform Developers (40 분 )

1. Introduction & Overview 멀티코어 지원을 위한 안드로이드 커널

기능들 User-space Zygote 에 Strace 연동시키기 User-space App VMs 프로세스에 GDB

연동시키기 Ftrace 란 무엇인가 ? Ftrace 로 할 수 있는 일들은 무엇인가? Ftrace 의 환경설정 및 맛보기 데모

2. Understanding Ftrace Ftrace 의 동작원리 (Dynamic function

with –pg option) Ftrace 에서 지원되는 Trace 기능들 필요한 커널함수만 분석 방법 문맥교환 스케쥴링 분석하기 커널함수 실행을 그래프 형태로 출력하기 이벤트 트레이서 (Event Tracer) 활용하기 Plugins VS. Events

• Ftrace 활용편 for App Developers (40 분 )

1. Trace-cmd (CLI Utility ) 리눅스 커널 비전문가를 위한 툴들 (trace-cmd/Kernelshark) 애플리케이션 개발자를 위한 trace-cmd ARM 용 Trace-cmd/Kernelshark 소스 컴파일 하기 Trace-cmd 실행파일이 필요로 하는 라이브러리 Trace-cmd 명령 실행 방법 Trace-cmd 으로 특정 CPU 의 함수 프로파일링 하기 인트럽트 Off 영역의 디버깅 방법 스케쥴링 Latency 의 디버깅하기2. Kernelshark (GUI Utility) GUI 기반 로그파일 분석 유틸리티 - Kernelshark Kernelshark 의 그래프 정보 영역 마크 Kernelshark 으로 로그파일 분석하기 Study: Ftrace 을 이용하여 Contacts 의 성능 저하 분석

• References• Conclusion• Q&A

세션 1 : 목 차

Page 6: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 6/43

멀티코어 지원을 위한 안드로이드 커널 기능들SMP Scheduler(Load-balancing) : scheduler( ), load_balance( ), migration_thread( ), ./kernel/sched.cSynchronization : Semaphore , Spin-Lock , FUTEX, Atomic 연산 , Per-CPU variable, RCU, WorkQueue

Interrupt Load-balancing ( or 사용자 공간의 irqbalance 서비스 데몬 )

Affinity ( 프로세스 / 쓰레드들이 사용할 CPU 을 할당한 후 , 다른 CPU 으로 이동을 금지하는 기능 )• CPU Affinity(Shielded CPU): 태스크들이 사용할 CPU 지정 ( sched_{set|get}affinity 함수 )• I/O Affinity: Disk I/O 에 사용할 CPU 지정• IRQ Affinity: Interrupt 를 발생시키고자 하는 CPU 지정

CPUSET(with Process Container): 태스크들에게 CPU 및 Memory (on NUMA) 노드 할당CPU Isolation: 특정 CPU 를 격리 시키기 위한 기능 (Load-balancing 로직을 동작시키지 않기 )

Tasks

Tasks

Multi-core

Ftrace( 커널의 디버깅

피쳐 )

Load-balancing

Page 7: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 7/43

안드로이드 플랫폼의 디버깅 소프트웨어 현황

Android Debug Bridge(ADB)

LogCat/Android InstrumentationDDMS(JDWP)/Traceview/Dm-

tracedump

AVD/ADT &AIDL

SystemTap Un-official

Valgrind New

Strace/Ltrace/GDB

Trace-cmd/Ker-nelshark

Home Contacts Phone Browser GoogleMap

Activity Manager

Windows Manager

Content Providers

View System

Notification Manager

Package Manager

Telephony Manager

Resource Manager

Location Manager

XMPP Service

Applications Framework

System (Functional) Li-brariesSurface

ManagerStage Fright SQLite OpenGL/ES

FreeType

Webkit SGL SSL Bionic Libc(79 pthread)

Core Li-braries

Dalvik VM

. . . .

Binder (IPC) LMK

LTT-NGKernel Debugger Latency-Top

ASHMEM

Oprofile

Log SubSystemAndroid Kernel

HAL(Hardware Abstraction Layer)Graphics

Android Runtime

Audio Radio(RIL)G P SCamera BlueTooth WiFi . . . .

IM Gtalker Calculator Clock Media Player Calendar

Perf

DbusLatencyTop viewer

Oprofile/Opcon-trol

LTT Viewer

kmem-trace

ftrace

Perf/ELF-util

Android 플랫폼은 Linux 2.6.X Kernel 에 Oprofile, LTT-NG, Logcat, Kernel debugger 등을 이용하여 모바일向 미들웨어를 위한 커널레벨의 Profiling/Tracing/Debugging/Tuning 등의 툴을 지원 .

(kgdb/kdb)

Applications(APK)

Ftrace 으로 분석 가능영역

Ubuntu 10.04 LTSRHEL6/CENTOS6

Mobile Phone

Page 8: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 8/43

User-space Zygote 에 Strace 연동시키기

Strace

(Eclair ver 2.1

버전부터 공식 지원 )

ARM Toolchai

n for ARM v6

Android Version (Gingerbread)

*/init.rc 변경전 ) service zygote /system/bin/app_process -Xzygote \/system/bin --zygote --start-system-server

*/init.rc 변경후 )service zygote /system/xbin/strace -tt –o /data/strace.log \/system/bin/app_process –Xzygote \/system/bin –zygote --start-system-server

Strace 유틸리티를 이용하여 Native C/C++ 애플리케이션의 디버깅을 ftrace 와 연동시킬수 있음 . /init.rc 파일내에 zygote 을 실행시 부팅 시 해당 프로세스의 시스템콜 정보들을 strace 유틸리티를 at-taching 하여 살펴볼 수 있음 . 다만 , Strace 는 프로세스 디버깅만 가능하고 , 쓰레드 디버깅은 불가능 .

strace.log* 실행중인 프로세스의 시스템콜 분석 : “#> strace –p <PID>”

Page 9: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 9/43

User-space App VMs 프로세스에 GDB 연동시키기

• 안드로이드 플랫폼의 App VMs 디버깅을 위해 GDB 를 활용 사례

android#> ps –ef | grep appandroid#> gdbserver localhost:<5039> --attach <PID> SL6#> adb forward tcp:<5039> tcp:<5039>SL6#> file out/target/product/generic/symbols/system/bin/app_processSL6 #> prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gdb out/target/product/generic/symbols/system/bin/app_process

(gdb) set solib-absolute-prefix /< 절대경로 >/out/target/product/generic/symbols(gdb) set solib-search-path /< 절대경로 >/out/target/product/generic/symbols/system/lib(gdb) target remote localhost:5039(gdb) break my-app-source.c:815 ( 또는 break my-app-func-name)(gdb) info breakpoints(gdb) continue

쓰레드에 디버깅의 경우 GDB 유틸리티를 이용하여 효과적으로 활용이 가능함 . GDB 의 경우에 안드로이드폰에서 gdbserver 를 실행하고 리눅스 배포판에서 클라이언트로써 접속 ( 원격 접속 ) 을 하여 디버깅을 하기 때문에 소프트웨어의 결함 해결에는 유익함 . 단 , GDB 디버깅 자체의 오버헤드로 인해 성능 최적화를 위해서는 그 한계가 있음 .

5039 Port

App VMsApp VMs

App VMs

n — 다음 명령 , 서브함수 안으로 들어가지 않음 .s — 다음 단계 , 서브함수 안으로 들어감c — 계속 실행b — 브레이크 포인트 설정bt — 콜스택을 보여줌 (백트레이스 )info threads — 실행중인 쓰레드에 대한 정보 열람info breakpoints — 브레이크 포인트되어 있는 정보 열람

server

client

Page 10: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 10/43

Ftrace(Kernel Function Tracer) 란 무엇인가 ?

리눅스 커널의 Tracing을 위한 커널의 디버깅 컴포넌트로써 특정 기간동안 리눅스 커널의 내부 함수 동작을 트레이싱하기위한 목적으로

사용되는 디버깅 피쳐이다.

Java 애플리케이션이 실행되는 동안에 리눅스 커널 내부에서 어떠한

일들이 발생하는지를 OS 비 전문가들도 Ftrace으로 쉽게

분석이 가능하다.

Page 11: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 11/43

Ftrace 의 할수 있는 일들은 무엇인가 ???

Internal kernel trac-

ing

Func-tion

tracing

Event tracing

커널 레벨에서 동작하는 커널 함수들의 Caller/Callee 의 흐름을 원자단위로 분석이 가능하다 . 특히 , 보고 싶은 커널 함수들만을 필터링하여 분석할 수 있어 디버깅으로 인한 오버헤드 비용을 최소화할 수 있다 .

Ftrace( 커널의 디버깅

피쳐 )

Events Tracing

Plugins Tracing

Latency tracing

Stack trac-ing

GCC 의 – pg 메카니즘

Hooking 메카니즘

Page 12: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 12/43

Ftrace 의 동작 원리 (Dynamic function with –pg option)

동적으로 실행 가능한 FTRACE 가 셋팅되어 있는 상태로 커널소스가 컴파일된 후 , 만약 , “Ftrace” 가 disable 되어 있을 때는 시스템은 아무런 오버헤드 없이 실행을 한다 . 이러한 실행은 GCC 에서 제공되는 – pg 스위치에 의해서 만들어 지는 각 커널 함수의 시작점에 mcount 루틴을 통해 동작된다 .

ftrace 는 동일한 코드를 실행하는 다른 CPU 에 대해 염려하지 않고 자유롭게 수정이 될 수 있도록 하기 위해서 , 즉 싱글코어처럼 수행하는 Machine 을 만들기 위해서 kstop_machine (CONFIG_STOP_MACHINE=y , ./include/linux/stop_machine.h) 을 호출한다 .

*참고 ) GCC 의 – pg 옵션이란 ? grpof 분석 프로그램이 프로파일링 정보를 작성할 수 있도록 컴파일을 할 때 원래의 실행 코드에 추가적인 프로파일링 코드를 생성한다 . GCC 의 -pg 프로파일링 옵션은 커널 내에서 호출되는 모든 함수들을 분석하기 위해 ‘mcount’ 함수를 호출하는 기능을 제공하는 임무를 맡는다 .

GCC 컴파일러의 프로파일링 옵션 (-pg) 으로 빌드된 안드로이드 커널을 이용하여 커널내부 함수들을 트레이싱하는 구조로 Ftrace 가 동작된다 .

mcount루틴

nop

평균 10% 의 오버헤드

Page 13: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 13/43

Ftrace 에서 지원되는 Trace 기능들

Ftrace 에서 사용할 수 있는 Tracing 기능들은 리눅스 커널버젼에 따라 소폭 상이하다 . 단 , ‘function’ 기능은 리눅스 2.6.24 + 에서 공통으로 사용 할수 있는 Ftrace 의 핵심 기능이다 .

function: 특정시점 동안의 커널 내부 함수들의 호출 관계를 상세히 보여줌 .

function_graph: 텍스트 기반의 그래프 형식으로 함수관계를 보여줌

wakeup and wakeup_rt : 우선순위가 가장 높은 태스크의 wake up 시간 비용을 분석 가능함 .

irqsoff, preemptoff, preemtirqsoff : 인터럽트가 실행될 수 없는 구역 & 선점될 수 없는 구역의 커널 함수 들을 보여줌

mmiotrace : 메모리 맵의 I/O 에 대한 분석이 가능함 .

sched_switch (Deprecated) : Linux 최근의 버전부터는 wakeup 기능으로 합류됨 .

nop: 디버깅 기능을 enable 하지 않을 때 사용함 .

Wakeup으로 통합됨

android#> cat /sys/kernel/debug/tracing/available_tracers

Linux 3.0.X 부터 제거됨 .

Page 14: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 14/43

debugfs 으로 마운팅된 ftrace 의 / 디렉토리

디버그 파일시스템 (debugfs) 을 이용하여 ftrace 를 마운팅 후 , “ls /sys/kernel/debug/tracing “ 명령을 수행하였을 때 아래와 같은 디렉토리들이 나타나야 한다 .

싱글코어가 아닌 멀티코어인 경우에 per_cpu 디렉토리에 각 CPU별로 사용되는 커널 함수들의 세부 트레이싱이 가능함 .

“#>cat README”명령을 이용하여 일련의 명령을 Re-minder 하는데 활용할 수 있음 . (Mini-Howto)

ftrace 을 on/off 하기 위해 사용되는 파일임 . tracing_enabled 을 사용하지 말것 .

커널의 서브시스템 (예 : Block, Ext4, IRQ, sched, workqueue등 ) 의 이벤트 트레이싱 가능 .

X

O

Page 15: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 15/43

Ftrace 의 환경설정 및 맛보기 데모

android#> mount –t debugfs nodev /sys/kernel/debugandroid#> cd /sys/kernel/debug/tracingandroid#> cat /sys/kernel/debug/tracing/available_tracersandroid#> echo sched_switch > /sys/kernel/debug/tracing/current_tracerandroid#> echo 1 > /sys/kernel/debug/tracing/tracing_onandroid#> sleep 3android#> echo 0 > /sys/kernel/debug/tracing/tracing_onandroid#> cat /sys/kernel/debug/tracing/trace

안드로이드 커널에서 제공하는 Ftrace 을 사용하기 위해서는 제일먼저 , 디버깅 파일시스템 (debugfs) 을 마운트한 후에 트레이싱하려는 ftrace 의 피쳐중의 1 개를 셋팅 후에 아래의 방식으로 사용 가능하다 .

# tracer: sched_switch# TASK-PID CPU# TIMESTAMP FUNCTION# | | | | | sh-2411 [000] 198.826495: 2411:120:S + [000] 2411:120:S sh sh-2411 [000] 198.826890: 2411:120:S ==> [000] 0:120:R <idle> <idle>-0 [000] 198.834405: 0:120:R + [000] 1470:120:R kworker/0:2 <idle>-0 [000] 198.834458: 0:120:R ==> [000] 1470:120:R kworker/0:2 kworker/0:2-1470 [000] 198.834555: 1470:120:R + [000] 2411:120:R sh kworker/0:2-1470 [000] 198.834603: 1470:120:S ==> [000] 2411:120:R sh sh-2411 [000] 198.835649: 2411:120:S ==> [000] 0:120:R <idle> <idle>-0 [000] 199.019411: 0:120:R + [000] 1470:120:R kworker/0:2 <idle>-0 [000] 199.019472: 0:120:R + [000] 11:120:R kworker/u:1 <idle>-0 [000] 199.019606: 0:120:R ==> [000] 1470:120:R kworker/0:2 kworker/0:2-1470 [000] 199.019762: 1470:120:S ==> [000] 11:120:R kworker/u:1 kworker/u:1-11 [000] 199.020131: 11:120:R + [000] 2477:120:R kworker/u:5 kworker/u:1-11 [000] 199.020300: 11:120:S ==> [000] 2477:120:R kworker/u:5 . . . . 아래 생 략 . . . .

Page 16: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 16/43

필요한 커널함수만 분석 방법 1/2 set_ftrace_filter 을 이용하여 , 사용자 애플리케이션의 실행기간 동안에 수행되는 특정 커널 함수만의 tracing 을 분석할 수 있다 . 이를 통해서 우리는 디버깅으로 인한 오버헤드를 상당부분 절약할 수 있다 .

android#> echo schedule > set_ftrace_filter android#> cat set_ftrace_filterscheduleandroid#> echo function > current_tracer android#> cat trace | head -15# tracer: function## TASK-PID CPU# TIMESTAMP FUNCTION# | | | | | app-1849 [001] 883.657737: schedule <-schedule_hrtimeout_range <idle>-0 [001] 883.658534: schedule <-cpu_idle app-1849 [001] 883.658612: schedule <-__cond_resched kondemand/1-1239 [001] 883.658632: schedule <-worker_thread app-1849 [001] 883.659384: schedule <-sysret_careful app-1849 [001] 883.659479: schedule <-schedule_hrtimeout_range app-2112 [001] 883.660053: schedule <-schedule_hrtimeout_range app-1849 [001] 883.660281: schedule <-schedule_hrtimeout_range app-1849 [001] 883.660293: schedule <-schedule_hrtimeout_range app-2112 [001] 883.660409: schedule <-schedule_hrtimeout_range app-1849 [001] 883.660458: schedule <-sysret_careful

주어진 기간동안의 scheduler**커널함수들의 호출관계들

Page 17: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 17/43

필요한 커널함수만 분석 방법 2/2 “>>” 및 “ *” 를 이용하여 디버깅하기 위한 커널함수의 필터링을 효과적으로 활용이 가능하다 .

android#> echo schedule_tail >> set_ftrace_filter android#> cat set_ftrace_filterschedule_tailscheduleandroid#> echo 'sched*' > set_ftrace_filterandroid#> cat set_ftrace_filter | head -10sched_avg_updatesched_group_sharessched_group_rt_runtimesched_group_rt_periodsched_slicesched_rt_can_attachsched_feat_opensched_debug_open

이와 반대로 , 특정 커널 함수들만 출력하지 않고자 할 경우에는 “ set_ftrace_notrace” 을 이용하면 된다 .

android#> echo '*lock*' > set_ftrace_notrace android#> cat set_ftrace_notrace | head -10pte_unlockalternatives_smp_unlockuser_enable_block_step__acpi_release_global_lock__acpi_acquire_global_lock

오직 schedule 으로 시작되는 함수들

모든 커널 함수들

필터기

( 오버헤드를 줄이자 !!!)

Page 18: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 18/43

문맥교환 스케쥴링 분석하기

플러그인 중에 “ sched_switch” 을 활성화하면 , 사용자 애플리케이션을 실행하는 동안에 커널에서 얼마나 많은 문맥교환 (= 작업스위칭 ) 이 발생하는지를 시야로 파악이 가능하다 .

android#> echo sched_switch > current_tracer android#> cat trace | head -20# tracer: sched_switch## TASK-PID CPU# TIMESTAMP FUNCTION# | | | | | app-3002 [000] 484.062117: 3002:120:S + [000] 3002:120:S app app-3002 [000] 484.062138: 3002:120:S + [000] 3002:120:S app app-3002 [000] 484.062258: 3002:120:S + [000] 3002:120:S app app-3002 [000] 484.062267: 3002:120:S ==> [000] 0:140:R <idle> <idle>-0 [000] 484.062770: 0:140:R + [000] 9:120:R events/0 <idle>-0 [000] 484.062775: 0:140:R ==> [000] 9:120:R events/0 events/0-9 [000] 484.062780: 9:120:R + [001] 2112:120:R app events/0-9 [000] 484.062791: 9:120:S ==> [000] 0:140:R <idle> app-1849 [001] 484.063096: 1849:120:R ==> [001] 2112:120:R app app-2112 [001] 484.063155: 2112:120:S ==> [001] 1849:120:R app app-1849 [001] 484.063552: 1849:120:R + [001] 2112:120:R app app-1849 [001] 484.063557: 1849:120:R ==> [001] 2112:120:R app app-2112 [001] 484.063564: 2112:120:S ==> [001] 1849:120:R app app-1849 [001] 484.064117: 1849:120:R + [001] 2112:120:R app app-1849 [001] 484.064122: 1849:120:R ==> [001] 2112:120:R app app-2112 [001] 484.064130: 2112:120:S ==> [001] 1849:120:R app

App-3002 App-1849 App-2112

Context Switching

Page 19: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 19/43

Latency 트레이싱 하기 Ftrace 에서는 현재 wakeup , wakeup_rt , irqsoff , preemptoff, preemptirqsoff 등의 Latency 을 분석할수 있는 플러그인을 제공한다 . 이 구간이 길수록 사용자 App 의 응답속도가 느려지는것과 연관이 있을 수 있다 .

android#> echo irqsoff > current_tracer android#> cat trace# tracer: irqsoff# irqsoff latency trace v1.2 on 2.6.35.7# --------------------------------------------------------------------# latency: 366 us, #82/82, CPU#1 | (M:desktop VP:0, KP:0, SP:0 HP:0 #P:2)# | task: -13867 (uid:500 nice:0 policy:0 rt_prio:0)# => started at: save_args# => ended at: call_softirq## _------=> CPU# # / _-----=> irqs-off # | / _----=> need-resched # || / _---=> hardirq/softirq # ||| / _--=> preempt-depth # |||| /_--=> lock-depth # |||||/ delay # cmd pid |||||| time | caller # \ / |||||| \ | / app-13867 1d.... 0us : trace_hardirqs_off_thunk <-save_args app-13867 1d.... 0us : smp_apic_timer_interrupt <-apic_timer_interrupt app-13867 1d.... 1us : apic_write <-smp_apic_timer_interrupt app-13867 1d.... 1us : native_apic_mem_write <-apic_write app-13867 1d.... 1us : exit_idle <-smp_apic_timer_interrupt app-13867 1d.... 2us : irq_enter <-smp_apic_timer_interrupt [ . . . . . . . . ]

비선점구간

인터럽트 비동작구간

준비

대기실행

Disable

Enable

Enable

Disable

Wake-up

Dispatch

Page 20: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 20/43

커널함수 실행을 그래프 형태로 출력하기

“function_graph” 을 이용하여 함수호출의 Depth 관계를 좀더 쉽게 파악이 가능하다 .

android#> echo function_graph > current_tracer android#> cat trace | head -20# tracer: function_graph## CPU DURATION FUNCTION CALLS# | | | | | | | 1) | down_read_trylock() { 1) 0.487 us | _spin_lock_irqsave(); 1) 0.409 us | _spin_unlock_irqrestore(); 1) 2.519 us | } 1) 0.420 us | __might_sleep(); 1) 0.415 us | _cond_resched(); 1) 0.415 us | find_vma(); 1) | handle_mm_fault() { 1) 0.421 us | pud_alloc(); 1) 0.409 us | pmd_alloc(); 1) | __do_fault() { 1) | filemap_fault() { 1) | find_get_page() { 1) 0.571 us | page_cache_get_speculative(); 1) 1.630 us | } 1) | lock_page() {

Page 21: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 21/43

이벤트 트레이서 (Event Tracer) 활용하기 “events” 를 이용하여 커널의 서브시스템 (예 : Block, Ext4, IRQ, sched, workqueue 등 ) 의 분석에 활용할 수 있다 . “/sys/kernel/debug/tracing/set_event” 는 enable된 모든 이벤트들을 보여준다 . “available_events” 는 사용가능한 기능들을 보여준다 . 간단히 “#> echo 1 > ./events/sched/enable” 을 통해 설정이 가능하다 .

android#> ls eventsblock ext4 header_event irq kmem kvmmmu sched syscallsenable ftrace header_page jbd2 kvm module skb workqueueandroid#> ls events/sched/enable sched_process_exit sched_stat_iowait sched_wakeupfilter sched_process_fork sched_stat_sleep sched_wakeup_newsched_kthread_stop sched_process_free sched_stat_waitsched_kthread_stop_ret sched_process_wait sched_switchsched_migrate_task sched_signal_send sched_wait_task

android#> echo 1 > events/sched/enable android#> cat set_event sched:sched_kthread_stopsched:sched_kthread_stop_retsched:sched_wakeup. . . 아 래 생 략 . . . android#> cat trace | head -10# tracer: nop# TASK-PID CPU# TIMESTAMP FUNCTION# | | | | | events/0-9 [000] 638.042792: sched_switch: task events/0:9 [120] (S) ==> kondemand/0:1305 [120] kondemand/0-1305 [000] 638.042796: sched_stat_wait: task: restorecond:1395 wait: 15023 [ns] kondemand/0-1305 [000] 638.042797: sched_switch: task kondemand/0:1305 [120] (S) ==> restorecond:1395 [120] restorecond-1395 [000] 638.051758: sched_stat_wait: task: restorecond:1395 wait: 0 [ns] restorecond-1395 [000] 638.052758: sched_stat_sleep: task: kondemand/0:1305 sleep: 9966692 [ns] restorecond-1395 [000] 638.052760: sched_wakeup: task kondemand/0:1305 [120] success=1 [000]

subsystem:event-name

Page 22: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 22/43

Plugins VS. Events사용방법 (Enable/Disable 방법 )

• Plugins: "current_tracer” 을 이용하여 Enable/Disable 가능하다 . 셋팅되어 있는 플러그인의 열람은 “#> cat current_tracer”

• Events: “event” 디렉토리의 enable 파일을 이용하여 Enable/Disable 가능하다 . 셋팅되어 있는 이벤트의 열람은 “#>cat set_events” 을 통해 가능하다 .

사용 가능한 ftrace 기능들의 조회 방법

• Plugins: #> cat /sys/kernel/debug/tracing/available_tracers• Events: #> cat /sys/kernel/debug/tracing/available_events

참고 : 한번에 하나의 Plugin 또는 Event 만 사용 할 수 있다 .

Page 23: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 23/43

세션 2 : 목 차 • Ftrace 이론편 for Platform

Developers (40 분 )1. Introduction & Overview 멀티코어 지원을 위한 안드로이드 커널

기능들 User-space Zygote 에 Strace 연동시키기 User-space App VMs 프로세스에 GDB

연동시키기 Ftrace 란 무엇인가 ? Ftrace 로 할 수 있는 일들은 무엇인가? Ftrace 의 환경설정 및 맛보기 데모

2. Understanding Ftrace Ftrace 의 동작원리 (Dynamic function

with –pg option) Ftrace 에서 지원되는 Trace 기능들 필요한 커널함수만 분석 방법 문맥교환 스케쥴링 분석하기 커널함수 실행을 그래프 형태로 출력하기 이벤트 트레이서 (Event Tracer) 활용하기 Plugins VS. Events

• Ftrace 활용편 for App Developers (40분 )1. Trace-cmd (CLI Utility ) 리눅스 커널 비전문가를 위한 툴들 (trace-cmd/kernel-shark) 애플리케이션 개발자를 위한 trace-cmd ARM 용 Trace-cmd/Kernelshark 소스 컴파일 하기 Trace-cmd 실행파일이 필요로 하는 라이브러리 Trace-cmd 명령 실행 방법 Trace-cmd 으로 특정 CPU 의 함수 프로파일링 하기 인트럽트 Off 영역의 디버깅 방법 스케쥴링 Latency 의 디버깅하기2. Kernelshark (GUI Utility) GUI 기반 로그파일 분석 유틸리티 - KernelShark KernelShark 의 그래프 정보 영역 마크 Kernelshark 으로 로그파일 분석하기 Study: Ftrace 을 이용하여 Contacts 의 성능 저하 분석

• References• Conclusion• Q&A

Page 24: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 24/43

trace-cmd: A front–end for Ftrace (CLI) kernel-shark (GUI)

리눅스 커널 비전문가를 위한 툴들 (trace-cmd, kernel-shark)안드로이드 커널의 Ftrace 을 이용하여 커널 내부를 트레이싱하기 위해서 , echo

명령만으로 트레이싱을 하는 것이 불편하고 어렵기 때문에 trace-cmd 와 kernel-shark 을 활용하는 것을 권장함 .

콘솔모드에서 일일이 많은 명령들을 입력해야 하는 불편함 해소 많은 명령들을 외우다시피 하면서 이용해야 되는 사용성 문제 해결

OS 의 내부동작을 쉽게 분석 및 해석 애플리케이션의 최적화를 이끌어냄 제품 경쟁력 & 차별화

• git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git

• http://git.kernel.org/?p=linux/kernel/git/rostedt/trace-cmd.git

adb명령을 이용하여 개발보드에 접속한 후 , 많은 내용을 외워야 하는 불편함을 해소해줌 . 명령의 체계는 코드 변경관리 소프트웨어인 git 와 유사함 .

trace-cmd 명령으로 수집된 tracing log 파일을 그래픽으로 쉽게 분석할 수 있게 함으로써 로그 내용들 비쥬얼하게 이해할 수 있음 .

Page 25: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 25/43

애플리케이션 개발자를 위한 trace-cmd

android#> mount -t debugfs nodev /sys/kernel/debugandroid#> cd /sys/kernel/debug/tracingandroid#> echo function ./current_tracerandroid#> echo 1 > tracing_onandroid#> ls /system/android#> echo 0 > tracing_on

trace-cmd 는 커널의 ftrace 을 위한 사용자 공간의 콘솔기반 명령 인터페이스이다 . debugfs 을 직접 사용해야 하는 번거러움 없이 , 오직 trace-cmd 명령만으로 쉽고 간단히 사용이 가능하다 .

android#>/sdcard/trace-cmd record -p function ls /system

trace-cmd

사용시

trace-cmd

미사용시

Page 26: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 26/43

ARM 용 Trace-cmd/Kernelshark 소스 컴파일 하기 1/2

trace-cmd 소스 및 툴체인 준비하기

• SL6#> firefox http://www.kandroid.org/board/board.php?board=toolchain&command=body&no=15 [cortex-A9]멀티코어향 칸드로이드 크로스 툴체인(v2.1-20110815) or CodeSourcery Lite arm-gnueabi-2010q1 다운로드

• SL6#> git clone git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git• SL6#> cd ./trace-cmd• SL6#> yum -y install swig gtk+ libgtk+• SL6#> vi ./Makefile static 빌드옵션을 추가하세요 . 파이썬 관련 문자들은 주석 처리하세요.

*SWIG(Simplified Wrapper and Interface Generator ; http://swig.sourceforge.net): 높은 수준의 프로그래밍 언어로써 , C/C++/Objective C 프로그램들을 연결하기 위한 소프트웨어 개발툴이다 . SWIG 는 주로 펄 , 파이썬 , Tcl/TK 등의 언어에서 사용이 된다 . 또한 , SWIG 는 JAVA, Eiffel, Guile 으로 확장될 수 있도록 지원한다 . 일반적으로 GUI 사용자 인터페이스를 위한 툴 , 시스템 통합 , 높은 수준은 통합된 프로그래밍 환경을 생성하는데 많이 사용된다 .

Cortex-A9 코어 계열의 개발보드를 사용시에 Code-Sourcery 또는 kandroid 툴체인을 다운로드 후 static 으로 trace-cmd 을 소스 컴파일을 할것을 권장한다 .

Page 27: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 27/43

ARM 용 Trace-cmd/Kernelshark 소스 컴파일 하기 2/2

Trace-cmd 소스 컴파일하기

• SL6#> make -j4 \• CC=/usr/local/arm-kanroid-20110815/bin/arm-none-linux-gnueabi-gcc \• AR=/usr/local/arm-kanroid-20110815/bin/arm-none-linux-gnueabi-ar \• RANLIB=/usr/local/arm-kanroid-20110815/bin/arm-none-linux-gnueabi-ranlib \• LD=/usr/local/arm-kanroid-20110815/bin/arm-none-linux-gnueabi-ld • SL6#> make install• SL6#> file ./trace-cmd• ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.28, not stripped

Kernelshark 소스 컴파일하기

• SL6#> make gui ; make install_gui• SL6#> file ./kernelshark

/usr/local/bin/kernelshark: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

이제 make 명령을 이용하여 ARM 아키텍쳐에서 실행가능한 바이너리 파일을 만들어야 한다 . 정상적으로 컴파일이 되면 , trace-cmd 및 Kernelshark 라는 바이너리 실행 파일을 얻을수 있다 .

* 팁 ) 바이너리 파일 다운로드 (trace-cmd, strace, ltrace) - http://code.google.com/p/android-group-korea/downloads/list

Page 28: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 28/43

Trace-cmd 실행파일이 필요로 하는 라이브러리

X86 데스크탑 컴퓨터환경에서 trace-cmd(CLI 유틸리티 ) 및 Kernelshark(GUI 유틸리티 ) 실행파일을 만들기 위해서는 아래와 같은 의존성 공유 라이브러리들이 미리 준비되어 있어야 한다 .

X86 용 ELF 바이너리

ARM 용 ELF 바이너리

Page 29: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 29/43

Trace-cmd 리스트

trace-cmd list –o

trace-cmd list –p

trace-cmd list –e

사용가능한 trace 옵션들을 모두 보여준다 . 옵션들은 “ trace-cmd record –O 옵션”에 의해 사용된다 .

사용가능한 플러그인들을 모두 보여준다 .

사용가능한 이벤트들을 모두 보여준다 .

Page 30: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 30/43

Trace-cmd 명령 실행 방법

임베디드 개발보드를 사용하는 임베디드 개발자들의 경우 개발보드의 CPU/MEM/HDD 의 자원이 여유롭지 않다 . 따라서 , TCP/IP 방식의 통신방법으로 트레이싱을 하는 것이 종종 효율적이다 .

※ Case study: start/end/(extract)/report SL6#> trace-cmd start -e all SL6#> trace-cmd stop SL6#> trace-cmd extract -o output.dat ( 출력되는 로그파일명을 – o 옵션으로 지정할 수 있다 . ) SL6#> trace-cmd report -i output.dat | head -15 ( -i 옵션을 명시하지 않을 경우 , 기본값으로 trace.dat 파일을 읽는다 . )

※ 로컬 PC 및 임베디드 개발보드에서 직접 실행 방법 SL6#> trace-cmd record -e sched ls -ltr /usr > /dev/null

※ 임베디드 개발 보드에서 TCP 서버 & 클라이언트 실행 방법 android#> trace-cmd listen -p 5678 -d SL6#> trace-cmd record –N 10.88.200.125:5678 -e all

Android Kernel

ftrace.log

ftrace.log

Android Kernel

Page 31: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 31/43

version = 1.1.0cpus=4236149.191544 | 1) trace-cmd-11120 | 6.295 us | fget_light();236149.191544 | 0) trace-cmd-11112 | 6.370 us | inotify_inode_queue_event();236149.191544 | 2) trace-cmd-11118 | 6.230 us | fget_light();236149.191545 | 3) trace-cmd-11117 | | check_preempt_wakeup() {236149.191548 | 3) trace-cmd-11117 | 1.061 us | update_curr();236149.191550 | 1) trace-cmd-11120 | | do_splice_to() {236149.191550 | 2) trace-cmd-11118 | | do_splice_to() {236149.191551 | 0) trace-cmd-11112 | 1.098 us | __fsnotify_parent();236149.191551 | 3) trace-cmd-11117 | 0.959 us | wakeup_preempt_entity();236149.191551 | 1) trace-cmd-11120 | | rw_verify_area() {236149.191552 | 2) trace-cmd-11118 | | rw_verify_area() {236149.191552 | 1) trace-cmd-11120 | | security_file_permission() {236149.191552 | 3) trace-cmd-11117 | 0.831 us | resched_task();

Trace-cmd 으로 특정 CPU 의 함수 프로파일링 하기 1/2

android#> ./trace-cmd list -psyscall blk kmemtrace power function_graph mmiotrace wakeup_rt wakeup preemptirqsoff preemptoff irqsoff function sched_switch initcall nopandroid#>android#> ./trace-cmd record -p sched_switch ls /binandroid#> ./trace-cmd record -p function_graph ls /binandroid#> ./trace-cmd report

trace-cmd 명령을 이용하여 ftrace 의 수많은 기능들을 암기하지 않고 편리하게 tracing 이 가능하다 . 아래처럼 "#> trace-cmd list -p" 를 통해 현재 사용 가능한 플러그인들을 열람할 수 있다 .

Quad Core

Page 32: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 32/43

Trace-cmd 으로 특정 CPU 의 함수 프로파일링 하기 2/2

android#> ./trace-cmd report --cpu 0version = 1.1.0cpus=4236149.191544 | 0) trace-cmd-11112 | 6.370 us | inotify_inode_queue_event();236149.191551 | 0) trace-cmd-11112 | 1.098 us | __fsnotify_parent();236149.191553 | 0) trace-cmd-11112 | 0.946 us | inotify_dentry_parent_queue_event();236149.191555 | 0) trace-cmd-11112 | 1.138 us | fsnotify();236149.191558 | 0) trace-cmd-11112 | | sys_close() {236149.191558 | 0) trace-cmd-11112 | 0.963 us | _spin_lock();236149.191560 | 0) trace-cmd-11112 | 0.973 us | _spin_unlock();236149.191562 | 0) trace-cmd-11112 | | filp_close() {236149.191563 | 0) trace-cmd-11112 | 0.869 us | dnotify_flush();236149.191565 | 0) trace-cmd-11112 | 0.991 us | locks_remove_posix();236149.191567 | 0) trace-cmd-11112 | | fput() {236149.191568 | 0) trace-cmd-11112 | | __fput() {

cpu0 cpu1 cpu2 cpu3

멀티코어 환경의 경우 특정 CPU 에 대한 정보만 분석하고자 할경우 "--cpu" 옵션을 이용하여 멀티코어환경 디버깅에 대응이 가능하다 .

Page 33: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 33/43

# irqsoff latency trace v1.1.5 on 2.6.35# -----------------------------------------------------------# latency: 48 us, #3/3, CPU#1 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:4)# -----------------# | task: swapper-0 (uid:0 nice:0 policy:0 rt_prio:0)# -----------------## _------=> CPU# # / _-----=> irqs-off # | / _----=> need-resched # || / _---=> hardirq/softirq # ||| / _--=> preempt-depth # |||| / # ||||| delay # cmd pid ||||| time | caller # \ / ||||| \ | / <idle>-0 1dN.1 38us+: tick_nohz_restart_sched_tick <-cpu_idle <idle>-0 1dN.1 48us : tick_nohz_restart_sched_tick <-cpu_idle <idle>-0 1dN.1 49us : trace_hardirqs_on <-cpu_idle

인트럽트 Off 영역의 디버깅 방법

android#> ./trace-cmd record -p irqsoff -d ls /system/ android#> ./trace-cmd report

인트럽트가 disable 되는 구간에 대해 디버깅을 하고자 할 경우 , record 와 report 라는 Sub명령을 이용할 수 있다 . 인트럽트 구간이 길수록 성능이슈의 지점일 될 가능성이 높다 .

인터럽트 비동작구간 Enable

Disable

Page 34: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 34/43

version = 0.5cpus=4 app-11038 [003] 235806.528155: sched_wakeup: task :12 [0] success=1 app-11038 [000] 235806.532473: sched_wakeup: task :10953 [120] success=1 app-10953 [000] 235806.532515: sched_wakeup: task :11038 [120] success=0 trace-cmd-11035 [000] 235806.536280: sched_wakeup: task :10809 [120] success=1 trace-cmd-11037 [001] 235806.541029: sched_wakeup: task :2854 [120] success=1 trace-cmd-11034 [003] 235806.545892: sched_wakeup: task :1 [120] success=1 trace-cmd-11037 [001] 235806.546569: sched_wakeup: task :30521 [120] success=1 app-11038 [002] 235806.565837: sched_wakeup: task :10953 [120] success=1 app-10953 [000] 235806.565950: sched_wakeup: task :11038 [120] success=0 app-10953 [000] 235806.566039: sched_wakeup: task :11038 [120] success=0

스케쥴링 Latency 의 디버깅하기

android#> ./trace-cmd record -e sched_wakeup ls /systemandroid#> ./trace-cmd report

특정 시간 동안의 OS 스케쥴링 Latency 를 Tracing 하고자 할 경우에는 "-e sched_wakeup" 이라는 이벤트 옵션을 활용하여 분석이 가능하다 ..

Caller CPU 소요시간 프로세스 스케쥴링우선순위커널 함수

Page 35: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 35/43

GUI 기반 로그파일 분석 유틸리티 - Ker-nelShark

KernelShark 는 trace-cmd 명령으로 생성한 trace.dat 파일을 그래픽컬하게 분석하기 위한 GTK/Python 기반의 GUI 분석기이다 . Raw Data 로 저장된 로그파일 정보는 가독성이 떨어지기 때문에 , 이 툴을 이용하면 그래픽 뷰 , 리스트뷰 , 손쉬운 필터링 조작을 할 수 있다 .

멀티코어에 대한 디버깅을 지원한다 . 특정 CPU 의 디버깅이 필요한경우 해당 CPU 을 체크하면 된다 .

Page 36: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 36/43

Kernelshark 의 그래프 정보 영역 마크 1/3• Time Stamps

– Pointer: 마우스가 위치한 정보– Cursor: 더블클릭시의 정보– Marker A : 왼쪽 마우스 클릭시의 정보– Marker B : Shift 으로 왼쪽 마우스 클릭시의 정보– Delta : Mark A 와 Mark B 사이의 정보

• Plot Title

• List Area

• Plot Area

• Graph Plots– CPU Plots: 해당 CPU에 실행중인 태스크 정보를 나타냄 . – Task Plots: 태스크들이 실행하기 위해 사용하는 CPU 정보들을 나타냄 (녹색:

wakeUP Latency , 빨간색 네모 : Preempt Latency)

Page 37: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 37/43

Kernelshark 의 그래프 정보 영역 마크 2/3• Zooming In/Out

– Zooming In: 왼쪽 마우스 클릭후 오른쪽으로 드래그– Zooming Out: 왼쪽 마우스 클릭후 좌측으로 드래그

• Event Info 툴팁

• 출력하기 위한 태스크 리스트 선택

• Search 리스트

Page 38: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 38/43

Kernelshark 의 그래프 정보 영역 마크 3/3• Filtering

– Filter out tasks– Filter in tasks– Filter events– Filter events based on content

• Event Filter

Page 39: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 39/43

Kernelshark 으로 로그파일 분석하기*Kernelshark 의 간단한 사용예 : 이것은 쓰레드 7 을 블록킹 시켰던 쓰레드 1 (migrate-21406) 을 실행하였었던 CPU3번에서 가장 높은 우선순위의 쓰레드(migrate-21412) 가 깨워지는 것을 보여준다 . 이때 , CPU 2 는 가장 낮은 우선순위의 쓰레드 실행인 쓰레드 0 (migrate-21405) 이 실행되어졌었다 . 여기서 우리는 태스크들이 깨워지고 , 실제로 스케쥴링하기 전까지의 지연 시간을 의미하는 빈 녹색의 네모 박스를 관찰할 수 있다 .

CPU3 CPU2

Page 40: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 40/43

Study: Ftrace 으로 Contacts 의 성능 저하 분석

USER PID PPID VSIZE RSS WCHAN PC NAMEsystem 1405 1312 344920 39724 ffffffff afd0dbdc S system_serverapp_2 1484 1312 230856 72064 ffffffff afd0eb98 S com.lgs.android.hime

소스위치 : ./packages/inputmethods/OpenWnn/src/jp/co/omronsoft/openwnn/OpenWnn.java ./packages/inputmethods/PinyinIME/src/com/android/inputmethod/pinyin/PinyinIME.java

소스위치 : ./Packages/Apps/Mms/Src/Com/Android/Mms/Ui/ConversationList.java

01-13 16:14:19.725 I/ContactsProvider( 1527): Query Uri match >> 1009 Uri >> content://com.android.contacts/contacts/235/photo01-13 16:14:19.725 E/ContactsProvider( 1527): SELECT data15 FROM view_data data WHERE (1 AND contact_id=? AND _id=photo_id)01-13 16:14:19.775 I/#XXIME ( 1484:com.lge.android.hime:/system/app/HIME.apk ): ### onStartInput01-13 16:14:22.895 I/ActivityManager( 1405:system_server): Displayed activity com.android.mms(30553)/.ui.ConversationList: 3905 ms (total 3905 ms)01-13 16:14:30.645 D/StatusBarPolicy( 1405:system_server): updateSignalStrength:false, mTotal[0]:1, mTotal[1]:11, mTo -tal[2]:8, mTotal[3]:5, mTotal[4]:2, mTotal[5]:0, mTotal[6]:13, mTotal[7]:10, mTotal[8]:7, mTotal[9]:4, mTotal[10]:0, mTotal[11]:13, mTotal[12]:10, mTotal[13]:7, mTotal[14]:5, mTotal[15]:0, mTotal[16]:13, mTotal[17]:10, mTotal[18]:7, mTotal[19]:501-13 16:14:30.645 D/StatusBarPolicy( 1405): prop get activeband is WCDMA01-13 16:14:30.645 D/StatusBarPolicy( 1405): prop front WCDMA01-13 16:14:30.645 D/StatusBarPolicy( 1405): propcompare front WCDMA

A.* MMS → 입력방법 → “ XX 입력기”가 아닌 구글의 표준“한글키보드”선택 또는 /system/app/HIME.apk 제거

* /system/app/HIME.apk (1484) <---- 11 threads

* systemserver (1405) <---- 66 threads

* 시스템 로그 데이터의 내용

* 프로세스별 정보 내역

Mission: 1405/1484 프로세스를

커널이 어떻게 처리하는지

커널 트레이싱을 즐겨보세요 .!!!

Thread.wait() or Thread.sleep()

Page 41: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 41/43

References

Ftrace (Function Tracer), by Steven Rostedt , Linux Kernel Documentation, ./Linux-3.X/Documentation/trace/ftrace.txt

A look at ftrace , by Jake Edge, http://lwn.net/Articles/322666/

Ftrace(The Linux kernel internal tracer), http://elinux.org/Ftrace

RHEL Developer Guide, http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Developer_Guide/ftrace.html

Installing and Using Ftrace, OMAPpedia, http://www.omappedia.org/wiki/Installing_and_Using_Ftrace

KFT, Kernel Function Trace (with -finstrument-functions capability of GCC), http://elinux.org/Kernel_Function_Trace

Kernel Tracepoints(Linux 2.6.24) and Markers (Linux 2.6.28-rc1), Mathieu Desnoyers [email protected], Hooking mechanisms providing static instrumentation that can be enabled at runtime dynamically, Documentation/trace/tracepoints.txt

Page 42: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 42/43

Conclusion자체적으로 개발하려는 디버깅툴이 절대적으로 월등할 수만 없으므로 [ 인건비 / 개발기간 ], 제품에 탑재된 안드로이드의 디버깅 및 최적화를 위해 이미 개발되어 있는 오픈소스 S/W 기술들을 충분히 활용하는 것이 더 유익할 수 있다 .

ftrace/strace/gdb 를 이용하여 안드로이드 전체 레이어중에 인간의 두뇌로 표현될 수 있는 Linux Kernel 과 성능의 이슈가 되는 System/Functional Li-brary 레이어를 상세하게 디버깅 함으로써 제품 최적화 달성이 가능하다 .

차별화된 제품 경쟁력을 위해 멀티코어향 임베디드 상용제품이 개발되려면 진입 장벽이 높은 리눅스 커널의 in-Depth 기술지식을 이해 / 확보해야만 한다 . ( 예 : MM/ASH-MEM/Binder/PM , SMP Scheduler, Synchronization, SMP Memory Barrier, Affinity, CPU isolation, Cgroups … )구분 Echo 명령 (Console) Trace-cmd 명령 (CLI) Kernelshark 명령 (GUI)

장점 어느 디바이스에서나 즉각 디버깅이 가능함

APP 개발자도 ftrace 를 활용하여 커널 분석 가능 .

GUI 인터페이스로 특별한 지식이 없이도 디버깅된 로그의 분석이 쉬움

단점 Kernel 지식 및 Ftrace 지식이 깊게 필요함

텍스트기반 출력로그 분석이 어려움

디버깅을 위한 로그 수집기능은 지원되지 않음 .

Page 43: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 43/43

Q & A

Any Ques-tions?

- 문의기간 : 2011년 10월 17 일 ~ 10월 30 일- 이 메 일 : [email protected] - 메일제목 : 8kandroid: ***

공유되기 곤란한 내용의 질의 회사 보안성 성질의 질의 개인적인 기술이슈 성격의 질의 1 대 1 소통 / 토의가 필요한 질의

Page 44: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 44/43

Thank You.

Page 45: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 45/43

# 부 록

부록

Page 46: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 46/43

# 부록 : 디버깅을 위한 개발 PC 환경

Android 플랫폼을 쉽고 빠르게 개발목적으로 사용하기 위해서 공식적으로 지원하는 우분투의 LTS버젼 (8.04, 10.04) 이 가장 이상적임 . 윈도우 사용자의 경우 Cygwin 을 활용하는 것이 용이함 . 또는 VirtualBox , Vmware같은 가상화 소프트웨어를 이용하는 것도 괜찮음 . 디버깅이 기술경험이 필요한 경우에는 상용 RHEL6 를 사용하는 것이 관련 기술 습득에 시간적인 면에서 유익함 .

RHEL6

Linux 3.0.3

GCC 4.4.4JAVA 1.6.0..23

Android (

Gingerbread)

• http://ftp.redhat.com/pub/redhat/rhel/beta/6/i386/iso/RHEL6.0-20100414.0-AP-i386-DVD1.iso

• http://ftp.daum.net/centos/6/isos/i386/CentOS-6.0-i386-bin-DVD.iso

• Linux RHEL6 2.6.32-71.14.1.el6.i686 #1 SMP• Mainline Linux Kernel 3.0.3 (http://www.kernel.org)

• GCC 3.4.6 20060404 (Red Hat 3.4.6-13)• GCC 4.4.4 20100726 (Red Hat 4.4.4-13)

• Java(TM) 2 Runtime Environment Standard Edition (build 1.6.0_23) • http://java.sun.com/javase/downloads/previous.jsp - jdk-1_6_0_23-linux-i586.bin

• Android Ver 2.3.4• Android SDK (android-sdk_r13-linux_x86.tgz )

부록

Page 47: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 47/43

# 부록 : 디버깅을 위해 루팅하기 ( 방법 1)

1. 안드로이드폰의 설정 절차 .Setting – Application – Development – USB Debugging - [V]Connect USB De-bugging .Connect ADB cable between PC and Phone Check Debug mode

2. Ncurse/stdc++ libraries(for ADB), Mono(for *.exe), Winforms(for Mono) 설치하기rh6#> yum install -y compat-libstdc++* mono* (U104#>apt-get install -y lib32ncurses5 lib32stdc++ mono libmono-winforms2.0-cil )rh6#> unzip SuperOneClickv1.9.1-ShortFuse.Drivers.rar rh6#> ./adb devicesList of devices attached K_ANDROID_KO9319 devicerh6#> sudo mono SuperOneClick.exe --> Click “root” menu

3. 이제 디버깅 및 성능 최적화를 위해 root권한을 이용하자 .!!! - ADB: 리눅스 배포판에서 “ adb shell” 명령을 실행하도록 한다 . - Phone: 폰에서 “ Super user” ( 또는 root explorer 또는 z4root ) 소프트웨어를 실행한다 .

AdbWinApi.dllAdbWinUsbApi.dllSuperOneClick.exeSuperuser.apkadb.exeadblinuxadbmacbusyboxrageagainstthecagesqlite3su

*SuperOneClick.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit Mono/.Net assembly

Ftrace 을 이용하기 위해서는 root권한이 필요하기 때문에 , 안드로이드폰 또는 개발보드를 루팅되어 있는 상태로 작업해놓아야 함 .

부록

Page 48: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 48/43

# 부록 : 디버깅을 위해 루팅하기 ( 방법 2)

rh6#> ./adb push rageagainstthecage /data/local/tmp/rageagainstthecagerh6#> ./adb shellandroid$> cd /data/local/tmpandroid$> chmod 4755 rageagainstthecageandroid$> ./rageagainstthecage

rh6#> ./adb shell mount -o remount,rw -t yaffs2 /dev/block/stl9 /system

rh6#> ./adb push su /system/binrh6#> ./adb push Superuser.apk /system/apprh6#> ./adb shell chmod 4755 /system/bin/su

rh6#> ./adb shell rm /data/local/tmp/rageagainstthecagerh6#> ./adb reboot

안드로이드 마켓에서 “ Terminal Emulator” SW 를 다운로드 및 실행 android$> suandroid#> id

부록

Page 49: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 49/43

# 부록 : 개발보드의 콘솔 이용을 위해 ADB연결

rh6#> vi /etc/udev/rules.d/99-android.rules SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8", SYMLINK+="android_adb",MODE="0666"SUBSYSTEM=="usb", ATTRS{idVendor}=="1004", SYMLINK+="android_adb",MODE="0666"

usb 2-4: new high speed USB device using ehci_hcd and address 10usb 2-4: New USB device found, idVendor=04e8, idProd-uct=618eusb 2-4: New USB device strings: Mfr=1, Product=2, Serial-Number=3usb 2-4: Product: KO Android USB Deviceusb 2-4: Manufacturer: KO Electronics Inc.usb 2-4: SerialNumber: KO_ANDROID_Nexsususb 2-4: configuration #1 chosen from 1 choicecdc_acm 2-4:1.0: This device cannot do calls on its own. It is no mo-dem.cdc_acm 2-4:1.0: ttyACM0: USB ACM devicescsi5 : SCSI emulation for USB Mass Storage devicesusb-storage: device found at 10usb-storage: waiting for device to settle before scanningusb-storage: device scan completescsi 5:0:0:0: Direct-Access KOE Android Platform 0000 PQ: 0 ANSI: 2sd 5:0:0:0: [sdc] Attached SCSI removable disksd 5:0:0:0: Attached scsi generic sg4 type 0

리눅스 배포판에서 USB 디바이스 지원을 추가하기 위해서는 해당 디바이스의 Vendor 아이디 정보가 필요함 . USB Vendor 아이디는 리눅스의 sysfs 라는 시스템정보관리용 파일시스템을 이용하여 udev 애플리케이션의 udev 환경파일에 의해 동적으로 디바이스가 인식됨 .

부록

Page 50: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 50/43

# 부록 : Ftrace Internals 1/4 - How it works?

00001adb <do_fork>: 1adb: 55 push %ebp 1adc: 89 e5 mov %esp,%ebp 1ade: 57 push %edi 1adf: 56 push %esi 1ae0: 53 push %ebx 1ae1: 83 ec 1c sub $0x1c,%esp 1ae4: e8 fc ff ff ff call 1ae5 <do_fork+0xa> 1ae5: R_386_PC32 mcount 1ae9: 89 c3 mov %eax,%ebx 1aeb: 89 c7 mov %eax,%edi 1aed: 81 e3 00 00 00 02 and $0x2000000,%ebx 1af3: 89 ce mov %ecx,%esi

GCC 컴파일러의 – pg 옵션으로 컴파일을 하면 “mcount” 함수라 불리는 위치를 “ nop” 으로 모든 위치를 변경한다 . 이 “ -pg” 옵션은 “mcount” 라고 불리는 함수를 호출하기 위해 함수 프로파일러를 셋업한다 . 만약 , 여러분이 간단히 “mcount” 반환을 가진다면 , 그것은 성능적인 면에서 15% ~ 18% 가량의 오버헤드를 안겨다 줄 것이다 . 그래서 , mcount 는 성능적인 부분 때문에 어셈블리어로 구현된다 .

ftrace 의 동작은 GCC 컴파일러에서 지원되는 – pg 라는 옵션을 가진 프로파일러 기능을 통해서 실행되어 진다 . 각각의 non-inline 함수는 “mcount’루틴을 호출한다 .

mcount 호출위해 프로파일러 셋업비용으로 인해 평균 10% 오버헤드 발생

부록

Page 51: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 51/43

# 부록 : Ftrace Internals 2/4 - ftrace_record_ip

Hash Table

ftrace_record_ip

do_fork

초기화 과정에서 “mcount” 호출들은 “ ftrace_record_ip” 함수를 호출하도록 변경되어 진다 . 이 작업의 수행 후 , 제일 먼저 커널 함수가 호출되며 , 이 때 Hash Table 안에 저장된 호출 주소 정보를 저장한다 .

부록

Page 52: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 52/43

# 부록 : Ftrace Internals 3/4 - ftraced

어떤 새로운 커널 함수들이 기록 된다면 , "ftraced" 데몬은 그것을 관찰하기 위하여 깨어나서 모니터링을 하도록 되어 있다 . 깨어난 "ftraced" 데몬은 kstop_machine 을 호출하고 , 호출들을 "nop" 으로 변환한다 . 여러분들이 다른 CPU 의 인스터럭션 캐시내에서 발생하는 코드를 수정한다면 , SMP 에서 생각치 못한 일들이 발생하기 때문에 kstop_machine 이 필요하다 .

여기서 , stop_machine 이란 무엇인가 ? 모든 CPU 들은 실행하는 기기를 Freeze 시키고 , 이 함수를 실행한다 . 이때 , "Bogolock" 는 전체 기기를 중지시키거나 인터럽트들을 비활성화 시킨다 . 이 비용이 상당히 크게 때문에 매번 발생하는 스핀락과 그 비용이 맞먹을 정도다 . 그래서 , 읽기가 대부분인 락킹 부분은 선점이 될 수 없게 한다 .

Hash Tableftraced

Kstop_machine

(modify code: nop)

List

Do_fork+0x9 Do_fork+0x9

Ftraced 라는 커널 쓰레드가 트레이싱을 위한 주요 담당자로써 일련의 작업을 실행한다 .

부록

Page 53: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 53/43

# 부록 : Ftrace Internals 4/4 - overhead

ftraced 라는 커널 쓰레드가 깨워진 후에 새로운 커널 함수들이 기록되어 진다면 kstop_machine 을 다시 호출을 한다 . ftraced 커널 쓰레드는 mcount 루틴을 nop 으로 모든 호출을 변경한다 . 이것을 nop 으로 변경함으로써 , 시스템에 오버헤드를 다시 0% 으로 변경함을 의미한다

이를 위해서 여러분들은 ‘ set_ftrace_filter’ 와 ‘ set_ftrace_notrace’ 을 활용 할 수 있다 .

선택적으로 몇몇 mcount 호출들을 nop 으로 놓음으로써 , 디버깅으로 인해 발생하는 오버헤드를 최소화 할 수 있다 .

mcount 루틴

nop

평균 10% 의 오버헤드

부록

Page 54: 플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace )  Technology  Session

8 회 Korea Android Conference (kandroid.org) 54/43

MEMO

kandrod.org technical community