文件系统-3-IO测试工具-3-ioblame-1-简介


一、ioblame 源码中 README 翻译

注: 翻译自 android/system/extras/ioblame/REAME


1. 这是什么?

ioblame 是一个 I/O 分析工具(I/O profiler)。它会详细列出正在运行的各个 PID 正在对哪些文件做 I/O(并给出每个文件上的聚合读写量)。目标是让应用开发者能够定位 I/O 较重的路径,进行优化,然后反复运行该工具来衡量优化效果 / I/O 降低情况。

ioblame 由一组内核文件系统 tracepoint 和一个脚本实现。


2. ioblame 的输出长什么样?

ioblame 提供两种视图。默认是文件视图(File view)。

(1) 文件视图(默认)

对每个文件,列出正在对该文件做 I/O 的 PID(也给出每个 PID 的 I/O 量,以及该文件被所有 PID 访问的聚合 I/O 量)。

示例:

File: /app/Chrome/Chrome.apk
            Chrome_ChildIOT Reads: 96 KB
            Chrome_DBThread Reads: 652 KB
            Chrome_FileUser Reads: 72 KB
            Chrome_InProcGp Reads: 732 KB
            Chrome_IOThread Reads: 1396 KB
            Compositor Reads: 652 KB
            CookieMonsterBa Reads: 284 KB
            CrRendererMain Reads: 17012 KB
            dboxed_process0 Reads: 512 KB
            JavaBridge Reads: 128 KB
            ogle.android.gm Reads: 14996 KB
            WorkerPool/8556 Reads: 408 KB
            Total Reads: 36940 KB i_size: 71354 KB
File: /app/Gmail2Light/Gmail2Light.apk
            AsyncTask_#2 Reads: 24 KB
            Chrome_IOThread Reads: 68 KB
            ogle.android.gm Reads: 1440 KB
            Thread-6 Reads: 8 KB
            Total Reads: 1540 KB i_size: 9736 KB

每行显示某线程/进程对该文件的 Reads(KB)。最后一行 Total Reads 是该文件总读量,i_size 是文件大小。

写(writes)同理。


(2) PID 视图(-v)

若要启用 PID 视图,使用 -v。

示例:

PID: CrRendererMain
            /app/Chrome/Chrome.apk Reads: 17012 KB i_size: 71354 KB
            /etc/fonts.xml Reads: 24 KB i_size: 22 KB
            /fonts/CarroisGothicSC-Regular.ttf Reads: 40 KB i_size: 39 KB
            /fonts/ComingSoon.ttf Reads: 60 KB i_size: 57 KB
            /fonts/CutiveMono.ttf Reads: 68 KB i_size: 67 KB
            /fonts/DancingScript-Bold.ttf Reads: 116 KB i_size: 112 KB
            /fonts/DancingScript-Regular.ttf Reads: 116 KB i_size: 113 KB
            /fonts/DroidSansMono.ttf Reads: 108 KB i_size: 105 KB
            /fonts/NotoColorEmoji.ttf Reads: 204 KB i_size: 7108 KB
            /fonts/NotoNaskhArabic-Bold.ttf Reads: 116 KB i_size: 113 KB
,,,
        /fonts/NotoSerif-BoldItalic.ttf Reads: 248 KB i_size: 256 KB
            /fonts/NotoSerif-Bold.ttf Reads: 244 KB i_size: 242 KB
            /fonts/NotoSerif-Italic.ttf Reads: 244 KB i_size: 243 KB
            /fonts/NotoSerif-Regular.ttf Reads: 244 KB i_size: 240 KB
            /fonts/Roboto-BlackItalic.ttf Reads: 256 KB i_size: 322 KB
            /fonts/Roboto-Black.ttf Reads: 256 KB i_size: 299 KB
            /fonts/Roboto-BoldItalic.ttf Reads: 256 KB i_size: 324 KB
            /fonts/RobotoCondensed-BoldItalic.ttf Reads: 256 KB i_size: 322 KB
            /fonts/RobotoCondensed-Bold.ttf Reads: 256 KB i_size: 296 KB
            /fonts/RobotoCondensed-Italic.ttf Reads: 256 KB i_size: 321 KB
            /fonts/RobotoCondensed-LightItalic.ttf Reads: 256 KB i_size: 324 KB
            /fonts/RobotoCondensed-Light.ttf Reads: 256 KB i_size: 295 KB
            /fonts/RobotoCondensed-MediumItalic.ttf Reads: 256 KB i_size: 322 KB
            /fonts/RobotoCondensed-Medium.ttf Reads: 256 KB i_size: 296 KB
            /fonts/Roboto-LightItalic.ttf Reads: 256 KB i_size: 324 KB
            /fonts/Roboto-MediumItalic.ttf Reads: 256 KB i_size: 323 KB
            /fonts/Roboto-Regular.ttf Reads: 88 KB i_size: 298 KB
            /fonts/Roboto-ThinItalic.ttf Reads: 256 KB i_size: 321 KB
            /fonts/Roboto-Thin.ttf Reads: 256 KB i_size: 300 KB
            /lib/libft2.so Reads: 56 KB i_size: 479 KB
            /lib/libicuuc.so Reads: 88 KB i_size: 1182 KB
            Total Reads: 32760 KB

按 PID 展示:每个 PID 下列出其访问过的文件,以及读写量。

写(writes)同理。

对于 -p(writepages)选项,ioblame 不会(也无法)告诉你原始写入来自哪个 app/pid。因为这类写很可能发生在 flush 线程或 VM 回收路径中(看来是异步写)。该模式下只能得到:
a. 文件路径;
b. 实际写出的数据量。

最后,它还会报告:
a. PID 层面的文件数据 I/O 总量;
b. 块设备层面的总 I/O 量;
这样可以观察 I/O 开销(例如块层预取、文件系统元数据开销等)。

详细示例见:
ioblame-gmail-launch.example //进程维度,读取哪些文件
ioblame-gmail-run.example //文件维度,被哪些进程读


3. 如何运行 ioblame?

ioblame -r:只关心读(reads)
ioblame -w:只关心写(writes)
ioblame -p:只关心 writepage(s)(mmap 写)
ioblame -r -w -p:同时关心 reads/writes/writepages
-v:增加 PID 视图

(1) 最常见方式是: 启动 ioblame, 然后去执行你关心的 app 操作,操作结束后,在 ioblame 上按一次 Ctrl+C
按一次 Ctrl+C 后,ioblame 会捕获信号,结束 sleep、停止 trace、处理 ftrace,并输出 app 的 I/O 统计。

示例:

srmohan0.mtv.corp.google.com> sh ioblame.sh  -r -w -p

按一次 Ctrl+C 后输出到 stdout。


(2) 有时,我们需要以不同的方式进行 I/O 分析(而不是运行某些代码后按 ^C 结束 ioblame 事件)。例如,我们可能需要对应用程序启动相关的 I/O 进行分析。这需要您对脚本进行一些修改,如下一段所述。

如果您需要对应用程序启动相关的 I/O 进行分析,则需要修改两个函数:`prep_to_do_something` 和 `do_something`。以下是修改这些函数的示例,以便更好地理解:

prep_to_do_something() {
    adb shell "am force-stop com.google.android.gm" # This line I added for example # stops the running app (gmail)
    adb shell 'echo 3 > /proc/sys/vm/drop_caches'
    sleep 1
}

do_something() {
    # 安排好程序,使第一个 SIGINT 信号能够终止子进程(休眠),但随后返回父进程。
#    trap 'catch_sigint'  INT
#    echo "OK to kill sleep when test is done"
#    sleep 1d
    # 为了便于演示,我注释掉了上面三行代码,这三行代码原本会导致 ioblame 在捕获到 SIGINT 信号后一直休眠,
    # 现在它会启动 Gmail,并等待启动完成。启动完成后,ioblame 将停止跟踪,并处理跟踪数据。
    adb shell "am start -W -n com.google.android.gm/.ConversationListActivityGmail"
}


4. 限制

ioblame 内核跟踪点目前仅涵盖 getpage(s) 路径(即所有文件系统读取)和文件系统 write() 系统调用。putpage(s) 路径没有跟踪点。这是因为调用 putpage(s) 时,我们通常无法确定是哪个线程/进程 ID 修改了正在写入的页面,因为大多数 putpage(s) 操作都来自 flush 线程或 pageout 线程。因此,ioblame 不会报告 mmap 写入操作####。实际上,虽然 mmap 读取操作非常常见,但 mmap 写入操作却很少见。


5. 所需内核补丁:

ioblame 需要使用以下 3 个内核补丁来修补内核。如果没有这些补丁,ioblame 将完全无法工作。

commit ae2f6765db98e2fcb99082e336dd8b24e7644620
Author: Mohan Srinivasan <srmohan@google.com>
Date:   Fri Mar 10 16:08:30 2017 -0800

    ANDROID: Replace spaces by '_' for some android filesystem tracepoints.

    Andoid files frequently have spaces in them, as do cmdline strings.
    Replace these spaces with '_', so tools that parse these tracepoints
    don't get terribly confused.

    Change-Id: I1cbbedf5c803aa6a58d9b8b7836e9125683c49d1
    Signed-off-by: Mohan Srinivasan <srmohan@google.com>
    (cherry picked from commit 5035d5f0933758dd515327d038e5bef7e40dbaa7)

commit a2a04ea83d2960867324fa059ba1eedc2fc7784e (HEAD -> android-4.4)
Author: Mohan Srinivasan <srmohan@google.com>
Date:   Fri Feb 3 15:48:03 2017 -0800

    ANDROID: Refactor fs readpage/write tracepoints.

    Refactor the fs readpage/write tracepoints to move the
    inode->path lookup outside the tracepoint code, and pass a pointer
    to the path into the tracepoint code instead. This is necessary
    because the tracepoint code runs non-preemptible. Thanks to
    Trilok Soni for catching this in 4.4.

    Change-Id: I7486c5947918d155a30c61d6b9cd5027cf8fbe15
    Signed-off-by: Mohan Srinivasan <srmohan@google.com>

commit 32cbbe59538d2dd0b77822cc27ce32ca487c467d
Author: Mohan Srinivasan <srmohan@google.com>
Date:   Mon Sep 19 17:33:50 2016 -0700

    ANDROID: fs: FS tracepoints to track IO.

    Adds tracepoints in ext4/f2fs/mpage to track readpages/buffered
    write()s. This allows us to track files that are being read/written
    to PIDs.

    Change-Id: I26bd36f933108927d6903da04d8cb42fd9c3ef3d
    Signed-off-by: Mohan Srinivasan <srmohan@google.com>

三个补丁依次:
(1) 将部分 Android 文件系统 tracepoint 中的空格替换为 _,避免解析工具混淆。
(2) 重构 fs readpage/write tracepoint:把 inode->path 查找移出 tracepoint 代码。
(3) 在 ext4/f2fs/mpage 增加 tracepoint 以跟踪 readpages / buffered write。

另外,-w(writepages)选项还需要额外补丁(目前仅 f2fs):

commit c60bc59c6af4fbdeaf7bbeaebee6b55d9e488324 (HEAD ->
android-mtk-gobo-3.18)
Author: Mohan Srinivasan <srmohan@google.com>
Date:   Fri Sep 8 13:53:01 2017 -0700

    Tracepoints in f2fs data writepage(s).

    Tracepoints f2fs writepage(s). This is experimental (for now).
    Allowing ioblame to track <pathname, amount of data written>
    for files.

    Signed-off-by: Mohan Srinivasan <srmohan@google.com>
    Change-Id: I4c76c6f442e0a2c5872225f8113935f9f368cc64

此补丁增加 f2fs data writepage(s) tracepoint,使 ioblame 能跟踪文件写出量(实验性)。

 

二、ioblame源码分析

1. 源码位置

android/system/extras/ioblame$ tree
.
├── Android.bp
├── ioblame-gmail-launch.example
├── ioblame-gmail-run.example
├── ioblame.sh
└── README

只有一个shell脚本, 这个是运行在 ubuntu 上的shell脚本,可以将里面的adb给裁掉,然后直接跑在开发板上。

脚本里访问了下面这些节点:

/dev/block/platform
/proc/diskstats
/sys/kernel/debug/f2fs/status
/sys/kernel/debug/tracing/events/android_fs
echo 3 > /proc/sys/vm/drop_caches

 

posted on 2026-07-01 11:17  Hello-World3  阅读(1)  评论(0)    收藏  举报

导航