BootChart-Android文档(开机慢)

BootChart-Android文档(开机慢)
BootChart-Android文档(开机慢)

BootChart在Android中的应用

1 简介

Bootchart是一个能对GNU/Linux boot过程进行性能分析并把结果直观化的工具。它在boot过程中搜集资源利用情况及进程信息然后以PNG,SVG或EPS格式来显示结果。BootChart包含数据收集工具和图像产生工具,数据收集工具在原始的BootChart中是独立的shell程序,但在Android中,数据收集工具被集成到了init程序中。

2 BootChart使用步骤概述

?在主机上安装BootChart

?建立有BootChart支持的init文件

?安装init到系统镜像

?使能启动时的BootChart功能

?收集系统产生的数据

?根据产生的数据生成图表

?结果分析

以下部分将对这些步骤进行详细描述(环境:Ubuntu9.04,Android1.6)。

3 详细说明

?在主机上安装BootChart

$ sudo apt-get install bootchart

注:由于BootChart是用Java语言实现,所以要求其所运行的主机安装Java包。

?创建支持BootChart功能的‘init’文件

Andoid系统中运行的第一个程序是'init',其所在的目录为Andoid文件系统的根目录下(即/)。'init'是一个由内核启动的用户级进程,主要是对系统进行初始化和根据init.rc与init.xxx.rc文件建立几个基本的服务。

创建'init'时对BootChart的数据收集功能是可选的,默认的'init'是不支持BootChart 的数据收集功能的。要想在Andoid中应用BootChart,必须创建支持BootChart数据收集功能的'init'。

$ cd ~/myandroid

$ export INIT_BOOTCHART=true

# vim system/core/init/Android.mk

20 ifeq ($(strip $(INIT_BOOTCHART)),true)

21 LOCAL_SRC_FILES += bootchart.c

22 LOCAL_CFLAGS += -DBOOTCHART=1

23 endif

# touch system/core/init/init.c

#cd device/qcom/msm7630_surf # vim BoardConfig.mk

ifeq ($(TARGET_BUILD_V ARIANT),user)

BOARD_KERNEL_CMDLINE := androidboot.hardware=qcom

androidboot.bootchart=xifangqing(Add this line)

# vim system/core/rootdir/init.rc(loglevel 3 改成8,这样INFO可以打印)

adb shell dmesg查看

$ make clean (删除out目录)

$ make (make kernel即可system/core..)

?安装'init'到系统镜像

将生成的'init'拷贝到目标板的'/'目录下。(具体方法:将

myandroid/out/target/product/zoom2/root下生成的init文件拷贝到~/work/root目录下,重新编译内核下载到板子上即可在/目录下找到支持BOOTCHART的init文件)

?使能系统启动时的BootChart功能

#echo 120 > /data/bootchart-start

重启系统,当'init'开始运行时,BootChart也开始收集数据,知道设定的时间结束(120seconds=2 minutes).

?收集系统产生的数据

'init'过程激活BootChart数据收集工具,并将数据存储到目标系统的/data/bootchart路径下。

BootChart会在/data/bootchart目录下生成三个文件:

proc_diskstats.log

proc_ps.log

proc_stat.log

注:要重新收集数据时,需做以下步骤:

# cd /data

# rm –r bootchart

# rm bootchart-start

重启系统

# echo 120>/data/bootchart-start

重启系统后就可以在/data/bootchart目录下看到新的数据

?根据产生的数据生成图表

将上一步骤中产生的三个文件拷贝到主机上,运行如下命令渲染图像:

$ tar czf bootchart.tgz *.log

$ bootchart -f png bootchart.tgz

会在当前目录下生成bootchart.png文件,即为目标系统Android启动时的信息。

?结果分析

一般来说,图表的最上方是CPU和disk的利用情况,从左到右是时间轴,下方是各进程的运行状态条,显示各进程的开始时间和结束时间以及对cpu和I/O的利用情况。

我们关注的主要是各进程的运行时间以及对cpu的利用情况,进而优化系统。

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

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 plaincopy

sudo apt-get install bootchart

sudo apt-get install pybootchartgui

2、bootchart在Android下的编译

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

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

[html] view plaincopy

$ cd mydroid

$ export INIT_BOOTCHART=true

$ make clean

$ make

2)、系统已经编译过,现在只是要添加bootchart进系统中,执行以下命令:‘$ touch system/core/init/init.c

$ m INIT_BOOTCHART=true

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

3、bootchart在Android下的执行

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

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

$ adb shell 'echo 120 > /data/bootchart-start'

3)、执行命令:

$ adb shell 'mkdir /data/bootchart'

在开发板上系统的/data/目录下新建目录bootchart/用来存放bootchart的测量结果,后面要利用这些文件生成可视化图片

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

# ls -l

-rw-rw-rw- root root 452 2010-01-01 00:00 header

-rw-r--r-- root root 0 2010-01-01 00:00 kernel_pacct

-rwxr-xr-x root root 1020195 2010-01-01 00:02 proc_diskstats.log

-rwxr-xr-x root root 4252966 2010-01-01 00:02 proc_ps.log

-rwxr-xr-x root root 138215 2010-01-01 00:02 proc_stat.log

到此为止,bootchart执行测量后生成的测量数据已经完成,看上面有3个.log文件,下面需要将这些数据进一步处理成易读、易分析的图片。

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

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

#!/bin/sh

#

# this script is used to retrieve the bootchart log generated

# by init when compiled with INIT_BOOTCHART=true.

#

# for all details, see //device/system/init/README.BOOTCHART

#

TMPDIR=/tmp/android-bootchart

rm -rf $TMPDIR

mkdir -p $TMPDIR

LOGROOT=/data/bootchart

TARBALL=bootchart.tgz

FILES="header proc_stat.log proc_ps.log proc_diskstats.log kernel_pacct"

for f in $FILES; do

adb pull $LOGROOT/$f $TMPDIR/$f 2>&1 > /dev/null

done

(cd $TMPDIR && tar -czf $TARBALL $FILES)

cp -f $TMPDIR/$TARBALL ./$TARBALL

echo "look at $TARBALL"

从脚本的LOGROOT一项可以看出,步骤3的3)中,新建存放bootchart测量结果的文件目录不可以随便更改的,要保证所建目录与脚本的LOGROOT项保持一致。打包后将在当前目录下,即system/core/init/下生成bootchart.tgz文件。

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

$bootchart ./bootchart.tgz

这样就在system/core/init/目录下生成了bootchart.png,如下图所示

5、问题总结

在执行第4步的2)时,即执行命令:$bootchart ./bootchart.tgz

时,报错啦,如下错误:

parsing './bootchart.tgz'

parsing 'header'

parsing 'proc_stat.log'

parsing 'proc_ps.log'

warning: no parent for pid '2' with ppid '0'

parsing 'proc_diskstats.log'

parsing 'kernel_pacct'

merged 0 logger processes

pruned 61 process, 0 exploders, 2 threads, and 0 runs

False

Traceback (most recent call last):

File "/usr/bin/bootchart", line 23, in

sys.exit(main())

File "/usr/lib/pymodules/python2.7/pybootchartgui/main.py", line 137, in main

render()

File "/usr/lib/pymodules/python2.7/pybootchartgui/main.py", line 128, in render

batch.render(writer, res, options, filename)

File "/usr/lib/pymodules/python2.7/pybootchartgui/batch.py", line 41, in render

draw.render(ctx, options, *res)

File "/usr/lib/pymodules/python2.7/pybootchartgui/draw.py", line 282, in render

draw_chart(ctx, IO_COLOR, True, chart_rect, [(sample.time, sample.util) for sample in disk_stats], proc_tree)

File "/usr/lib/pymodules/python2.7/pybootchartgui/draw.py", line 201, in draw_chart

yscale = float(chart_bounds[3]) / max(y for (x,y) in data)

ZeroDivisionError: float division by zero

临门一脚出了问题,甚为恼火,找了一圈,总算解决了。解决的具体办法见连接:点击打开链接,在链接网页内找到draw.py,parsing.py,samples.py三个文件的下载链接并下载,然后替换ubuntu上/usr/share/pyshared/pybootchartgui/ 下对应的文件,并再次执行命令:

bootchart ./bootchart.tgz

即可。

开机速度慢原因之一:

nand_ids.c

struct nand_flash_dev nand_flash_ids[] = {

{"NAND 1GiB 1,8V 16-bit", 0xB3, 4096, 1024, 4096<<6,

LP_OPTIONS16|NAND_SKIP_BBTSCAN|NAND_USE_FLASH_B(add)

}

https://www.360docs.net/doc/828204064.html,/sun_yfs/blog/item/7ded46101c9b571fb9127b09.html

接著,將bootchart.tgz 製作成圖檔:

$ java -jar /usr/share/bootchart/bootchart.jar /tmp/android-bootchart/bootchart.tgz Parsing /tmp/android-bootchart/bootchart.tgz

Wrote image: ./bootchart.png

相关主题
相关文档
最新文档