概述

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数据并分析。

看图结果还是十分直观的,只可惜用不了。

用法:

  1. 开启内核配置
    联系内核开发的同学,修改defconfig里面的配置。(我就挂在这一步)
To enable I/O accounting the following configs have to be set:CONFIG_TASKSTATSCONFIG_TASK_IO_ACCOUNTINGCONFIG_TASK_XACCTCONFIG_TASK_DELAY_ACCT
  1. 将iotop的代码导入设备,执行sh iotop.sh
    也就是运行一段脚本。当然linux的也可以yum install iotop。可是android么得yum啊…
  2. 执行iotop命令,查询结果

iopp

在网上看到有人说iotop受到内核限制,因此搞了个iopp,满怀希望以为不用搞内核配置了,结果发现没卵用。
Git地址:https://github.com/markwkm/iopp
用法:(yum很简单,但是用不了)
由于是C代码,因此要编译成执行文件,gcc搞起来。cmake应该也可以,不过笔者没有试。

  1. 去Git把代码搞下来,放到设备里
    懒人捷径iopp.c 不放心的自行去下面git里面下。
  2. 编译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

  1. 执行
    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命令详解

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android实现社交应用中的评论和回复功能
  4. Android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递
  5. android快应用,Error: Cannot find module 'xxx\node_modules\h
  6. Android(安卓)Jetpack - paging(分页库)
  7. Android中直播视频技术探究之---桌面屏幕视频数据源采集功能分析
  8. 【android Studio】零git知识、零脚本命令,即刻体验git版本管理魅
  9. android中不同app间数据交互(1、简单一次性数据交互)

随机推荐

  1. 浅谈网路爬虫
  2. 爬虫js解密—剖析网易云加密
  3. nginx牛逼tomcat弱鸡探索之道
  4. 数据结构与算法—队列(搞懂最常用数据结
  5. java后端学习路线建议
  6. 从阶乘、斐波那契、汉诺塔剖析彻底搞懂递
  7. java开发者linux入门
  8. 数据结构与算法—小白也能搞懂二叉排序(
  9. csdn账号密码登录剖析(模拟登录)
  10. 爬虫实现csdn文章一键(批量)更换阅读类型