620 likes | 1.43k Views
플랫폼 /App 개발자들을 위한 멀티코어向 안드로이드 커널의 디버깅 테크닉 Function Tracer( Ftrace ) Technology Session. 작성자 : 임근식 (Nickname: 인베인 ) 이메일 : leemgs.at.gmail.com (http://leemgs.fedorapeople.org) 발표일 : 2011 년 10 월 17 일 ( 月 ). 본 세션에서 무엇을 배울 것인가 ?. Highe st. Lowest. Who Am I ?.
E N D
플랫폼/App개발자들을위한멀티코어向안드로이드커널의디버깅테크닉Function Tracer(Ftrace) Technology Session 작성자: 임근식(Nickname: 인베인) 이메일: leemgs.at.gmail.com (http://leemgs.fedorapeople.org) 발표일: 2011년 10월 17일 (月)
Highest Lowest
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 네이버 카페 개설/운영
세션 1 :목 차 • 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의 성능 저하 분석 • 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 • References • Conclusion • Q&A
멀티코어지원을위한안드로이드커널기능들 Load-balancing Tasks Ftrace (커널의 디버깅 피쳐) Tasks Multi-core
안드로이드 플랫폼의 디버깅 소프트웨어 현황 Applications(APK) Android Debug Bridge (ADB) Media Player IM Calculator Clock Calendar Gtalker GoogleMap Home Contacts Phone Browser . . . . AVD/ADT &AIDL Applications Framework LogCat/Android Instrumentation Content Providers Activity Manager Windows Manager View System Notification Manager Location Manager Package Manager Telephony Manager Resource Manager XMPP Service DDMS(JDWP)/Traceview/Dmtracedump System (Functional) Libraries ValgrindNew Android Runtime Surface Manager SQLite OpenGL/ES Stage Fright SystemTapUnofficial Core Libraries LatencyTop viewer Bionic Libc (79 pthread) Webkit SSL Free Type SGL Dbus Dalvik VM Strace/Ltrace/GDB HAL(Hardware Abstraction Layer) Trace-cmd/Kernelshark Graphics . . . . Audio Radio(RIL) WiFi G P S Camera BlueTooth Ftrace으로 분석 가능영역 Oprofile/Opcontrol Android Kernel Perf/ELF-util Binder (IPC) Log SubSystem ASHMEM LMK kmemtrace LTT Viewer Kernel Debugger Oprofile LatencyTop ftrace Perf LTT-NG (kgdb/kdb) Ubuntu 10.04 LTSRHEL6/CENTOS6 Mobile Phone
User-space Zygote에 Strace연동시키기 */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.log • * 실행중인 프로세스의 시스템콜 분석:“#> strace –p <PID>”
User-space App VMs 프로세스에 GDB 연동시키기 • 안드로이드 플랫폼의 App VMs 디버깅을 위해 GDB를 활용 사례 App VMs App VMs android#> ps –ef | grep appandroid#> gdbserverlocalhost:<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 App VMs server 5039 Port client
Ftrace의할수있는일들은무엇인가??? GCC의 –pg 메카니즘 Plugins Tracing Events Tracing Ftrace (커널의 디버깅 피쳐) Hooking 메카니즘
Ftrace의동작원리(Dynamic function with –pg option) • GCC 컴파일러의 프로파일링 옵션(-pg)으로 빌드된안드로이드커널을 이용하여 커널내부 함수들을 트레이싱하는 구조로 Ftrace가 동작된다. 평균 10%의 오버헤드 nop mcount 루틴
Ftrace에서지원되는Trace 기능들 Wakeup으로 통합됨 Linux 3.0.X부터 제거됨.
Ftrace의환경설정및 맛보기 데모 • android#> mount –t debugfsnodev /sys/kernel/debug android#> cd /sys/kernel/debug/tracing android#> cat /sys/kernel/debug/tracing/available_tracers android#> echo sched_switch > /sys/kernel/debug/tracing/current_tracer android#> echo 1 > /sys/kernel/debug/tracing/tracing_on android#> sleep 3 android#> echo 0 > /sys/kernel/debug/tracing/tracing_on android#> cat /sys/kernel/debug/tracing/trace # 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 . . . . 아래 생 략. . . .
필요한커널함수만분석방법1/2 android#> echo schedule > set_ftrace_filter android#> cat set_ftrace_filter schedule android#> 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**커널함수들의 호출관계들
필요한 커널함수만 분석 방법 2/2 android#> echo schedule_tail >> set_ftrace_filter android#> cat set_ftrace_filter schedule_tail schedule android#> echo 'sched*' > set_ftrace_filter android#> cat set_ftrace_filter | head -10 sched_avg_update sched_group_shares sched_group_rt_runtime sched_group_rt_period sched_slice sched_rt_can_attach sched_feat_open sched_debug_open (오버헤드를 줄이자!!!) 모든 커널 함수들 필터기 오직 schedule으로 시작되는 함수들 android#> echo '*lock*' > set_ftrace_notrace android#> cat set_ftrace_notrace | head -10 pte_unlock alternatives_smp_unlock user_enable_block_step __acpi_release_global_lock __acpi_acquire_global_lock
문맥교환스케쥴링분석하기 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
Latency 트레이싱 하기 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 # cmdpid |||||| 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 Disable Enable 준비 Wake-up 대기 Dispatch 실행
커널함수실행을그래프형태로출력하기 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() {
이벤트트레이서(Event Tracer) 활용하기 android#> ls events block ext4 header_eventirqkmemkvmmmuschedsyscalls enable ftraceheader_page jbd2 kvm module skbworkqueue android#> ls events/sched/ enable sched_process_exitsched_stat_iowaitsched_wakeup filter sched_process_forksched_stat_sleepsched_wakeup_new sched_kthread_stopsched_process_freesched_stat_wait sched_kthread_stop_retsched_process_waitsched_switch sched_migrate_tasksched_signal_sendsched_wait_task android#> echo 1 > events/sched/enable android#> cat set_event sched:sched_kthread_stop sched:sched_kthread_stop_ret sched: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]
세션 2 :목 차 • 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의 성능 저하 분석 • 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) 활용하기 • PluginsVS. Events • References • Conclusion • Q&A
리눅스커널 비전문가를 위한 툴들(trace-cmd, kernel-shark) trace-cmd: A front–end for Ftrace (CLI) kernel-shark (GUI) trace-cmd명령으로 수집된 tracing log 파일을 그래픽으로 쉽게 분석할 수 있게 함으로써 로그 내용들 비쥬얼하게 이해할 수 있음. • adb명령을 이용하여 개발보드에 접속한 후, 많은 내용을 외워야 하는 불편함을 해소해줌. 명령의 체계는 코드 변경관리 소프트웨어인 git와 유사함. • 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 OS의 내부동작을 쉽게 분석및 해석 애플리케이션의 최적화를 이끌어냄 제품 경쟁력 & 차별화
애플리케이션개발자를위한trace-cmd trace-cmd 미사용시 trace-cmd 사용시
Trace-cmd리스트 사용가능한이벤트들을 모두 보여준다. 사용가능한플러그인들을 모두 보여준다. 사용가능한trace 옵션들을 모두 보여준다. 옵션들은 “trace-cmd record –O 옵션”에 의해 사용된다.
Trace-cmd명령실행방법 ※ 임베디드 개발 보드에서 TCP 서버 & 클라이언트 실행 방법 android#> trace-cmd listen -p 5678 -d SL6#> trace-cmd record –N 10.88.200.125:5678 -e all ftrace.log Android Kernel ※ 로컬 PC 및 임베디드 개발보드에서 직접 실행 방법 SL6#> trace-cmd record -e schedls -ltr /usr > /dev/null ftrace.log Android Kernel ※ 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 파일을 읽는다. )
Trace-cmd으로특정CPU의함수프로파일링하기1/2 android#> ./trace-cmd list -p syscallblkkmemtrace power function_graphmmiotracewakeup_rt wakeup preemptirqsoffpreemptoffirqsoff function sched_switchinitcallnop android#> android#>./trace-cmd record -p sched_switchls /bin android#>./trace-cmd record -p function_graphls /bin android#>./trace-cmdreport version = 1.1.0 cpus=4 236149.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의 함수 프로파일링 하기 2/2 cpu0 cpu1 cpu2 cpu3 android#> ./trace-cmd report --cpu0 version = 1.1.0 cpus=4 236149.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() {
인트럽트Off 영역의디버깅방법 android#> ./trace-cmd record -p irqsoff -d ls/system/ android#> ./trace-cmdreport # 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 # cmdpid ||||| 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 Disable Enable
스케쥴링Latency의디버깅하기 android#>./trace-cmd record -e sched_wakeupls /system android#> ./trace-cmd report version = 0.5 cpus=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 스케쥴링우선순위 소요시간 커널 함수 프로세스 CPU Caller
GUI기반로그파일분석유틸리티- KernelShark 멀티코어에 대한 디버깅을 지원한다. 특정 CPU의 디버깅이 필요한경우 해당 CPU을 체크하면 된다.
Kernelshark의그래프정보영역마크1/3 • Time Stamps • Pointer: 마우스가위치한정보 • Cursor: 더블클릭시의정보 • Marker A : 왼쪽마우스클릭시의정보 • Marker B : Shift으로왼쪽마우스클릭시의정보 • Delta : Mark A와Mark B사이의정보 • Plot Title • Graph Plots • CPU Plots: 해당 CPU에 실행중인 태스크 정보를 나타냄. • Task Plots: 태스크들이 실행하기 위해 사용하는 CPU 정보들을 나타냄 (녹색: wakeUP Latency , 빨간색 네모: Preempt Latency) • Plot Area • List Area
Kernelshark의 그래프 정보 영역 마크 2/3 • Zooming In/Out • Zooming In: 왼쪽마우스클릭후오른쪽으로드래그 • Zooming Out: 왼쪽마우스클릭후좌측으로드래그 • 출력하기 위한 태스크 리스트 선택 • Event Info툴팁 • Search 리스트
Kernelshark의 그래프 정보 영역 마크 3/3 • Event Filter • Filtering • Filter out tasks • Filter in tasks • Filter events • Filter events based on content
Kernelshark으로로그파일분석하기 CPU3 CPU2
Study: Ftrace으로 Contacts의성능저하분석 A. USER PID PPID VSIZE RSS WCHAN PC NAME system 1405 1312 344920 39724 ffffffff afd0dbdc S system_server app_2 1484 1312 230856 72064ffffffff 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/photo 01-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): ### onStartInput 01-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, mTotal[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]:5 01-13 16:14:30.645 D/StatusBarPolicy( 1405): prop get activeband is WCDMA 01-13 16:14:30.645 D/StatusBarPolicy( 1405): prop front WCDMA 01-13 16:14:30.645 D/StatusBarPolicy( 1405): propcompare front WCDMA Thread.wait() or Thread.sleep()
Q & A Any Questions? - 문의기간: 2011년 10월 17일 ~ 10월 30일 - 이 메 일: support@invain.pe.kr - 메일제목: 8kandroid: *** • 공유되기 곤란한 내용의 질의 • 회사 보안성 성질의 질의 • 개인적인 기술이슈 성격의 질의 • 1대1 소통/토의가 필요한 질의
#부록: 디버깅을 위한 개발 PC환경 • 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 )
#부록: 디버깅을 위해루팅하기(방법1) • Ftrace을 이용하기 위해서는 root권한이 필요하기 때문에,안드로이드폰 또는 개발보드를 루팅되어 있는 상태로 작업해놓아야 함. 1. 안드로이드폰의 설정 절차 .Setting – Application – Development – USB Debugging - [V]Connect USB Debugging .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#> ./adbdevices List of devices attached K_ANDROID_KO9319 device rh6#> sudo mono SuperOneClick.exe --> Click “root” menu AdbWinApi.dll AdbWinUsbApi.dll SuperOneClick.exe Superuser.apk adb.exe adblinux adbmac busybox rageagainstthecage sqlite3 su *SuperOneClick.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit Mono/.Net assembly 3. 이제 디버깅 및 성능 최적화를 위해 root권한을 이용하자.!!! - ADB: 리눅스배포판에서“adbshell” 명령을 실행하도록 한다. - Phone: 폰에서“Super user” ( 또는root explorer 또는z4root ) 소프트웨어를 실행한다.
#부록: 디버깅을 위해루팅하기(방법2) rh6#> ./adb push rageagainstthecage /data/local/tmp/rageagainstthecage rh6#> ./adb shell android$> cd /data/local/tmp android$> chmod 4755 rageagainstthecage android$> ./rageagainstthecage rh6#> ./adb shell mount -o remount,rw -t yaffs2 /dev/block/stl9 /system rh6#> ./adb push su /system/bin rh6#> ./adb push Superuser.apk /system/app rh6#> ./adb shell chmod 4755 /system/bin/su rh6#> ./adb shell rm /data/local/tmp/rageagainstthecage rh6#> ./adb reboot 안드로이드 마켓에서 “Terminal Emulator” SW를다운로드 및실행 android$> su android#> id
#부록: 개발보드의 콘솔 이용을 위해 ADB연결 • 리눅스배포판에서USB 디바이스 지원을 추가하기 위해서는 해당 디바이스의 Vendor 아이디 정보가 필요함. USB Vendor 아이디는 리눅스의sysfs라는 시스템정보관리용 파일시스템을 이용하여 udev애플리케이션의 udev환경파일에 의해 동적으로 디바이스가 인식됨. 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 10 usb 2-4: New USB device found,idVendor=04e8, idProduct=618e usb 2-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 2-4: Product: KO Android USB Device usb 2-4: Manufacturer: KO Electronics Inc. usb 2-4: SerialNumber: KO_ANDROID_Nexsus usb 2-4: configuration #1 chosen from 1 choice cdc_acm 2-4:1.0: This device cannot do calls on its own. It is no modem. cdc_acm 2-4:1.0: ttyACM0: USB ACM device scsi5 : SCSI emulation for USB Mass Storage devices usb-storage: device found at 10 usb-storage: waiting for device to settle before scanning usb-storage: device scan complete scsi 5:0:0:0: Direct-Access KOE Android Platform 0000 PQ: 0 ANSI: 2 sd 5:0:0:0: [sdc] Attached SCSI removable disk sd 5:0:0:0: Attached scsi generic sg4 type 0
#부록: Ftrace Internals 1/4 - How it works? • ftrace의 동작은 GCC 컴파일러에서 지원되는 –pg라는 옵션을 가진 프로파일러 기능을 통해서 실행되어 진다. 각각의 non-inline 함수는 “mcount’루틴을 호출한다. 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 ffff 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 cemov %ecx,%esi mcount호출위해프로파일러셋업비용으로 인해 평균10% 오버헤드 발생