1 / 54

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

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

kyran
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 플랫폼/App개발자들을위한멀티코어向안드로이드커널의디버깅테크닉Function Tracer(Ftrace) Technology Session 작성자: 임근식(Nickname: 인베인) 이메일: leemgs.at.gmail.com (http://leemgs.fedorapeople.org) 발표일: 2011년 10월 17일 (月)

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

  3. Highest Lowest

  4. 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 네이버 카페 개설/운영

  5. 세션 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

  6. 멀티코어지원을위한안드로이드커널기능들 Load-balancing Tasks Ftrace (커널의 디버깅 피쳐) Tasks Multi-core

  7. 안드로이드 플랫폼의 디버깅 소프트웨어 현황 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

  8. 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>”

  9. 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

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

  11. Ftrace의할수있는일들은무엇인가??? GCC의 –pg 메카니즘 Plugins Tracing Events Tracing Ftrace (커널의 디버깅 피쳐) Hooking 메카니즘

  12. Ftrace의동작원리(Dynamic function with –pg option) • GCC 컴파일러의 프로파일링 옵션(-pg)으로 빌드된안드로이드커널을 이용하여 커널내부 함수들을 트레이싱하는 구조로 Ftrace가 동작된다. 평균 10%의 오버헤드 nop mcount 루틴

  13. Ftrace에서지원되는Trace 기능들 Wakeup으로 통합됨 Linux 3.0.X부터 제거됨.

  14. debugfs으로 마운팅된ftrace의 / 디렉토리 X O

  15. 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 . . . . 아래 생 략. . . .

  16. 필요한커널함수만분석방법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**커널함수들의 호출관계들

  17. 필요한 커널함수만 분석 방법 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

  18. 문맥교환스케쥴링분석하기 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

  19. 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 실행

  20. 커널함수실행을그래프형태로출력하기 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() {

  21. 이벤트트레이서(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]

  22. Plugins VS. Events

  23. 세션 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

  24. 리눅스커널 비전문가를 위한 툴들(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의 내부동작을 쉽게 분석및 해석 애플리케이션의 최적화를 이끌어냄  제품 경쟁력 & 차별화

  25. 애플리케이션개발자를위한trace-cmd trace-cmd 미사용시 trace-cmd 사용시

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

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

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

  29. Trace-cmd리스트 사용가능한이벤트들을 모두 보여준다. 사용가능한플러그인들을 모두 보여준다. 사용가능한trace 옵션들을 모두 보여준다. 옵션들은 “trace-cmd record –O 옵션”에 의해 사용된다.

  30. 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 파일을 읽는다. )

  31. 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();

  32. 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() {

  33. 인트럽트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

  34. 스케쥴링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

  35. GUI기반로그파일분석유틸리티- KernelShark 멀티코어에 대한 디버깅을 지원한다. 특정 CPU의 디버깅이 필요한경우 해당 CPU을 체크하면 된다.

  36. 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

  37. Kernelshark의 그래프 정보 영역 마크 2/3 • Zooming In/Out • Zooming In: 왼쪽마우스클릭후오른쪽으로드래그 • Zooming Out: 왼쪽마우스클릭후좌측으로드래그 • 출력하기 위한 태스크 리스트 선택 • Event Info툴팁 • Search 리스트

  38. Kernelshark의 그래프 정보 영역 마크 3/3 • Event Filter • Filtering • Filter out tasks • Filter in tasks • Filter events • Filter events based on content

  39. Kernelshark으로로그파일분석하기 CPU3  CPU2

  40. 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()

  41. References

  42. Conclusion

  43. Q & A Any Questions? - 문의기간: 2011년 10월 17일 ~ 10월 30일 - 이 메 일: support@invain.pe.kr - 메일제목: 8kandroid: *** • 공유되기 곤란한 내용의 질의 • 회사 보안성 성질의 질의 • 개인적인 기술이슈 성격의 질의 • 1대1 소통/토의가 필요한 질의

  44. Thank You.

  45. # 부 록

  46. #부록: 디버깅을 위한 개발 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 )

  47. #부록: 디버깅을 위해루팅하기(방법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 ) 소프트웨어를 실행한다.

  48. #부록: 디버깅을 위해루팅하기(방법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

  49. #부록: 개발보드의 콘솔 이용을 위해 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

  50. #부록: 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% 오버헤드 발생

More Related