Home | History | Annotate | Download | only in ioblame
      1 What is it ?
      2 ----------
      3 ioblame is a IO profiler. It gives a detailed listing of the list of
      4 files that running pids are doing IO to (with the aggregate amount of
      5 read/write to each file). The goal is that using this tool, app
      6 developers can identify IO heavy paths, and tune them, then
      7 iteratively run this tool again to measure improvements/IO reduction.
      8 
      9 ioblame is implemented as a collection of kernel filesystem
     10 tracepoints, and a script.
     11 
     12 What does the output from ioblame look like ?
     13 -------------------------------------------
     14 ioblame gives 2 different views.
     15 
     16 File view is the default.
     17 
     18 1) File view : For each file, it gives a list of pids that are doing
     19 IO on that file (it also gives the amount of IO each pid does and
     20 the aggregate amount of IO done to the file by all pids).
     21 
     22 File: /app/Chrome/Chrome.apk
     23             Chrome_ChildIOT Reads: 96 KB
     24             Chrome_DBThread Reads: 652 KB
     25             Chrome_FileUser Reads: 72 KB
     26             Chrome_InProcGp Reads: 732 KB
     27             Chrome_IOThread Reads: 1396 KB
     28             Compositor Reads: 652 KB
     29             CookieMonsterBa Reads: 284 KB
     30             CrRendererMain Reads: 17012 KB
     31             dboxed_process0 Reads: 512 KB
     32             JavaBridge Reads: 128 KB
     33             ogle.android.gm Reads: 14996 KB
     34             WorkerPool/8556 Reads: 408 KB
     35             Total Reads: 36940 KB i_size: 71354 KB
     36 File: /app/Gmail2Light/Gmail2Light.apk
     37             AsyncTask_#2 Reads: 24 KB
     38             Chrome_IOThread Reads: 68 KB
     39             ogle.android.gm Reads: 1440 KB
     40             Thread-6 Reads: 8 KB
     41             Total Reads: 1540 KB i_size: 9736 KB
     42 
     43 And ditto for writes.
     44 
     45 To enable PID view, use -v
     46 
     47 PID: CrRendererMain
     48             /app/Chrome/Chrome.apk Reads: 17012 KB i_size: 71354 KB
     49             /etc/fonts.xml Reads: 24 KB i_size: 22 KB
     50             /fonts/CarroisGothicSC-Regular.ttf Reads: 40 KB i_size: 39 KB
     51             /fonts/ComingSoon.ttf Reads: 60 KB i_size: 57 KB
     52             /fonts/CutiveMono.ttf Reads: 68 KB i_size: 67 KB
     53             /fonts/DancingScript-Bold.ttf Reads: 116 KB i_size: 112 KB
     54             /fonts/DancingScript-Regular.ttf Reads: 116 KB i_size: 113 KB
     55             /fonts/DroidSansMono.ttf Reads: 108 KB i_size: 105 KB
     56             /fonts/NotoColorEmoji.ttf Reads: 204 KB i_size: 7108 KB
     57             /fonts/NotoNaskhArabic-Bold.ttf Reads: 116 KB i_size: 113 KB
     58 ,,,
     59 	    /fonts/NotoSerif-BoldItalic.ttf Reads: 248 KB i_size: 256 KB
     60             /fonts/NotoSerif-Bold.ttf Reads: 244 KB i_size: 242 KB
     61             /fonts/NotoSerif-Italic.ttf Reads: 244 KB i_size: 243 KB
     62             /fonts/NotoSerif-Regular.ttf Reads: 244 KB i_size: 240 KB
     63             /fonts/Roboto-BlackItalic.ttf Reads: 256 KB i_size: 322 KB
     64             /fonts/Roboto-Black.ttf Reads: 256 KB i_size: 299 KB
     65             /fonts/Roboto-BoldItalic.ttf Reads: 256 KB i_size: 324 KB
     66             /fonts/RobotoCondensed-BoldItalic.ttf Reads: 256 KB i_size: 322 KB
     67             /fonts/RobotoCondensed-Bold.ttf Reads: 256 KB i_size: 296 KB
     68             /fonts/RobotoCondensed-Italic.ttf Reads: 256 KB i_size: 321 KB
     69             /fonts/RobotoCondensed-LightItalic.ttf Reads: 256 KB i_size: 324 KB
     70             /fonts/RobotoCondensed-Light.ttf Reads: 256 KB i_size: 295 KB
     71             /fonts/RobotoCondensed-MediumItalic.ttf Reads: 256 KB i_size: 322 KB
     72             /fonts/RobotoCondensed-Medium.ttf Reads: 256 KB i_size: 296 KB
     73             /fonts/Roboto-LightItalic.ttf Reads: 256 KB i_size: 324 KB
     74             /fonts/Roboto-MediumItalic.ttf Reads: 256 KB i_size: 323 KB
     75             /fonts/Roboto-Regular.ttf Reads: 88 KB i_size: 298 KB
     76             /fonts/Roboto-ThinItalic.ttf Reads: 256 KB i_size: 321 KB
     77             /fonts/Roboto-Thin.ttf Reads: 256 KB i_size: 300 KB
     78             /lib/libft2.so Reads: 56 KB i_size: 479 KB
     79             /lib/libicuuc.so Reads: 88 KB i_size: 1182 KB
     80             Total Reads: 32760 KB
     81 
     82 And ditto for writes.
     83 
     84 For the -p, writepages option, ioblame does not (and cannot) give you
     85 the app/pid that did the original write (since the write most likely
     86 happens from a flush thread or VM reclaim). In this mode, we only get
     87 the pathname of the file and the amount of data written out.
     88 
     89 Finally, it reports the total amount of file data IO done by pids and
     90 the total IO done to the block device. So we can look at IO overheads
     91 (eg block level prefetching, filesystem metadata overhead etc).
     92 
     93 For detailed examples, look at ioblame-gmail-launch.example and
     94 ioblame-gmail-run.example.
     95 
     96 How do I run ioblame ?
     97 --------------------
     98 ioblame -r	[ I am only interested in reads ]
     99 ioblame -w	[ I am only interested in writes ]
    100 ioblame -p	[ I am only interested in writepage(s) - mmap'ed writes ]
    101 ioblame -r -w -p [ I am only interested in reads, writes and writepages ]
    102 and finally, -v adds the PID view
    103 
    104 1) The most common way of running ioblame is to start ioblame, then go
    105 off and launch the app(s) of interest, do interesting stuff with the
    106 app(s), and when finished with the app, hit ^C ONCE on
    107 ioblame. Hitting ^C once will cause ioblame to catch the signal, break
    108 out of the sleep, terminate its tracing, and process the ftraces and
    109 dump out IO stats for the app.
    110 
    111 example :
    112 
    113 srmohan0.mtv.corp.google.com> sh ioblame.sh  -r -w -p
    114 Found aosp_gobo Device
    115 OK to kill sleep when test is done
    116 ^Csignal INT received, killing streaming trace capture
    117 
    118 (at this point, run your apps, when done type ^C ONCE) and output will
    119 appear on stdout.
    120 
    121 2) Sometimes, we want to do IO profiling in a different way (instead of
    122 running something and then hitting ^C on ioblame). For instance, we
    123 might want to do IO profiling related to the launch of an App. This
    124 requires you to modify the script slightly, as described in the next
    125 paragraph.
    126 
    127 If you want to do IO profiling related to App launch, you need to modify
    128 2 functions - prep_to_do_something and do_something. Again examples of
    129 changes to these functions clarifies things better :
    130 
    131 prep_to_do_something() {
    132     adb shell "am force-stop com.google.android.gm" # This line I added for example
    133     	      	  	     			    # stops the running app (gmail)
    134     adb shell 'echo 3 > /proc/sys/vm/drop_caches'
    135     sleep 1
    136 }
    137 
    138 do_something() {
    139     # Arrange things so that the first SIGINT will kill the
    140     # child process (sleep), but will return to the parent.
    141 #    trap 'catch_sigint'  INT
    142 #    echo "OK to kill sleep when test is done"
    143 #    sleep 1d
    144      # For the purpose of this example, I commented out the above 3 lines that
    145      # make ioblame sleep forever after catching the SIGINT and instead it launches
    146      # gmail, waiting for launch to complete. When launch completes, ioblame will
    147      # stop tracing, and process the traces
    148     adb shell "am start -W -n com.google.android.gm/.ConversationListActivityGmail"
    149 }
    150 
    151 Limitations :
    152 -----------
    153 The ioblame kernel tracepoints currently only cover the getpage(s)
    154 path (so all filesystem reads) and filesystem write() syscalls. There
    155 are no tracepoints in the putpage(s) paths. This is because when
    156 putpage(s) is called, we most often cannot tell which thread/pid has
    157 dirtied the page that is being written out, because the majority of
    158 putpage(s) happen from the flush threads or from the pageout
    159 threads. The upshot of this is the mmap'ed writes are not reported by
    160 ioblame. In practice, while mmap'ed reads are very common, mmap'ed
    161 writes are infrequent.
    162 
    163 Kernel Patches Required :
    164 -----------------------
    165 ioblame needs the kernel to be patched with these 3 kernel patches.
    166 Without these patches, ioblame won't work at all.
    167 
    168 commit ae2f6765db98e2fcb99082e336dd8b24e7644620
    169 Author: Mohan Srinivasan <srmohan (a] google.com>
    170 Date:   Fri Mar 10 16:08:30 2017 -0800
    171 
    172     ANDROID: Replace spaces by '_' for some android filesystem tracepoints.
    173 
    174     Andoid files frequently have spaces in them, as do cmdline strings.
    175     Replace these spaces with '_', so tools that parse these tracepoints
    176     don't get terribly confused.
    177 
    178     Change-Id: I1cbbedf5c803aa6a58d9b8b7836e9125683c49d1
    179     Signed-off-by: Mohan Srinivasan <srmohan (a] google.com>
    180     (cherry picked from commit 5035d5f0933758dd515327d038e5bef7e40dbaa7)
    181 
    182 commit a2a04ea83d2960867324fa059ba1eedc2fc7784e (HEAD -> android-4.4)
    183 Author: Mohan Srinivasan <srmohan (a] google.com>
    184 Date:   Fri Feb 3 15:48:03 2017 -0800
    185 
    186     ANDROID: Refactor fs readpage/write tracepoints.
    187 
    188     Refactor the fs readpage/write tracepoints to move the
    189     inode->path lookup outside the tracepoint code, and pass a pointer
    190     to the path into the tracepoint code instead. This is necessary
    191     because the tracepoint code runs non-preemptible. Thanks to
    192     Trilok Soni for catching this in 4.4.
    193 
    194     Change-Id: I7486c5947918d155a30c61d6b9cd5027cf8fbe15
    195     Signed-off-by: Mohan Srinivasan <srmohan (a] google.com>
    196 
    197 commit 32cbbe59538d2dd0b77822cc27ce32ca487c467d
    198 Author: Mohan Srinivasan <srmohan (a] google.com>
    199 Date:   Mon Sep 19 17:33:50 2016 -0700
    200 
    201     ANDROID: fs: FS tracepoints to track IO.
    202 
    203     Adds tracepoints in ext4/f2fs/mpage to track readpages/buffered
    204     write()s. This allows us to track files that are being read/written
    205     to PIDs.
    206 
    207     Change-Id: I26bd36f933108927d6903da04d8cb42fd9c3ef3d
    208     Signed-off-by: Mohan Srinivasan <srmohan (a] google.com>
    209 
    210 The -w (writepages) option requires this additional patch and
    211 currently only with f2fs.
    212 
    213 commit c60bc59c6af4fbdeaf7bbeaebee6b55d9e488324 (HEAD ->
    214 android-mtk-gobo-3.18)
    215 Author: Mohan Srinivasan <srmohan (a] google.com>
    216 Date:   Fri Sep 8 13:53:01 2017 -0700
    217 
    218     Tracepoints in f2fs data writepage(s).
    219 
    220     Tracepoints f2fs writepage(s). This is experimental (for now).
    221     Allowing ioblame to track <pathname, amount of data written>
    222     for files.
    223 
    224     Signed-off-by: Mohan Srinivasan <srmohan (a] google.com>
    225     Change-Id: I4c76c6f442e0a2c5872225f8113935f9f368cc64
    226