概述
Android得IO问题实际上就是探究Linux得IO问题。 本文主要是总结了网上各路大神得经验,写了一些实际操作中遇到得问题和解决方案。 最近在搞性能优化方面得研究,研究使用Soloπ得io占用对性能得影响问题时,偶然发现了机器上IO很频繁。老大说去看看为啥io那么频繁吧,于是乎…走上了一条不归路啊T.T。
内容
网上搜来搜去基本就那几篇东西,大部分都是转来转去。而且多是针对linux系统得,专门针对Android得资料不多。 笔者结合实际操作体验,简单介绍下Android系统中几种统计方式和实际效果。使用目标是找到频繁IO的进程并优化。 系统级IO监控:iostat、vmstat 进程级IO监控:iodump、iotop 文件级IO监控:ioprofile,sysstat
vmstat
可以获取全局IO信息。笔者也是通过这个命令发现系统IO异常的。 用法:adb shell vmstat 1#每一秒打印一次数据 我们主要看io下面的bi和bo, bi:从块设备读取数据的量(读磁盘);从磁盘里出来进入到内存里边去 bo: 从块设备写入数据的量(写磁盘); 其他参数可以获取内存,cpu等数据,可以去每天一个linux命令:vmstat自行了解。
lsof + strace
这个方案算是我暂时的解决方案了。 Android未阉割的Linux原生命令,可以获取很多系统参数辅助分析,缺点是数据没有格式化需要自己处理。 逻辑:用lsof查找系统文件占用,找到占用文件的进程;再用strace 监控进程系统方法调用。 用法: 1、adb shell lsof #查询目前被占用得文件及进程 2、adb shell strace –p 1693 #按照Pid查询系统调用 可以看到write()频繁调用,输出的就是写入的文件大小,单位是KB。 基本可以定位到问题出在logcat上,想办法关掉他的本地写入或者别写太多数据就可以解决问题。
iotop
需要cpu内核开几个io配置。要联系内核开发的同学。我的机器上没办法配置这些,因此用不了。
Git地址:https://github.com/laufersteppenwolf/iotop 不用找了,再找都是这个地址,或是直接复制的这里的内容。
原理:开启内核io记录,遍历查询proc/{pid}/io数据并分析。 看图结果还是十分直观的,只可惜用不了。
用法:
开启内核配置 联系内核开发的同学,修改defconfig里面的配置。(我就挂在这一步)
To enable I/O accounting the following configs have to be set:
CONFIG_TASKSTATS
CONFIG_TASK_IO_ACCOUNTING
CONFIG_TASK_XACCT
CONFIG_TASK_DELAY_ACCT
将iotop的代码导入设备,执行sh iotop.sh 也就是运行一段脚本。当然linux的也可以yum install iotop。可是android么得yum啊…执行iotop命令,查询结果
iopp
在网上看到有人说iotop受到内核限制,因此搞了个iopp,满怀希望以为不用搞内核配置了,结果发现没卵用。 Git地址:https://github.com/markwkm/iopp 用法:(yum很简单,但是用不了) 由于是C代码,因此要编译成执行文件,gcc搞起来。cmake应该也可以,不过笔者没有试。
去Git把代码搞下来,放到设备里 懒人捷径iopp.c 不放心的自行去下面git里面下。编译c代码 adb shell 进到iopp.c再设备商的存放路径。 gcc -Wall -fPIE -pie -o iopp iopp.c
当然要执行上面这段话不是那么容易滴。
首先得有个gcc编译环境。 a、豌豆荚下载gcc plugin for C4Droid。b、后缀改成zip,解压出assest中得gcc压缩包。c、得到gcc执行器代码。 懒人福利gcc。 链接: https://pan.baidu.com/s/1dmUvO4xj8afM8r0CP00KTA 提取码: 87gw 想尝试得去下吧,笔者解压好了。(MD csdn资源竟然强制下载要积分) 偷懒传送门:在Android上使用gcc编译C/C++源程序
配置过程中会遇到如下错误,配置不对或者su错了,请多试几次。 /system/bin/sh: gcc: not found
执行 OK搞定!!终于可以编译了!!! gcc -o iopp.c成功! 执行./iopp, 报错:"./iopp": error: only position independent executables (PIE) are supported. 玛德,5.0以上手机要用 gcc -fPIE -pie.为啥子自己去查吧。 再来gcc -Wall -fPIE -pie -o iopp iopp.c
这回没错了,可是执行后发现…玛德根本没数据,不知道哪错了,得去debug源码了,放弃了,浪费时间。
iodump
原理:分析dmesg输出得数据。 首先要开一个开关:echo 1 > /proc/sys/vm/block_dump 然后:watch -n 1 "dmesg -c | grep WRITE" watch再android下是没有得,针对这些没有得命令咋搞呢? busybox了解一下。android安装busybox 去看吧,反正就是每秒执行,有别的命令也行。 执行成功,可以看到很多WRITE信息,但是笔者测试了一个应用得写入操作,打印得却不是该应用进程得PID,奇怪。 最后关一下:echo 0 > /proc/sys/vm/block_dump
总结
研究了两三天,折腾了一大圈,网上多的是Linux得资料,Android用得时候受到诸如yum,gcc等很多命令限制。很难受。最后还是用的lsof + strace得方式去做得。 像其他得ioprofile,sysstat也很牛批,可以自行研究。 因为也是要装插件,笔者没去看了。
参考: Linux下的IO监控与分析 Linux下的一些I/O统计工具 android I/O Performance 的一些查看方法 Linux 调试三剑客——strace,lsof,tcpdump Linux下查看进程IO工具iopp GCC常用选项 linux下dmesg命令详解