bootchart工具在Android系统开机测量中的应用

本文详细介绍了如何在Ubuntu10.04下安装和使用Bootchart工具来分析系统启动性能。包括Bootchart的安装、在Android系统中的编译与执行流程,以及如何生成和解析测量结果。最后解决了执行Bootchart时出现的错误问题,提供了详细的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,执行命令如下:

[html] view plain copy
  1. sudoapt-getinstallbootchart
  2. sudoapt-getinstallpybootchartgui

2、bootchart在Android下的编译

Android系统编译时,默认的没有打开bootchart的编译开关,即没有把bootchart编译进系统中。要把bootchart编进系统分为两种情况了:

1)、系统没有被编译过或者执行了make clean命令,可以执行以下命令:

[html] view plain copy
  1. $cdmydroid
  2. $exportINIT_BOOTCHART=true
  3. $makeclean
  4. $make
2)、系统已经编译过,现在只是要添加bootchart进系统中,执行以下命令:‘
[html] view plain copy
  1. $touchsystem/core/init/init.c
  2. $mINIT_BOOTCHART=true

其中touch命令的作用就是将init.c文件的最后修改时间改为当前时间,这样保证init.c文件会被重新make,而bootchart就是在init.c中被调用的,从而保证bootchart会被编进系统中。

3、bootchart在Android下的执行

1}、将编译生成的带有bootchart工具的Android系统重新烧录到开发板上,并启动系统

2)、在UBuntu上通过adb connect连接到开发板,然后执行:

[html] view plain copy
  1. $adbshell'echo120>/data/bootchart-start'

3)、执行命令:

[html] view plain copy
  1. $adbshell'mkdir/data/bootchart'
在开发板上系统的/data/目录下新建目录bootchart/用来存放bootchart的测量结果,后面要利用这些文件生成可视化图片

4)、重新启动开发板,在开发板的Android系统的/data/bootchart/目录下将看到以下文件:

[html] view plain copy
  1. #ls-l
  2. -rw-rw-rw-rootroot4522010-01-0100:00header
  3. -rw-r--r--rootroot02010-01-0100:00kernel_pacct
  4. -rwxr-xr-xrootroot10201952010-01-0100:02proc_diskstats.log
  5. -rwxr-xr-xrootroot42529662010-01-0100:02proc_ps.log
  6. -rwxr-xr-xrootroot1382152010-01-0100:02proc_stat.log
到此为止,bootchart执行测量后生成的测量数据已经完成,看上面有3个.log文件,下面需要将这些数据进一步处理成易读、易分析的图片。

4、bootchart测量结果的图形化过程

1)、到这里要夸奖下android做的比较贴心,已经写好了脚本将bootchart测量生成的数据直接从开发板上打包出来,生成bootchart.tgz。这个打包脚是源码的system/core/init/grab-bootchart.sh文件,和bootchart源码位于同一目录下。脚本的内容如下:

[plain] view plain copy
  1. #!/bin/sh
  2. #
  3. #thisscriptisusedtoretrievethebootchartloggenerated
  4. #byinitwhencompiledwithINIT_BOOTCHART=true.
  5. #
  6. #foralldetails,see//device/system/init/README.BOOTCHART
  7. #
  8. TMPDIR=/tmp/android-bootchart
  9. rm-rf$TMPDIR
  10. mkdir-p$TMPDIR
  11. LOGROOT=/data/bootchart
  12. TARBALL=bootchart.tgz
  13. FILES="headerproc_stat.logproc_ps.logproc_diskstats.logkernel_pacct"
  14. forfin$FILES;do
  15. adbpull$LOGROOT/$f$TMPDIR/$f2>&1>/dev/null
  16. done
  17. (cd$TMPDIR&&tar-czf$TARBALL$FILES)
  18. cp-f$TMPDIR/$TARBALL./$TARBALL
  19. echo"lookat$TARBALL"
从脚本的LOGROOT一项可以看出,步骤3的3)中,新建存放bootchart测量结果的文件目录不可以随便更改的,要保证所建目录与脚本的LOGROOT项保持一致。打包后将在当前目录下,即system/core/init/下生成bootchart.tgz文件。

2)、在bootchart.tgz所在目录下执行命令:

[html] view plain copy
  1. $bootchart./bootchart.tgz
这样就在 system/core/init/目录下生成了bootchart.png,如下图所示



5、问题总结

在执行第4步的2)时,即执行命令:

[html] view plain copy
  1. $bootchart./bootchart.tgz
时,报错啦,如下错误:
[html] view plain copy
  1. parsing'./bootchart.tgz'
  2. parsing'header'
  3. parsing'proc_stat.log'
  4. parsing'proc_ps.log'
  5. warning:noparentforpid'2'withppid'0'
  6. parsing'proc_diskstats.log'
  7. parsing'kernel_pacct'
  8. merged0loggerprocesses
  9. pruned61process,0exploders,2threads,and0runs
  10. False
  11. Traceback(mostrecentcalllast):
  12. File"/usr/bin/bootchart",line23,in<module>
  13. sys.exit(main())
  14. File"/usr/lib/pymodules/python2.7/pybootchartgui/main.py",line137,inmain
  15. render()
  16. File"/usr/lib/pymodules/python2.7/pybootchartgui/main.py",line128,inrender
  17. batch.render(writer,res,options,filename)
  18. File"/usr/lib/pymodules/python2.7/pybootchartgui/batch.py",line41,inrender
  19. draw.render(ctx,options,*res)
  20. File"/usr/lib/pymodules/python2.7/pybootchartgui/draw.py",line282,inrender
  21. draw_chart(ctx,IO_COLOR,True,chart_rect,[(sample.time,sample.util)forsampleindisk_stats],proc_tree)
  22. File"/usr/lib/pymodules/python2.7/pybootchartgui/draw.py",line201,indraw_chart
  23. yscale=float(chart_bounds[3])/max(yfor(x,y)indata)
  24. ZeroDivisionError:floatdivisionbyzero
临门一脚出了问题,甚为恼火,找了一圈,总算解决了。解决的具体办法见连接: 点击打开链接 ,在链接网页内找到 draw.py parsing.py samples.py 三个文件的下载链接并下载,然后替换ubuntu上/usr/share/pyshared/pybootchartgui/ 下对应的文件,并再次执行命令:
[html] view plain copy
  1. bootchart./bootchart.tgz
即可。如果没有遇到上述问题,那么既可喜也可惜,呵呵!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值