概述
通过之前的调研,发现Android官方得的iotop效率更高,于是计划从定位iotop源码,源码编译,新增IO历史数据功能几步入手,进一步调研iotop的使用。
内容
1. 定位iotop源码
由于发现iotop是android9.0以上系统自带的工具,因此去查了9.0的源码,发现iotop源码果然在这里,是c++写的。
主要就这个几个文件,但是由于iotop内部引用了Android自建库的一些函数,因此没法单独编译,需要把android相关代码下全一起编译。
2. Android源代码下载并编译
借了一台外网服務器,xshell连接上,配置了一大堆东西,具体可见参考里的文章(记一次编译Android源码),主要是执行了
repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r3
下载好源码之后开始开始尝试编译iotop,
source build/envsetup.sh
lunch
选择一个与目标机器一致的就可以了,我这里是aosp¬_x86_eng,
编译好之后用lrzsz工具将编好的iotop可执行文件拷到本地再传到设备里,覆盖掉之前的iotop,然后顺利运行。
3. Iotop获取IO数据得方式
通过源码可以看到官方的iotop的核心获取数据逻辑在taskstats.cpp里面,主要是使用了GetStats这个函数,源码可见:taskstats.cpp,关键逻辑如下截图,
这里使用了linux/taskstats.h这个结构体,这里面定义了一些io属性,通过替换taskstats.cpp源码里的变量,实验后发现这些变量里没有可以表示IO历史记录的。源码可见:taskstats.h
4. 修改iotop,加上历史IO监控
Holding
5. Shell脚本Iotop获取数据的方式
读取了io下的write_bytes数据,这个值是保存了进程自创建以来的历史IO信息,存在虚拟内存中,进程被销毁重建后进程id会重新分配,因此进程被杀再启动,就会重新统计新pid的历史io数据。
小结
通过源码阅读和实验,android官方的iotop工具目前看来暂不支持获取IO历史数据。具体获取数据的方法需要阅读taskstats相关源码,深入linux内核去探查了,因为已经基本确定无法达到需求,笔者没有继续深入了。
参考
AndroidXref Pie 9.0.0_r3
记一次编译Android源码
Linux上传下载软件lrzsz
linux taskstats初探
taskstats.h源码
http://androidxref.com/9.0.0_r3/xref/system/extras/taskstats/taskstats.c