blktrace是一柄神器,很多工具都是基于该神器的:ioprof,seekwatcher,iowatcher,这个工具基本可以满足我们的对块设备请求的所有了解。
在将Q版本Android 刷入hikey 960 开发板后,本文讲述如何在系统中安装并使用blktrace。
一、blktrace简介:
一个I/O请求进入block layer之后,可能会经历下面的过程:
Remap: 可能被DM(Device Mapper)或MD(Multiple Device, Software RAID) remap到其它设备
Split: 可能会因为I/O请求与扇区边界未对齐、或者size太大而被分拆(split)成多个物理I/O
Merge: 可能会因为与其它I/O请求的物理位置相邻而合并(merge)成一个I/O
被IO Scheduler依照调度策略发送给driver
被driver提交给硬件,经过HBA、电缆(光纤、网线等)、交换机(SAN或网络)、最后到达存储设备,设备完成IO请求之后再把结果发回。
blktrace 能够记录下IO所经历的各个步骤
blktrace的输出:
第一个字段:8,0 这个字段是设备号 major device ID和minor device ID。
第二个字段:3 表示CPU
第三个字段:11 序列号
第四个字段:0.009507758 Time Stamp是时间偏移
第五个字段:PID 本次IO对应的进程ID
第六个字段:Event,这个字段非常重要,反映了IO进行到了那一步
第七个字段:R表示 Read, W是Write,D表示block,B表示Barrier Operation
第八个字段:223490+56,表示的是起始block number 和 number of blocks,即我们常说的Offset 和 Size
第九个字段: 进程名
其中第六个字段非常有用:每一个字母都代表了IO请求所经历的某个阶段。
Q – 即将生成IO请求
|
G – IO请求生成
|
I – IO请求进入IO Scheduler队列
|
D – IO请求进入driver
|
C – IO请求执行完毕
磁盘请求延迟:D-C (2020-On the Application Level Impact of SSD Performance Anomalies)
blkparse中分析的结果为:
M(合并的IO数Merges) Q(文件系统派发的IO数Queued)=A G(合并后下发的IO数Dispatches)=I(请求进入IO Scheduler队列)=D(请求进入driver)
二、编译blktrace源码
1、从Android源码的external/中找到blktrace文件夹,此目录即为blktrace源码,将其复制到Ubuntu系统中的某个文件夹下。
文件夹内容如图:
2、搭建NDK环境
a) 下载ndk安装包并解压(Ubuntu环境下)
下载地址
https://developer.android.com/ndk/downloads/index.html
b) 拷贝压缩包至/usr/local/lib
cp android-ndk-r16b-linux-x86_64.zip /usr/local/lib
cd /usr/local/lib
c) 解压后递归修改文件权限
chmod 777 android-ndk-r8b -R
d) 别忘了把NDK加入到环境变量中:
vim /etc/profile
里面加入:
export ANDROID_NDK="/usr/local/lib/android-ndk-r16b"
export PATH="$ANDROID_NDK:$PATH"
保存后,生效:
source profile
3、编译blktrace等工具
a) 将blktrace拷贝至任意目录(例 /home/qiwenjie/)
cp ~/Android_platform/external/blktrace/ /home/qiwenjie/
b) 修改Android.mk文件
将文件第一行的
BUILD_BLKTRACE := false
改为
BUILD_BLKTRACE:= true
c) 执行编译命令
cd /home/qiwenjie/blktrace/
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
编译完成的blktrace和blkparse保存在/home/qiwenjie/blktrace/libs/
其中有多个版本:
我们的hikey 960是ARM64架构的处理器,所以选择arm64-v8a的文件夹中的结果即可。
三、 将blktrace等工具导入手机
1、将960开发板通过TYPE-C连入PC的USB
2、启动adb,并查看设备是否正确连接
adb devices
3、 将blktrace等push入hikey960
我先将Ubuntu中生产的程序拷贝进我的Windows 10 中,在C:\Android_blktrace\arm64-v8a路径下
然后push进960的/sdcard:
adb push C:\Android_blktrace\arm64-v8a/blktrace /sdcard/
adb push C:\Android_blktrace\arm64-v8a/blktrace /sdcard/
4、 然后将blktrace,blkparse和most拷贝至手机的/system/xbin
如果报错:表示/system为只读文件系统
此时需要重新挂载,可以尝试以下指令来实现:
退出adb shell:
exit
依次输入:
adb root
adb disable-verity // 重点在这一步,取消验证即可,最新版的adb才支持此指令。
adb reboot a
adb root
adb remount
出现这个结果表示成功:
此时重新进入adb shell ,重新进行复制:
5、修改文件权限为可执行:
四、运行blktrace,并生产结果
1、查看hikey960 的分区
df -h
2、选择某个分区,在其上运行blktrace
比如我选择挂载在/data的/dev/block/sdd13分区:
运行:
blktrace -d /dev/block/sdd13 -w 60
-w 后面60代表blktrace运行60秒
运行结束:
3、使用blkparse解析结果
blkparse -i sdd13
也可将结果保存之某一文件中,比如1.txt
blkparse -i sdd13 > 1.txt
至此,大功告成~
谢谢!
补充:
切换实验平台:Nexus 9 (wifi)
需要在编译内核之前开启blktrace:
在内核源码的根目录下.config文件中将下列语句取消注释并修改:
CONFIG_BLK_DEV_IO_TRACE = y
编译后刷入平板,然后按照本教程即可。