bootchart本是一个开源工具,用可视化的方式对GUN/LINUX的开机启动过程进行性能分析,包括资源的使用,如CPU,磁盘等,各进程的执行时间等信息。根据分析结果,确定系统启动的性能瓶颈,制定相应的优化策略。关于bootchart的来历和说明件其官方网站:点击打开链接
Android系统中已有一份bootchart的c实现,位于system/core/init/bootchart.c中。bootchart对Android开机测量是通过内建在init进程中实现的,在后台执行测量。不过bootchart的测量时段是从bootchart被初始化之后到home screen出来之前,不包括bootloader和kernel的执行时间。
我的系统是UBuntu10.04,现将整个使用步骤归纳如下:
1)、UBuntu下bootchart工具的安装
2)、bootchart在Android下的编译
3)、bootchart在Android下的执行
4)、bootchart测量结果的图形化过程
下面依次对上述四个步骤进行详细说明。
1、UBuntu下bootchart工具的安装
需要安装的工具有两个bootchart和pybootchartgui,执行命令如下:
- sudoapt-getinstallbootchart
- sudoapt-getinstallpybootchartgui
2、bootchart在Android下的编译
Android系统编译时,默认的没有打开bootchart的编译开关,即没有把bootchart编译进系统中。要把bootchart编进系统分为两种情况了:
1)、系统没有被编译过或者执行了make clean命令,可以执行以下命令:
- $cdmydroid
- $exportINIT_BOOTCHART=true
- $makeclean
- $make
- $touchsystem/core/init/init.c
- $mINIT_BOOTCHART=true
其中touch命令的作用就是将init.c文件的最后修改时间改为当前时间,这样保证init.c文件会被重新make,而bootchart就是在init.c中被调用的,从而保证bootchart会被编进系统中。
3、bootchart在Android下的执行
1}、将编译生成的带有bootchart工具的Android系统重新烧录到开发板上,并启动系统
2)、在UBuntu上通过adb connect连接到开发板,然后执行:
- $adbshell'echo120>/data/bootchart-start'
3)、执行命令:
- $adbshell'mkdir/data/bootchart'
4)、重新启动开发板,在开发板的Android系统的/data/bootchart/目录下将看到以下文件:
- #ls-l
- -rw-rw-rw-rootroot4522010-01-0100:00header
- -rw-r--r--rootroot02010-01-0100:00kernel_pacct
- -rwxr-xr-xrootroot10201952010-01-0100:02proc_diskstats.log
- -rwxr-xr-xrootroot42529662010-01-0100:02proc_ps.log
- -rwxr-xr-xrootroot1382152010-01-0100:02proc_stat.log
4、bootchart测量结果的图形化过程
1)、到这里要夸奖下android做的比较贴心,已经写好了脚本将bootchart测量生成的数据直接从开发板上打包出来,生成bootchart.tgz。这个打包脚是源码的system/core/init/grab-bootchart.sh文件,和bootchart源码位于同一目录下。脚本的内容如下:
- #!/bin/sh
- #
- #thisscriptisusedtoretrievethebootchartloggenerated
- #byinitwhencompiledwithINIT_BOOTCHART=true.
- #
- #foralldetails,see//device/system/init/README.BOOTCHART
- #
- TMPDIR=/tmp/android-bootchart
- rm-rf$TMPDIR
- mkdir-p$TMPDIR
- LOGROOT=/data/bootchart
- TARBALL=bootchart.tgz
- FILES="headerproc_stat.logproc_ps.logproc_diskstats.logkernel_pacct"
- forfin$FILES;do
- adbpull$LOGROOT/$f$TMPDIR/$f2>&1>/dev/null
- done
- (cd$TMPDIR&&tar-czf$TARBALL$FILES)
- cp-f$TMPDIR/$TARBALL./$TARBALL
- echo"lookat$TARBALL"
2)、在bootchart.tgz所在目录下执行命令:
- $bootchart./bootchart.tgz
5、问题总结
在执行第4步的2)时,即执行命令:
- $bootchart./bootchart.tgz
- parsing'./bootchart.tgz'
- parsing'header'
- parsing'proc_stat.log'
- parsing'proc_ps.log'
- warning:noparentforpid'2'withppid'0'
- parsing'proc_diskstats.log'
- parsing'kernel_pacct'
- merged0loggerprocesses
- pruned61process,0exploders,2threads,and0runs
- False
- Traceback(mostrecentcalllast):
- File"/usr/bin/bootchart",line23,in<module>
- sys.exit(main())
- File"/usr/lib/pymodules/python2.7/pybootchartgui/main.py",line137,inmain
- render()
- File"/usr/lib/pymodules/python2.7/pybootchartgui/main.py",line128,inrender
- batch.render(writer,res,options,filename)
- File"/usr/lib/pymodules/python2.7/pybootchartgui/batch.py",line41,inrender
- draw.render(ctx,options,*res)
- File"/usr/lib/pymodules/python2.7/pybootchartgui/draw.py",line282,inrender
- draw_chart(ctx,IO_COLOR,True,chart_rect,[(sample.time,sample.util)forsampleindisk_stats],proc_tree)
- File"/usr/lib/pymodules/python2.7/pybootchartgui/draw.py",line201,indraw_chart
- yscale=float(chart_bounds[3])/max(yfor(x,y)indata)
- ZeroDivisionError:floatdivisionbyzero
- bootchart./bootchart.tgz