“Blktrace”的版本间的差异
来自百问网嵌入式Linux wiki
Zhouyuebiao(讨论 | 贡献) 标签:visualeditor-switched |
|||
第1行: | 第1行: | ||
+ | =Blktrace= | ||
+ | ==文章目的== | ||
+ | 本文提供了开始使用Linux工具所需的基本信息:blktrace [1 ](块跟踪器)。 | ||
+ | |||
+ | ==简介== | ||
+ | : 下表简要介绍了该工具及其可用性,具体取决于软件包: | ||
+ | * 是:该工具已经存在(可以使用或激活),也可以在软件包中集成和激活。 | ||
+ | * 没有:该工具不存在且无法集成,或者存在但无法在软件包中激活。 | ||
+ | {| class="wikitable" | ||
+ | !colspan="3" | 工具 | ||
+ | |- | ||
+ | | 名称 | ||
+ | | 类别 | ||
+ | | 目的 | ||
+ | |- | ||
+ | |blktrace | ||
+ | |追踪工具 | ||
+ | |blktrace [1 ]生成对块设备(SD卡,USB,eMMC ...) 上的I/O流量的跟踪 | ||
+ | |- | ||
+ | !colspan="3" | STM32MPU嵌入式软件发行版 | ||
+ | |- | ||
+ | | 入门资料包 | ||
+ | | 开发者资料包 | ||
+ | | 发行版资料包 | ||
+ | |- | ||
+ | |没有 | ||
+ | |是 | ||
+ | |是 | ||
+ | |- | ||
+ | !colspan="3" | 适用于 Android 的STM32MPU嵌入式软件发行版 | ||
+ | |- | ||
+ | | 入门资料包 | ||
+ | | 开发者资料包 | ||
+ | | 发行版资料包 | ||
+ | |- | ||
+ | |没有 | ||
+ | |没有 | ||
+ | |是 | ||
+ | |} | ||
+ | |||
+ | |||
+ | : blktrace工具由三个主要组件组成: | ||
+ | * 一个内核 | ||
+ | * 在用户空间上记录来自内核的 I/O 跟踪信息的实用程序 | ||
+ | * 实用程序来分析和查看跟踪信息。 | ||
+ | |||
+ | : blkparse [2 ]也与blktrace关联。它从blktrace实用程序获取原始输出,并将其转换为格式良好且易于阅读的格式。 | ||
+ | ==在目标板上安装跟踪和调试工具== | ||
+ | : 它包括将blktrace二进制文件放在rootfs中,并修改Linux内核配置。 | ||
+ | |||
+ | : 为了使用blktrace,Linux内核配置必须使用Linux内核menuconfig工具激活CONFIG_BLK_DEV_ IO _TRACE: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Symbol: BLK_DEV_IO_TRACE | ||
+ | Location: | ||
+ | Kernel Hacking ---> | ||
+ | [*] Tracers ---> | ||
+ | [*] Support for tracing block I/O actions | ||
+ | </syntaxhighlight> | ||
+ | ===使用STM32MPU嵌入式软件发行版=== | ||
+ | : 默认情况下,所有STM32MPU嵌入式软件包中都提供blktrace二进制文件: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Board $> which blktrace | ||
+ | /usr/bin/blktrace | ||
+ | </syntaxhighlight> | ||
+ | : 通过openembedded-core软件包将其集成到weston镜像分发中: openembedded-core/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb 。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | RRECOMMENDS_${PN} = "\ | ||
+ | ${PERF} \ | ||
+ | trace-cmd \ | ||
+ | blktrace \ | ||
+ | ${PROFILE_TOOLS_X} \ | ||
+ | ${PROFILE_TOOLS_SYSTEMD} \ | ||
+ | " | ||
+ | </syntaxhighlight> | ||
+ | ====入门包==== | ||
+ | : 不适用,因为无法更新Linux内核配置。 | ||
+ | |||
+ | ====开发人员软件包==== | ||
+ | : 要在Linux内核配置中启用CONFIG_BLK_DEV_IO_TRACE,请参考 [https://wiki.st.com/stm32mpu/wiki/Menuconfig_or_how_to_configure_kernel Menuconfig 或如何配置内核]。 本文提供了有关在Developer Package上下文中修改配置和重新编译Linux内核镜像的说明。 | ||
+ | |||
+ | ====分发包==== | ||
+ | : 要在Linux内核配置中启用CONFIG_BLK_DEV_IO_TRACE,请参考 [https://wiki.st.com/stm32mpu/wiki/Menuconfig_or_how_to_configure_kernel Menuconfig 或如何配置内核]。 本文提供了有关在“分发程序包”上下文中修改配置和重新编译Linux内核镜像的说明。 | ||
+ | |||
+ | ===使用适用于 Android 的STM32MPU嵌入式软件=== | ||
+ | : 该blktrace二进制是默认不可用的的全部Android STM32MPU嵌入式软件的软件包,所以必须加入。 | ||
+ | |||
+ | ====入门包==== | ||
+ | : 不适用,因为无法更新Linux内核配置。 | ||
+ | |||
+ | ====开发人员软件包==== | ||
+ | : 不适用,因为无法更新Linux内核配置。 | ||
+ | |||
+ | ====分发包==== | ||
+ | : 要在Linux内核配置中启用CONFIG_BLK_DEV_IO_TRACE,请参阅[https://wiki.st.com/stm32mpu/wiki/How_to_customize_kernel_for_Android 如何为Android定制内核]。 本文提供了有关在Android分发包中修改配置并重新编译Linux内核镜像的说明。 | ||
+ | : blktrace源代码模块在中可用external/blktrace。 | ||
+ | |||
+ | : 编译(确保正确设置了构建环境): | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | PC $> cd $ANDROID_BUILD_TOP | ||
+ | PC $> mma blktrace | ||
+ | </syntaxhighlight> | ||
+ | : 检查blktrace二进制文件在系统镜像中是否可用: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | PC $> ls out/target/product/<BoardId>/system/bin/blktrace | ||
+ | </syntaxhighlight> | ||
+ | : 将二进制文件推送到远程目标文件系统: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | # Remount first the target file system with write access | ||
+ | PC $> adb root; adb remount | ||
+ | PC $> adb sync | ||
+ | </syntaxhighlight> | ||
+ | ==使用入门== | ||
+ | : 从blktrace开始,跟踪已安装的块设备上的I/O流量(以块设备为例进行说明,该设备 /dev/mmcblk0p6 安装为 /usr/local): | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Board $> mount | grep mmcblk | ||
+ | /dev/mmcblk0p5 on / type ext4 (rw,relatime,data=ordered) | ||
+ | /dev/mmcblk0p4 on /boot type ext4 (rw,relatime,data=ordered) | ||
+ | /dev/mmcblk0p6 on /usr/local type ext4 (rw,relatime,data=ordered) | ||
+ | </syntaxhighlight> | ||
+ | : 在后台启动blktrace工具: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Board $> blktrace -d /dev/mmcblk0p6 & | ||
+ | </syntaxhighlight> | ||
+ | : 读取 /usr/local 的内容(它生成对关联块设备的读取访问权限): | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Board $> ls -la /usr/local | ||
+ | </syntaxhighlight> | ||
+ | : 将 blktrace 活动放在前台,然后按组合键 Ctrl + C 停止它: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Board $> fg | ||
+ | blktrace -d /dev/mmcblk0p6 | ||
+ | Board $> <Ctrl-C> | ||
+ | ^C=== mmcblk0p6 === | ||
+ | CPU 0: 98 events, 5 KiB data | ||
+ | CPU 1: 79 events, 4 KiB data | ||
+ | Total: 177 events (dropped 0), 9 KiB data | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | : 注意:以下信息与 Android 发行版相关,因为文件系统为只读,因此必须使用 ADB。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | PC $> adb root; adb remount | ||
+ | PC $> adb shell | ||
+ | Board $> ... | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | : 有关blktrace使用的详细指导,请参考手册页[1 ]或帮助信息: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Board $> blktrace --help | ||
+ | Usage: blktrace | ||
+ | |||
+ | -d <dev> | --dev=<dev> | ||
+ | [ -r <debugfs path> | --relay=<debugfs path> ] | ||
+ | [ -o <file> | --output=<file>] | ||
+ | [ -D <dir> | --output-dir=<dir> | ||
+ | [ -w | --stopwatch=] | ||
+ | [ -a <action field> | --act-mask=<action field>] | ||
+ | [ -A <action mask> | --set-mask=<action mask>] | ||
+ | [ -b <size> | --buffer-size] | ||
+ | [ -n <number> | --num-sub-buffers=<number>] | ||
+ | [ -l | --listen] | ||
+ | [ -h <hostname> | --host=<hostname>] | ||
+ | [ -p <port number> | --port=<port number>] | ||
+ | [ -s | --no-sendfile] | ||
+ | [ -I <devs file> | --input-devs=<devs file>] | ||
+ | [ -v <version> | --version] | ||
+ | [ -V <version> | --version] | ||
+ | -d Use specified device. May also be given last after options | ||
+ | -r Path to mounted debugfs, defaults to /sys/kernel/debug | ||
+ | -o File(s) to send output to | ||
+ | -D Directory to prepend to output file names | ||
+ | -w Stop after defined time, in seconds | ||
+ | -a Only trace specified actions. See documentation | ||
+ | -A Give trace mask as a single value. See documentation | ||
+ | -b Sub buffer size in KiB (default 512) | ||
+ | -n Number of sub buffers (default 4) | ||
+ | -l Run in network listen mode (blktrace server) | ||
+ | -h Run in network client mode, connecting to the given host | ||
+ | -p Network port to use (default 8462) | ||
+ | -s Make the network client NOT use sendfile() to transfer data | ||
+ | -I Add devices found in <devs file> | ||
+ | -v Print program version info | ||
+ | -V Print program version info | ||
+ | </syntaxhighlight> | ||
+ | : 要开始使用 blktrace,您还可以参考 Yocto Project Wiki 页面上的 blktrace [3],其中提供了更多详细信息以及示例。 | ||
+ | ==深入学习== | ||
+ | ===blkparse的用法=== | ||
+ | : 除了在控制台上为用户显示信息之外,blktrace还创建跟踪文件(每个CPU一个),可以使用blkparse查看该文件。这些文件存储在当前路径目录下。 | ||
+ | <syntaxhighlight lang="bash">Board $> blkparse mmcblk0p6 | ||
+ | Input file mmcblk0p6.blktrace.0 added | ||
+ | Input file mmcblk0p6.blktrace.1 added | ||
+ | 179,6 0 1 0.000000000 99 P N [jbd2/mmcblk0p5-] | ||
+ | 179,6 0 0 0.000337792 0 m N cfq99SN insert_request | ||
+ | 179,6 0 0 0.000344292 0 m N cfq99SN add_to_rr | ||
+ | 179,6 0 0 0.000366250 0 m N cfq99SN insert_request | ||
+ | 179,6 0 0 0.000374792 0 m N cfq99SN insert_request | ||
+ | 179,6 0 0 0.000382458 0 m N cfq99SN insert_request | ||
+ | 179,6 0 0 0.000390167 0 m N cfq99SN insert_request | ||
+ | 179,6 0 2 0.000396625 99 U N [jbd2/mmcblk0p5-] 5 | ||
+ | 179,6 0 0 0.000452542 0 m N cfq workload slice:150000000 | ||
+ | 179,6 0 0 0.000460750 0 m N cfq99SN set_active wl_class:0 wl_type:1 | ||
+ | 179,6 0 0 0.000469083 0 m N cfq99SN dispatch_insert | ||
+ | 179,6 0 0 0.000478500 0 m N cfq99SN dispatched a request | ||
+ | 179,6 0 0 0.000484583 0 m N cfq99SN activate rq, drv=1 | ||
+ | 179,6 0 0 0.000747292 0 m N cfq99SN dispatch_insert | ||
+ | 179,6 0 0 0.000755042 0 m N cfq99SN dispatched a request | ||
+ | 179,6 0 0 0.000759708 0 m N cfq99SN activate rq, drv=2 | ||
+ | 179,6 0 0 0.004197583 0 m N cfq99SN complete rqnoidle 1 | ||
+ | 179,6 0 0 0.004206958 0 m N cfq99SN set_slice=120000000 | ||
+ | 179,6 0 0 0.004231917 0 m N cfq99SN dispatch_insert | ||
+ | 179,6 0 0 0.004239208 0 m N cfq99SN dispatched a request | ||
+ | 179,6 0 0 0.004243958 0 m N cfq99SN activate rq, drv=2 | ||
+ | 179,6 0 0 0.006287958 0 m N cfq99SN complete rqnoidle 1 | ||
+ | 179,6 0 0 0.006305208 0 m N cfq99SN dispatch_insert | ||
+ | 179,6 0 0 0.006310542 0 m N cfq99SN dispatched a request | ||
+ | 179,6 0 0 0.006315417 0 m N cfq99SN activate rq, drv=2 | ||
+ | 179,6 0 0 0.008340833 0 m N cfq99SN complete rqnoidle 1 | ||
+ | 179,6 0 0 0.008359000 0 m N cfq99SN dispatch_insert | ||
+ | 179,6 0 0 0.008365083 0 m N cfq99SN dispatched a request | ||
+ | 179,6 0 0 0.008370000 0 m N cfq99SN activate rq, drv=2 | ||
+ | 179,6 0 0 0.011504375 0 m N cfq99SN complete rqnoidle 1 | ||
+ | 179,6 0 0 0.014671667 0 m N cfq99SN insert_request | ||
+ | 179,6 0 0 0.014727458 0 m N cfq99SN complete rqnoidle 1 | ||
+ | 179,6 0 0 0.014731250 0 m N cfq schedule dispatch | ||
+ | 179,6 0 0 0.014808000 0 m N cfq99SN dispatch_insert | ||
+ | 179,6 0 0 0.014813875 0 m N cfq99SN dispatched a request | ||
+ | 179,6 0 0 0.014819958 0 m N cfq99SN activate rq, drv=1 | ||
+ | 179,6 0 0 0.017068708 0 m N cfq99SN complete rqnoidle 1 | ||
+ | 179,6 0 0 0.017078375 0 m N cfq schedule dispatch | ||
+ | 179,0 0 3 5.759777419 193 A WS 1706892 + 2 <- (179,6) 32778 | ||
+ | 179,6 0 4 5.759784878 193 Q WS 1706892 + 2 [jbd2/mmcblk0p6-] | ||
+ | 179,6 0 5 5.759849336 193 G WS 1706892 + 2 [jbd2/mmcblk0p6-] | ||
+ | 179,6 0 6 5.759854253 193 P N [jbd2/mmcblk0p6-] | ||
+ | 179,6 1 1 5.759855044 99 P N [jbd2/mmcblk0p5-] | ||
+ | 179,0 0 7 5.759887628 193 A WS 1706894 + 2 <- (179,6) 32780 | ||
+ | 179,6 0 8 5.759893919 193 Q WS 1706894 + 2 [jbd2/mmcblk0p6-] | ||
+ | 179,6 0 9 5.759947753 193 G WS 1706894 + 2 [jbd2/mmcblk0p6-] | ||
+ | 179,6 1 0 5.759975503 0 m N cfq99SN insert_request | ||
+ | 179,6 1 0 5.759990336 0 m N cfq99SN insert_request | ||
+ | 179,6 1 2 5.759999253 99 U N [jbd2/mmcblk0p5-] 2 | ||
+ | 179,6 0 10 5.760024669 193 I WS 1706892 + 2 [jbd2/mmcblk0p6-] | ||
+ | 179,6 0 0 5.760035461 0 m N cfq193SN insert_request | ||
+ | 179,6 0 0 5.760041711 0 m N cfq193SN add_to_rr | ||
+ | 179,6 0 0 5.760053169 0 m N cfq193SN preempt | ||
+ | 179,6 0 0 5.760059253 0 m N cfq99SN slice expired t=1 | ||
+ | 179,6 0 0 5.760066503 0 m N cfq99SN resid=-5635859836 | ||
+ | 179,6 0 0 5.760081503 0 m N cfq99SN sl_used=120000000 disp=6 charge=120000000 iops=0 sect=12 | ||
+ | 179,6 0 11 5.760087294 193 I WS 1706894 + 2 [jbd2/mmcblk0p6-] | ||
+ | 179,6 0 0 5.760091586 0 m N cfq193SN insert_request | ||
+ | 179,6 0 12 5.760096294 193 U N [jbd2/mmcblk0p6-] 2 | ||
+ | 179,6 1 0 5.760111211 0 m N cfq workload slice:300000000 | ||
+ | 179,6 1 0 5.760118086 0 m N cfq193SN set_active wl_class:0 wl_type:1 | ||
+ | 179,6 1 0 5.760125669 0 m N cfq193SN dispatch_insert | ||
+ | 179,6 1 0 5.760133128 0 m N cfq193SN dispatched a request | ||
+ | 179,6 1 0 5.760137711 0 m N cfq193SN activate rq, drv=1 | ||
+ | 179,6 1 3 5.760145253 80 D WS 1706892 + 2 [mmcqd/0] | ||
+ | 179,6 1 0 5.760393003 0 m N cfq193SN dispatch_insert | ||
+ | 179,6 1 0 5.760399961 0 m N cfq193SN dispatched a request | ||
+ | 179,6 1 0 5.760404128 0 m N cfq193SN activate rq, drv=2 | ||
+ | 179,6 1 4 5.760408211 80 D WS 1706894 + 2 [mmcqd/0] | ||
+ | 179,6 1 5 5.764367836 80 C WS 1706892 + 2 [0] | ||
+ | 179,6 1 0 5.764403128 0 m N cfq193SN complete rqnoidle 1 | ||
+ | 179,6 1 0 5.764412461 0 m N cfq193SN set_slice=120000000 | ||
+ | 179,6 1 0 5.764439169 0 m N cfq193SN slice expired t=0 | ||
+ | 179,6 1 0 5.764450253 0 m N cfq193SN sl_used=33750 disp=2 charge=33750 iops=0 sect=4 | ||
+ | 179,6 1 0 5.764456836 0 m N cfq193SN del_from_rr | ||
+ | 179,6 1 0 5.764464711 0 m N cfq99SN set_active wl_class:0 wl_type:1 | ||
+ | 179,6 1 0 5.764470211 0 m N cfq99SN dispatch_insert | ||
+ | 179,6 1 0 5.764475669 0 m N cfq99SN dispatched a request | ||
+ | 179,6 1 0 5.764479378 0 m N cfq99SN activate rq, drv=2 | ||
+ | 179,6 1 6 5.767516794 80 C WS 1706894 + 2 [0] | ||
+ | 179,6 1 0 5.767546961 0 m N cfq193SN complete rqnoidle 1 | ||
+ | 179,6 1 0 5.767564836 0 m N cfq99SN dispatch_insert | ||
+ | 179,6 1 0 5.767571086 0 m N cfq99SN dispatched a request | ||
+ | 179,6 1 0 5.767575628 0 m N cfq99SN activate rq, drv=2 | ||
+ | 179,0 0 13 5.767654378 193 A FWFS 1706896 + 2 <- (179,6) 32782 | ||
+ | 179,6 0 14 5.767662669 193 Q WS 1706896 + 2 [jbd2/mmcblk0p6-] | ||
+ | 179,6 0 15 5.767726461 193 G WS 1706896 + 2 [jbd2/mmcblk0p6-] | ||
+ | 179,6 0 16 5.767734169 193 I WS 1706896 + 2 [jbd2/mmcblk0p6-] | ||
+ | 179,6 0 0 5.767744003 0 m N cfq193SN insert_request | ||
+ | 179,6 0 0 5.767750253 0 m N cfq193SN add_to_rr | ||
+ | 179,6 0 0 5.767760628 0 m N cfq193SN preempt | ||
+ | 179,6 0 0 5.767764336 0 m N cfq99SN slice expired t=1 | ||
+ | 179,6 0 0 5.767770044 0 m N cfq99SN resid=120000000 | ||
+ | 179,6 0 0 5.767781378 0 m N cfq99SN sl_used=10000000 disp=2 charge=10000000 iops=0 sect=4 | ||
+ | 179,6 0 0 5.767784378 0 m N cfq99SN del_from_rr | ||
+ | 179,6 1 0 5.772038836 0 m N cfq99SN complete rqnoidle 1 | ||
+ | 179,6 1 0 5.772064253 0 m N cfq193SN set_active wl_class:0 wl_type:1 | ||
+ | 179,6 1 0 5.772070878 0 m N cfq193SN dispatch_insert | ||
+ | 179,6 1 0 5.772077044 0 m N cfq193SN dispatched a request | ||
+ | 179,6 1 0 5.772081878 0 m N cfq193SN activate rq, drv=2 | ||
+ | 179,6 1 7 5.772085086 80 D WS 1706896 + 2 [mmcqd/0] | ||
+ | 179,6 1 0 5.774473336 0 m N cfq99SN insert_request | ||
+ | 179,6 1 0 5.774481419 0 m N cfq99SN add_to_rr | ||
+ | 179,6 1 0 5.774490461 0 m N cfq99SN preempt | ||
+ | 179,6 1 0 5.774496211 0 m N cfq193SN slice expired t=1 | ||
+ | 179,6 1 0 5.774502586 0 m N cfq193SN resid=120000000 | ||
+ | 179,6 1 0 5.774515044 0 m N cfq193SN sl_used=10000000 disp=1 charge=10000000 iops=0 sect=2 | ||
+ | 179,6 1 0 5.774519128 0 m N cfq193SN del_from_rr | ||
+ | 179,6 1 0 5.774558711 0 m N cfq99SN complete rqnoidle 1 | ||
+ | 179,6 1 0 5.774577211 0 m N cfq99SN set_active wl_class:0 wl_type:1 | ||
+ | 179,6 1 0 5.774583919 0 m N cfq99SN dispatch_insert | ||
+ | 179,6 1 0 5.774590253 0 m N cfq99SN dispatched a request | ||
+ | 179,6 1 0 5.774595086 0 m N cfq99SN activate rq, drv=2 | ||
+ | 179,6 1 8 5.777926544 80 C WS 1706896 + 2 [0] | ||
+ | 179,6 1 0 5.777956461 0 m N cfq193SN complete rqnoidle 1 | ||
+ | 179,6 1 0 5.782932794 0 m N cfq99SN complete rqnoidle 1 | ||
+ | 179,6 1 0 5.782943419 0 m N cfq99SN set_slice=120000000 | ||
+ | 179,6 1 0 5.782949919 0 m N cfq schedule dispatch | ||
+ | CPU0 (mmcblk0p6): | ||
+ | Reads Queued: 0, 0KiB Writes Queued: 3, 3KiB | ||
+ | Read Dispatches: 0, 0KiB Write Dispatches: 0, 0KiB | ||
+ | Reads Requeued: 0 Writes Requeued: 0 | ||
+ | Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB | ||
+ | Read Merges: 0, 0KiB Write Merges: 0, 0KiB | ||
+ | Read depth: 0 Write depth: 2 | ||
+ | IO unplugs: 2 Timer unplugs: 0 | ||
+ | CPU1 (mmcblk0p6): | ||
+ | Reads Queued: 0, 0KiB Writes Queued: 0, 0KiB | ||
+ | Read Dispatches: 0, 0KiB Write Dispatches: 3, 3KiB | ||
+ | Reads Requeued: 0 Writes Requeued: 0 | ||
+ | Reads Completed: 0, 0KiB Writes Completed: 3, 3KiB | ||
+ | Read Merges: 0, 0KiB Write Merges: 0, 0KiB | ||
+ | Read depth: 0 Write depth: 2 | ||
+ | IO unplugs: 1 Timer unplugs: 0 | ||
+ | |||
+ | Total (mmcblk0p6): | ||
+ | Reads Queued: 0, 0KiB Writes Queued: 3, 3KiB | ||
+ | Read Dispatches: 0, 0KiB Write Dispatches: 3, 3KiB | ||
+ | Reads Requeued: 0 Writes Requeued: 0 | ||
+ | Reads Completed: 0, 0KiB Writes Completed: 3, 3KiB | ||
+ | Read Merges: 0, 0KiB Write Merges: 0, 0KiB | ||
+ | IO unplugs: 3 Timer unplugs: 0 | ||
+ | |||
+ | Throughput (R/W): 0KiB/s / 0KiB/s | ||
+ | Events (mmcblk0p6): 118 entries | ||
+ | Skips: 0 f | ||
+ | orward (0 - 0.0%) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | : 注意:以下信息与 Android 发行版相关 blkparse 源代码模块在 external/blktrace 中可用 | ||
+ | :: 编译(确保正确设置了构建环境): | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | PC $> cd $ANDROID_BUILD_TOP | ||
+ | PC $> mma blkparse | ||
+ | </syntaxhighlight> | ||
+ | :: 检查blkparse二进制文件在系统镜像中是否可用: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | PC $> ls out/target/product/<BoardId>/system/bin/blkparse | ||
+ | </syntaxhighlight> | ||
+ | :: 将二进制文件推送到远程目标文件系统: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | # Remount first the target file system with write access | ||
+ | PC $> adb root; adb remount | ||
+ | PC $> adb sync | ||
+ | </syntaxhighlight> | ||
+ | ===ftrace用法=== | ||
+ | : 一旦Linux内核配置 CONFIG_BLK_DEV_ IO _TRACE 是激活的,块层(BLK)动作可以通过使用被追踪 ftrace: | ||
+ | |||
+ | : 在这种情况下,只能为 ftrace 配置 blk 跟踪器,如以下命令的结果所示: | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Board $> mount -t tracefs nodev /sys/kernel/tracing | ||
+ | Board $> cat /sys/kernel/tracing/available_tracers | ||
+ | blk nop | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | : 为了获得更多的 ftrace 跟踪器(例如"function”),必须通过分发程序包激活其他 Linux 内核配置选项,如 ftrace 文章中所述。 | ||
+ | |||
+ | 通过以 /usr/local 读取内容为例(挂载点为mcblk0p6): | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | Board $> echo 1 > /sys/block/mmcblk0/mmcblk0p6/trace/enable | ||
+ | Board $> echo blk > /sys/kernel/tracing/current_tracer | ||
+ | Board $> ls -la /usr/local | ||
+ | Board $> cat /sys/kernel/tracing/trace_pipe | ||
+ | </syntaxhighlight> | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.412943: 179,0 A WS 415902 + 2 <- (179,5) 278652 | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.412943: 179,0 A WS 1706892 + 2 <- (179,6) 32778 | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.412974: 179,0 Q WS 415902 + 2 [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.412987: 179,0 Q WS 1706892 + 2 [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413012: 179,0 G WS 415902 + 2 [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.413012: 179,0 G WS 1706892 + 2 [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.413018: 179,0 P N [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413019: 179,0 P N [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413034: 179,0 A WS 415904 + 2 <- (179,5) 278654 | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.413034: 179,0 A WS 1706894 + 2 <- (179,6) 32780 | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413040: 179,0 Q WS 415904 + 2 [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.413040: 179,0 Q WS 1706894 + 2 [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413054: 179,0 G WS 415904 + 2 [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.413056: 179,0 G WS 1706894 + 2 [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...2 100.413071: 179,0 I WS 1706892 + 2 [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.413092: 179,0 m N cfq196SN insert_request | ||
+ | jbd2/mmcblk0p6--196 [000] ...2 100.413104: 179,0 I WS 1706894 + 2 [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.413111: 179,0 m N cfq196SN insert_request | ||
+ | jbd2/mmcblk0p6--196 [000] ...2 100.413118: 179,0 U N [jbd2/mmcblk0p6-] 2 | ||
+ | jbd2/mmcblk0p5--97 [001] ...2 100.413135: 179,0 I WS 415902 + 2 [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413144: 179,0 m N cfq97SN insert_request | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413151: 179,0 m N cfq97SN add_to_rr | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413162: 179,0 m N cfq97SN preempt | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413168: 179,0 m N cfq196SN slice expired t=1 | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413176: 179,0 m N cfq196SN resid=-32494149849 | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413191: 179,0 m N cfq196SN sl_used=120000000 disp=1 charge=120000000 iops=0 sect=2 | ||
+ | jbd2/mmcblk0p5--97 [001] ...2 100.413199: 179,0 I WS 415904 + 2 [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.413205: 179,0 m N cfq97SN insert_request | ||
+ | jbd2/mmcblk0p5--97 [001] ...2 100.413211: 179,0 U N [jbd2/mmcblk0p5-] 2 | ||
+ | mmcqd/0-80 [000] ...1 100.413224: 179,0 m N cfq workload slice:200000000 | ||
+ | mmcqd/0-80 [000] ...1 100.413232: 179,0 m N cfq97SN set_active wl_class:0 wl_type:1 | ||
+ | mmcqd/0-80 [000] ...1 100.413241: 179,0 m N cfq97SN dispatch_insert | ||
+ | mmcqd/0-80 [000] ...1 100.413250: 179,0 m N cfq97SN dispatched a request | ||
+ | mmcqd/0-80 [000] ...1 100.413256: 179,0 m N cfq97SN activate rq, drv=1 | ||
+ | mmcqd/0-80 [000] ...2 100.413261: 179,0 D WS 415902 + 2 [mmcqd/0] | ||
+ | mmcqd/0-80 [000] ...1 100.413515: 179,0 m N cfq97SN dispatch_insert | ||
+ | mmcqd/0-80 [000] ...1 100.413524: 179,0 m N cfq97SN dispatched a request | ||
+ | mmcqd/0-80 [000] ...1 100.413530: 179,0 m N cfq97SN activate rq, drv=2 | ||
+ | mmcqd/0-80 [000] ...2 100.413534: 179,0 D WS 415904 + 2 [mmcqd/0] | ||
+ | mmcqd/0-80 [000] ...1 100.417441: 179,0 C WS 415902 + 2 [0] | ||
+ | mmcqd/0-80 [000] ...1 100.417482: 179,0 m N cfq97SN complete rqnoidle 1 | ||
+ | mmcqd/0-80 [000] ...1 100.417494: 179,0 m N cfq97SN set_slice=120000000 | ||
+ | mmcqd/0-80 [000] ...1 100.417526: 179,0 m N cfq97SN slice expired t=0 | ||
+ | mmcqd/0-80 [000] ...1 100.417539: 179,0 m N cfq97SN sl_used=40584 disp=2 charge=40584 iops=0 sect=4 | ||
+ | mmcqd/0-80 [000] ...1 100.417545: 179,0 m N cfq97SN del_from_rr | ||
+ | mmcqd/0-80 [000] ...1 100.417555: 179,0 m N cfq196SN set_active wl_class:0 wl_type:1 | ||
+ | mmcqd/0-80 [000] ...1 100.417561: 179,0 m N cfq196SN dispatch_insert | ||
+ | mmcqd/0-80 [000] ...1 100.417569: 179,0 m N cfq196SN dispatched a request | ||
+ | mmcqd/0-80 [000] ...1 100.417575: 179,0 m N cfq196SN activate rq, drv=2 | ||
+ | mmcqd/0-80 [000] ...2 100.417579: 179,0 D WS 1706892 + 2 [mmcqd/0] | ||
+ | mmcqd/0-80 [000] ...1 100.419353: 179,0 C WS 415904 + 2 [0] | ||
+ | mmcqd/0-80 [000] ...1 100.419380: 179,0 m N cfq97SN complete rqnoidle 1 | ||
+ | mmcqd/0-80 [000] ...1 100.419393: 179,0 m N cfq196SN dispatch_insert | ||
+ | mmcqd/0-80 [000] ...1 100.419400: 179,0 m N cfq196SN dispatched a request | ||
+ | mmcqd/0-80 [000] ...1 100.419405: 179,0 m N cfq196SN activate rq, drv=2 | ||
+ | mmcqd/0-80 [000] ...2 100.419409: 179,0 D WS 1706894 + 2 [mmcqd/0] | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419431: 179,0 A FWFS 415906 + 2 <- (179,5) 278656 | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419440: 179,0 Q WS 415906 + 2 [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419465: 179,0 G WS 415906 + 2 [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p5--97 [001] ...2 100.419475: 179,0 I WS 415906 + 2 [jbd2/mmcblk0p5-] | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419484: 179,0 m N cfq97SN insert_request | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419491: 179,0 m N cfq97SN add_to_rr | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419502: 179,0 m N cfq97SN preempt | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419507: 179,0 m N cfq196SN slice expired t=1 | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419514: 179,0 m N cfq196SN resid=120000000 | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419526: 179,0 m N cfq196SN sl_used=10000000 disp=2 charge=10000000 iops=0 sect=4 | ||
+ | jbd2/mmcblk0p5--97 [001] ...1 100.419530: 179,0 m N cfq196SN del_from_rr | ||
+ | mmcqd/0-80 [000] ...1 100.424339: 179,0 C WS 1706892 + 2 [0] | ||
+ | mmcqd/0-80 [000] ...1 100.424367: 179,0 m N cfq196SN complete rqnoidle 1 | ||
+ | mmcqd/0-80 [000] ...1 100.424388: 179,0 m N cfq97SN set_active wl_class:0 wl_type:1 | ||
+ | mmcqd/0-80 [000] ...1 100.424396: 179,0 m N cfq97SN dispatch_insert | ||
+ | mmcqd/0-80 [000] ...1 100.424404: 179,0 m N cfq97SN dispatched a request | ||
+ | mmcqd/0-80 [000] ...1 100.424409: 179,0 m N cfq97SN activate rq, drv=2 | ||
+ | mmcqd/0-80 [000] ...2 100.424413: 179,0 D WS 415906 + 2 [mmcqd/0] | ||
+ | mmcqd/0-80 [000] ...1 100.427349: 179,0 C WS 1706894 + 2 [0] | ||
+ | mmcqd/0-80 [000] ...1 100.427382: 179,0 m N cfq196SN complete rqnoidle 1 | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427441: 179,0 A FWFS 1706896 + 2 <- (179,6) 32782 | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427458: 179,0 Q WS 1706896 + 2 [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427482: 179,0 G WS 1706896 + 2 [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...2 100.427492: 179,0 I WS 1706896 + 2 [jbd2/mmcblk0p6-] | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427499: 179,0 m N cfq196SN insert_request | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427505: 179,0 m N cfq196SN add_to_rr | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427516: 179,0 m N cfq196SN preempt | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427521: 179,0 m N cfq97SN slice expired t=1 | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427528: 179,0 m N cfq97SN resid=120000000 | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427545: 179,0 m N cfq97SN sl_used=10000000 disp=1 charge=10000000 iops=0 sect=2 | ||
+ | jbd2/mmcblk0p6--196 [000] ...1 100.427550: 179,0 m N cfq97SN del_from_rr | ||
+ | mmcqd/0-80 [000] ...1 100.427598: 179,0 m N cfq196SN set_active wl_class:0 wl_type:1 | ||
+ | mmcqd/0-80 [000] ...1 100.427605: 179,0 m N cfq196SN dispatch_insert | ||
+ | mmcqd/0-80 [000] ...1 100.427612: 179,0 m N cfq196SN dispatched a request | ||
+ | mmcqd/0-80 [000] ...1 100.427618: 179,0 m N cfq196SN activate rq, drv=2 | ||
+ | mmcqd/0-80 [000] ...2 100.427622: 179,0 D WS 1706896 + 2 [mmcqd/0] | ||
+ | mmcqd/0-80 [000] ...1 100.431133: 179,0 C WS 415906 + 2 [0] | ||
+ | mmcqd/0-80 [000] ...1 100.431164: 179,0 m N cfq97SN complete rqnoidle 1 | ||
+ | mmcqd/0-80 [000] ...1 100.434921: 179,0 C WS 1706896 + 2 [0] | ||
+ | mmcqd/0-80 [000] ...1 100.434951: 179,0 m N cfq196SN complete rqnoidle 1 | ||
+ | mmcqd/0-80 [000] ...1 100.434962: 179,0 m N cfq196SN set_slice=120000000 | ||
+ | mmcqd/0-80 [000] ...1 100.434969: 179,0 m N cfq schedule dispatch | ||
+ | kworker/u4:1-65 [001] ...1 101.612916: 179,0 A WM 137922 + 2 <- (179,5) 672 | ||
+ | kworker/u4:1-65 [001] ...1 101.612949: 179,0 Q WM 137922 + 2 [kworker/u4:1] | ||
+ | kworker/u4:1-65 [001] ...1 101.613001: 179,0 G WM 137922 + 2 [kworker/u4:1] | ||
+ | kworker/u4:1-65 [001] ...1 101.613012: 179,0 P N [kworker/u4:1] | ||
+ | kworker/u4:1-65 [001] ...1 101.613071: 179,0 A WM 1674662 + 2 <- (179,6) 548 | ||
+ | kworker/u4:1-65 [001] ...1 101.613077: 179,0 Q WM 1674662 + 2 [kworker/u4:1] | ||
+ | kworker/u4:1-65 [001] ...1 101.613093: 179,0 G WM 1674662 + 2 [kworker/u4:1] | ||
+ | kworker/u4:1-65 [001] ...2 101.613119: 179,0 I WM 137922 + 2 [kworker/u4:1] | ||
+ | kworker/u4:1-65 [001] ...1 101.613131: 179,0 m N cfq200A insert_request | ||
+ | kworker/u4:1-65 [001] ...1 101.613139: 179,0 m N cfq200A add_to_rr | ||
+ | kworker/u4:1-65 [001] ...1 101.613152: 179,0 m N cfq200A preempt | ||
+ | kworker/u4:1-65 [001] ...1 101.613157: 179,0 m N cfq196SN slice expired t=1 | ||
+ | kworker/u4:1-65 [001] ...1 101.613164: 179,0 m N cfq196SN resid=-1058203000 | ||
+ | kworker/u4:1-65 [001] ...1 101.613179: 179,0 m N cfq196SN sl_used=120000000 disp=1 charge=120000000 iops=0 sect=2 | ||
+ | kworker/u4:1-65 [001] ...1 101.613185: 179,0 m N cfq196SN del_from_rr | ||
+ | kworker/u4:1-65 [001] ...2 101.613198: 179,0 I WM 1674662 + 2 [kworker/u4:1] | ||
+ | kworker/u4:1-65 [001] ...1 101.613206: 179,0 m N cfq200A insert_request | ||
+ | kworker/u4:1-65 [001] ...2 101.613214: 179,0 U N [kworker/u4:1] 2 | ||
+ | mmcqd/0-80 [000] ...1 101.613238: 179,0 m N cfq workload slice:40000000 | ||
+ | mmcqd/0-80 [000] ...1 101.613248: 179,0 m N cfq200A set_active wl_class:0 wl_type:0 | ||
+ | mmcqd/0-80 [000] ...1 101.613258: 179,0 m N cfq200A dispatch_insert | ||
+ | mmcqd/0-80 [000] ...1 101.613267: 179,0 m N cfq200A dispatched a request | ||
+ | mmcqd/0-80 [000] ...1 101.613274: 179,0 m N cfq200A activate rq, drv=1 | ||
+ | mmcqd/0-80 [000] ...2 101.613280: 179,0 D WM 1674662 + 2 [mmcqd/0] | ||
+ | mmcqd/0-80 [000] ...1 101.613511: 179,0 m N cfq200A dispatch_insert | ||
+ | mmcqd/0-80 [000] ...1 101.613520: 179,0 m N cfq200A dispatched a request | ||
+ | mmcqd/0-80 [000] ...1 101.613525: 179,0 m N cfq200A activate rq, drv=2 | ||
+ | mmcqd/0-80 [000] ...2 101.613529: 179,0 D WM 137922 + 2 [mmcqd/0] | ||
+ | mmcqd/0-80 [000] ...1 101.618520: 179,0 C WM 1674662 + 2 [0] | ||
+ | mmcqd/0-80 [000] ...1 101.618576: 179,0 m N cfq200A complete rqnoidle 0 | ||
+ | mmcqd/0-80 [000] ...1 101.618586: 179,0 m N cfq200A set_slice=40000000 | ||
+ | mmcqd/0-80 [000] ...1 101.623185: 179,0 C WM 137922 + 2 [0] | ||
+ | mmcqd/0-80 [000] ...1 101.623215: 179,0 m N cfq200A complete rqnoidle 0 | ||
+ | mmcqd/0-80 [000] ...1 101.623221: 179,0 m N cfq schedule dispatch | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | : 注意:以下信息与 Android 发行版相关,因为文件系统为只读,因此必须使用ADB。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | PC $> adb root; adb remount | ||
+ | PC $> adb shell | ||
+ | Board $> ... | ||
+ | </syntaxhighlight> | ||
+ | ==参考== | ||
+ | : 1. [https://linux.die.net/man/8/blktrace https://linux.die.net/man/8/blktrace] | ||
+ | : 2. [https://linux.die.net/man/1/blkparse https://linux.die.net/man/1/blkparse] | ||
+ | : 3. [https://wiki.yoctoproject.org/wiki/Tracing_and_Profiling#blktrace https://wiki.yoctoproject.org/wiki/Tracing_and_Profiling#blktrace] | ||
+ | |||
+ | |||
+ | * 有用的外部链接 | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! 文件链接 !! 文件类型 !! 描述 | ||
+ | |- | ||
+ | | [https://git.kernel.org/pub/scm/linux/kernel/git/axboe/blktrace.git blktrace 工具源代码,包括用户空间工具] || 资料来源 || blktrace来源git | ||
+ | |- | ||
+ | | [https://www.mimuw.edu.pl/~lichota/09-10/Optymalizacja-open-source/Materialy/10%20-%20Dysk/gelato_ICE06apr_blktrace_brunelle_hp.pdf blktrace 演示] || 介绍 || Alan D. Brunelle的演讲 | ||
+ | |} | ||
+ | |||
[[Category:Linux_Operating_System]] | [[Category:Linux_Operating_System]] | ||
[[Category:Linux_tracing_tools]] | [[Category:Linux_tracing_tools]] |
2019年12月26日 (四) 15:01的版本
目录
Blktrace
文章目的
本文提供了开始使用Linux工具所需的基本信息:blktrace [1 ](块跟踪器)。
简介
- 下表简要介绍了该工具及其可用性,具体取决于软件包:
- 是:该工具已经存在(可以使用或激活),也可以在软件包中集成和激活。
- 没有:该工具不存在且无法集成,或者存在但无法在软件包中激活。
工具 | ||
---|---|---|
名称 | 类别 | 目的 |
blktrace | 追踪工具 | blktrace [1 ]生成对块设备(SD卡,USB,eMMC ...) 上的I/O流量的跟踪 |
STM32MPU嵌入式软件发行版 | ||
入门资料包 | 开发者资料包 | 发行版资料包 |
没有 | 是 | 是 |
适用于 Android 的STM32MPU嵌入式软件发行版 | ||
入门资料包 | 开发者资料包 | 发行版资料包 |
没有 | 没有 | 是 |
- blktrace工具由三个主要组件组成:
- 一个内核
- 在用户空间上记录来自内核的 I/O 跟踪信息的实用程序
- 实用程序来分析和查看跟踪信息。
- blkparse [2 ]也与blktrace关联。它从blktrace实用程序获取原始输出,并将其转换为格式良好且易于阅读的格式。
在目标板上安装跟踪和调试工具
- 它包括将blktrace二进制文件放在rootfs中,并修改Linux内核配置。
- 为了使用blktrace,Linux内核配置必须使用Linux内核menuconfig工具激活CONFIG_BLK_DEV_ IO _TRACE:
Symbol: BLK_DEV_IO_TRACE
Location:
Kernel Hacking --->
[*] Tracers --->
[*] Support for tracing block I/O actions
使用STM32MPU嵌入式软件发行版
- 默认情况下,所有STM32MPU嵌入式软件包中都提供blktrace二进制文件:
Board $> which blktrace
/usr/bin/blktrace
- 通过openembedded-core软件包将其集成到weston镜像分发中: openembedded-core/meta/recipes-core/packagegroups/packagegroup-core-tools-profile.bb 。
RRECOMMENDS_${PN} = "\
${PERF} \
trace-cmd \
blktrace \
${PROFILE_TOOLS_X} \
${PROFILE_TOOLS_SYSTEMD} \
"
入门包
- 不适用,因为无法更新Linux内核配置。
开发人员软件包
- 要在Linux内核配置中启用CONFIG_BLK_DEV_IO_TRACE,请参考 Menuconfig 或如何配置内核。 本文提供了有关在Developer Package上下文中修改配置和重新编译Linux内核镜像的说明。
分发包
- 要在Linux内核配置中启用CONFIG_BLK_DEV_IO_TRACE,请参考 Menuconfig 或如何配置内核。 本文提供了有关在“分发程序包”上下文中修改配置和重新编译Linux内核镜像的说明。
使用适用于 Android 的STM32MPU嵌入式软件
- 该blktrace二进制是默认不可用的的全部Android STM32MPU嵌入式软件的软件包,所以必须加入。
入门包
- 不适用,因为无法更新Linux内核配置。
开发人员软件包
- 不适用,因为无法更新Linux内核配置。
分发包
- 要在Linux内核配置中启用CONFIG_BLK_DEV_IO_TRACE,请参阅如何为Android定制内核。 本文提供了有关在Android分发包中修改配置并重新编译Linux内核镜像的说明。
- blktrace源代码模块在中可用external/blktrace。
- 编译(确保正确设置了构建环境):
PC $> cd $ANDROID_BUILD_TOP
PC $> mma blktrace
- 检查blktrace二进制文件在系统镜像中是否可用:
PC $> ls out/target/product/<BoardId>/system/bin/blktrace
- 将二进制文件推送到远程目标文件系统:
# Remount first the target file system with write access
PC $> adb root; adb remount
PC $> adb sync
使用入门
- 从blktrace开始,跟踪已安装的块设备上的I/O流量(以块设备为例进行说明,该设备 /dev/mmcblk0p6 安装为 /usr/local):
Board $> mount | grep mmcblk
/dev/mmcblk0p5 on / type ext4 (rw,relatime,data=ordered)
/dev/mmcblk0p4 on /boot type ext4 (rw,relatime,data=ordered)
/dev/mmcblk0p6 on /usr/local type ext4 (rw,relatime,data=ordered)
- 在后台启动blktrace工具:
Board $> blktrace -d /dev/mmcblk0p6 &
- 读取 /usr/local 的内容(它生成对关联块设备的读取访问权限):
Board $> ls -la /usr/local
- 将 blktrace 活动放在前台,然后按组合键 Ctrl + C 停止它:
Board $> fg
blktrace -d /dev/mmcblk0p6
Board $> <Ctrl-C>
^C=== mmcblk0p6 ===
CPU 0: 98 events, 5 KiB data
CPU 1: 79 events, 4 KiB data
Total: 177 events (dropped 0), 9 KiB data
- 注意:以下信息与 Android 发行版相关,因为文件系统为只读,因此必须使用 ADB。
PC $> adb root; adb remount
PC $> adb shell
Board $> ...
- 有关blktrace使用的详细指导,请参考手册页[1 ]或帮助信息:
Board $> blktrace --help
Usage: blktrace
-d <dev> | --dev=<dev>
[ -r <debugfs path> | --relay=<debugfs path> ]
[ -o <file> | --output=<file>]
[ -D <dir> | --output-dir=<dir>
[ -w | --stopwatch=]
[ -a <action field> | --act-mask=<action field>]
[ -A <action mask> | --set-mask=<action mask>]
[ -b <size> | --buffer-size]
[ -n <number> | --num-sub-buffers=<number>]
[ -l | --listen]
[ -h <hostname> | --host=<hostname>]
[ -p <port number> | --port=<port number>]
[ -s | --no-sendfile]
[ -I <devs file> | --input-devs=<devs file>]
[ -v <version> | --version]
[ -V <version> | --version]
-d Use specified device. May also be given last after options
-r Path to mounted debugfs, defaults to /sys/kernel/debug
-o File(s) to send output to
-D Directory to prepend to output file names
-w Stop after defined time, in seconds
-a Only trace specified actions. See documentation
-A Give trace mask as a single value. See documentation
-b Sub buffer size in KiB (default 512)
-n Number of sub buffers (default 4)
-l Run in network listen mode (blktrace server)
-h Run in network client mode, connecting to the given host
-p Network port to use (default 8462)
-s Make the network client NOT use sendfile() to transfer data
-I Add devices found in <devs file>
-v Print program version info
-V Print program version info
- 要开始使用 blktrace,您还可以参考 Yocto Project Wiki 页面上的 blktrace [3],其中提供了更多详细信息以及示例。
深入学习
blkparse的用法
- 除了在控制台上为用户显示信息之外,blktrace还创建跟踪文件(每个CPU一个),可以使用blkparse查看该文件。这些文件存储在当前路径目录下。
Board $> blkparse mmcblk0p6
Input file mmcblk0p6.blktrace.0 added
Input file mmcblk0p6.blktrace.1 added
179,6 0 1 0.000000000 99 P N [jbd2/mmcblk0p5-]
179,6 0 0 0.000337792 0 m N cfq99SN insert_request
179,6 0 0 0.000344292 0 m N cfq99SN add_to_rr
179,6 0 0 0.000366250 0 m N cfq99SN insert_request
179,6 0 0 0.000374792 0 m N cfq99SN insert_request
179,6 0 0 0.000382458 0 m N cfq99SN insert_request
179,6 0 0 0.000390167 0 m N cfq99SN insert_request
179,6 0 2 0.000396625 99 U N [jbd2/mmcblk0p5-] 5
179,6 0 0 0.000452542 0 m N cfq workload slice:150000000
179,6 0 0 0.000460750 0 m N cfq99SN set_active wl_class:0 wl_type:1
179,6 0 0 0.000469083 0 m N cfq99SN dispatch_insert
179,6 0 0 0.000478500 0 m N cfq99SN dispatched a request
179,6 0 0 0.000484583 0 m N cfq99SN activate rq, drv=1
179,6 0 0 0.000747292 0 m N cfq99SN dispatch_insert
179,6 0 0 0.000755042 0 m N cfq99SN dispatched a request
179,6 0 0 0.000759708 0 m N cfq99SN activate rq, drv=2
179,6 0 0 0.004197583 0 m N cfq99SN complete rqnoidle 1
179,6 0 0 0.004206958 0 m N cfq99SN set_slice=120000000
179,6 0 0 0.004231917 0 m N cfq99SN dispatch_insert
179,6 0 0 0.004239208 0 m N cfq99SN dispatched a request
179,6 0 0 0.004243958 0 m N cfq99SN activate rq, drv=2
179,6 0 0 0.006287958 0 m N cfq99SN complete rqnoidle 1
179,6 0 0 0.006305208 0 m N cfq99SN dispatch_insert
179,6 0 0 0.006310542 0 m N cfq99SN dispatched a request
179,6 0 0 0.006315417 0 m N cfq99SN activate rq, drv=2
179,6 0 0 0.008340833 0 m N cfq99SN complete rqnoidle 1
179,6 0 0 0.008359000 0 m N cfq99SN dispatch_insert
179,6 0 0 0.008365083 0 m N cfq99SN dispatched a request
179,6 0 0 0.008370000 0 m N cfq99SN activate rq, drv=2
179,6 0 0 0.011504375 0 m N cfq99SN complete rqnoidle 1
179,6 0 0 0.014671667 0 m N cfq99SN insert_request
179,6 0 0 0.014727458 0 m N cfq99SN complete rqnoidle 1
179,6 0 0 0.014731250 0 m N cfq schedule dispatch
179,6 0 0 0.014808000 0 m N cfq99SN dispatch_insert
179,6 0 0 0.014813875 0 m N cfq99SN dispatched a request
179,6 0 0 0.014819958 0 m N cfq99SN activate rq, drv=1
179,6 0 0 0.017068708 0 m N cfq99SN complete rqnoidle 1
179,6 0 0 0.017078375 0 m N cfq schedule dispatch
179,0 0 3 5.759777419 193 A WS 1706892 + 2 <- (179,6) 32778
179,6 0 4 5.759784878 193 Q WS 1706892 + 2 [jbd2/mmcblk0p6-]
179,6 0 5 5.759849336 193 G WS 1706892 + 2 [jbd2/mmcblk0p6-]
179,6 0 6 5.759854253 193 P N [jbd2/mmcblk0p6-]
179,6 1 1 5.759855044 99 P N [jbd2/mmcblk0p5-]
179,0 0 7 5.759887628 193 A WS 1706894 + 2 <- (179,6) 32780
179,6 0 8 5.759893919 193 Q WS 1706894 + 2 [jbd2/mmcblk0p6-]
179,6 0 9 5.759947753 193 G WS 1706894 + 2 [jbd2/mmcblk0p6-]
179,6 1 0 5.759975503 0 m N cfq99SN insert_request
179,6 1 0 5.759990336 0 m N cfq99SN insert_request
179,6 1 2 5.759999253 99 U N [jbd2/mmcblk0p5-] 2
179,6 0 10 5.760024669 193 I WS 1706892 + 2 [jbd2/mmcblk0p6-]
179,6 0 0 5.760035461 0 m N cfq193SN insert_request
179,6 0 0 5.760041711 0 m N cfq193SN add_to_rr
179,6 0 0 5.760053169 0 m N cfq193SN preempt
179,6 0 0 5.760059253 0 m N cfq99SN slice expired t=1
179,6 0 0 5.760066503 0 m N cfq99SN resid=-5635859836
179,6 0 0 5.760081503 0 m N cfq99SN sl_used=120000000 disp=6 charge=120000000 iops=0 sect=12
179,6 0 11 5.760087294 193 I WS 1706894 + 2 [jbd2/mmcblk0p6-]
179,6 0 0 5.760091586 0 m N cfq193SN insert_request
179,6 0 12 5.760096294 193 U N [jbd2/mmcblk0p6-] 2
179,6 1 0 5.760111211 0 m N cfq workload slice:300000000
179,6 1 0 5.760118086 0 m N cfq193SN set_active wl_class:0 wl_type:1
179,6 1 0 5.760125669 0 m N cfq193SN dispatch_insert
179,6 1 0 5.760133128 0 m N cfq193SN dispatched a request
179,6 1 0 5.760137711 0 m N cfq193SN activate rq, drv=1
179,6 1 3 5.760145253 80 D WS 1706892 + 2 [mmcqd/0]
179,6 1 0 5.760393003 0 m N cfq193SN dispatch_insert
179,6 1 0 5.760399961 0 m N cfq193SN dispatched a request
179,6 1 0 5.760404128 0 m N cfq193SN activate rq, drv=2
179,6 1 4 5.760408211 80 D WS 1706894 + 2 [mmcqd/0]
179,6 1 5 5.764367836 80 C WS 1706892 + 2 [0]
179,6 1 0 5.764403128 0 m N cfq193SN complete rqnoidle 1
179,6 1 0 5.764412461 0 m N cfq193SN set_slice=120000000
179,6 1 0 5.764439169 0 m N cfq193SN slice expired t=0
179,6 1 0 5.764450253 0 m N cfq193SN sl_used=33750 disp=2 charge=33750 iops=0 sect=4
179,6 1 0 5.764456836 0 m N cfq193SN del_from_rr
179,6 1 0 5.764464711 0 m N cfq99SN set_active wl_class:0 wl_type:1
179,6 1 0 5.764470211 0 m N cfq99SN dispatch_insert
179,6 1 0 5.764475669 0 m N cfq99SN dispatched a request
179,6 1 0 5.764479378 0 m N cfq99SN activate rq, drv=2
179,6 1 6 5.767516794 80 C WS 1706894 + 2 [0]
179,6 1 0 5.767546961 0 m N cfq193SN complete rqnoidle 1
179,6 1 0 5.767564836 0 m N cfq99SN dispatch_insert
179,6 1 0 5.767571086 0 m N cfq99SN dispatched a request
179,6 1 0 5.767575628 0 m N cfq99SN activate rq, drv=2
179,0 0 13 5.767654378 193 A FWFS 1706896 + 2 <- (179,6) 32782
179,6 0 14 5.767662669 193 Q WS 1706896 + 2 [jbd2/mmcblk0p6-]
179,6 0 15 5.767726461 193 G WS 1706896 + 2 [jbd2/mmcblk0p6-]
179,6 0 16 5.767734169 193 I WS 1706896 + 2 [jbd2/mmcblk0p6-]
179,6 0 0 5.767744003 0 m N cfq193SN insert_request
179,6 0 0 5.767750253 0 m N cfq193SN add_to_rr
179,6 0 0 5.767760628 0 m N cfq193SN preempt
179,6 0 0 5.767764336 0 m N cfq99SN slice expired t=1
179,6 0 0 5.767770044 0 m N cfq99SN resid=120000000
179,6 0 0 5.767781378 0 m N cfq99SN sl_used=10000000 disp=2 charge=10000000 iops=0 sect=4
179,6 0 0 5.767784378 0 m N cfq99SN del_from_rr
179,6 1 0 5.772038836 0 m N cfq99SN complete rqnoidle 1
179,6 1 0 5.772064253 0 m N cfq193SN set_active wl_class:0 wl_type:1
179,6 1 0 5.772070878 0 m N cfq193SN dispatch_insert
179,6 1 0 5.772077044 0 m N cfq193SN dispatched a request
179,6 1 0 5.772081878 0 m N cfq193SN activate rq, drv=2
179,6 1 7 5.772085086 80 D WS 1706896 + 2 [mmcqd/0]
179,6 1 0 5.774473336 0 m N cfq99SN insert_request
179,6 1 0 5.774481419 0 m N cfq99SN add_to_rr
179,6 1 0 5.774490461 0 m N cfq99SN preempt
179,6 1 0 5.774496211 0 m N cfq193SN slice expired t=1
179,6 1 0 5.774502586 0 m N cfq193SN resid=120000000
179,6 1 0 5.774515044 0 m N cfq193SN sl_used=10000000 disp=1 charge=10000000 iops=0 sect=2
179,6 1 0 5.774519128 0 m N cfq193SN del_from_rr
179,6 1 0 5.774558711 0 m N cfq99SN complete rqnoidle 1
179,6 1 0 5.774577211 0 m N cfq99SN set_active wl_class:0 wl_type:1
179,6 1 0 5.774583919 0 m N cfq99SN dispatch_insert
179,6 1 0 5.774590253 0 m N cfq99SN dispatched a request
179,6 1 0 5.774595086 0 m N cfq99SN activate rq, drv=2
179,6 1 8 5.777926544 80 C WS 1706896 + 2 [0]
179,6 1 0 5.777956461 0 m N cfq193SN complete rqnoidle 1
179,6 1 0 5.782932794 0 m N cfq99SN complete rqnoidle 1
179,6 1 0 5.782943419 0 m N cfq99SN set_slice=120000000
179,6 1 0 5.782949919 0 m N cfq schedule dispatch
CPU0 (mmcblk0p6):
Reads Queued: 0, 0KiB Writes Queued: 3, 3KiB
Read Dispatches: 0, 0KiB Write Dispatches: 0, 0KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 0, 0KiB
Read Merges: 0, 0KiB Write Merges: 0, 0KiB
Read depth: 0 Write depth: 2
IO unplugs: 2 Timer unplugs: 0
CPU1 (mmcblk0p6):
Reads Queued: 0, 0KiB Writes Queued: 0, 0KiB
Read Dispatches: 0, 0KiB Write Dispatches: 3, 3KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 3, 3KiB
Read Merges: 0, 0KiB Write Merges: 0, 0KiB
Read depth: 0 Write depth: 2
IO unplugs: 1 Timer unplugs: 0
Total (mmcblk0p6):
Reads Queued: 0, 0KiB Writes Queued: 3, 3KiB
Read Dispatches: 0, 0KiB Write Dispatches: 3, 3KiB
Reads Requeued: 0 Writes Requeued: 0
Reads Completed: 0, 0KiB Writes Completed: 3, 3KiB
Read Merges: 0, 0KiB Write Merges: 0, 0KiB
IO unplugs: 3 Timer unplugs: 0
Throughput (R/W): 0KiB/s / 0KiB/s
Events (mmcblk0p6): 118 entries
Skips: 0 f
orward (0 - 0.0%)
- 注意:以下信息与 Android 发行版相关 blkparse 源代码模块在 external/blktrace 中可用
- 编译(确保正确设置了构建环境):
PC $> cd $ANDROID_BUILD_TOP
PC $> mma blkparse
- 检查blkparse二进制文件在系统镜像中是否可用:
PC $> ls out/target/product/<BoardId>/system/bin/blkparse
- 将二进制文件推送到远程目标文件系统:
# Remount first the target file system with write access
PC $> adb root; adb remount
PC $> adb sync
ftrace用法
- 一旦Linux内核配置 CONFIG_BLK_DEV_ IO _TRACE 是激活的,块层(BLK)动作可以通过使用被追踪 ftrace:
- 在这种情况下,只能为 ftrace 配置 blk 跟踪器,如以下命令的结果所示:
Board $> mount -t tracefs nodev /sys/kernel/tracing
Board $> cat /sys/kernel/tracing/available_tracers
blk nop
- 为了获得更多的 ftrace 跟踪器(例如"function”),必须通过分发程序包激活其他 Linux 内核配置选项,如 ftrace 文章中所述。
通过以 /usr/local 读取内容为例(挂载点为mcblk0p6):
Board $> echo 1 > /sys/block/mmcblk0/mmcblk0p6/trace/enable
Board $> echo blk > /sys/kernel/tracing/current_tracer
Board $> ls -la /usr/local
Board $> cat /sys/kernel/tracing/trace_pipe
jbd2/mmcblk0p5--97 [001] ...1 100.412943: 179,0 A WS 415902 + 2 <- (179,5) 278652
jbd2/mmcblk0p6--196 [000] ...1 100.412943: 179,0 A WS 1706892 + 2 <- (179,6) 32778
jbd2/mmcblk0p5--97 [001] ...1 100.412974: 179,0 Q WS 415902 + 2 [jbd2/mmcblk0p5-]
jbd2/mmcblk0p6--196 [000] ...1 100.412987: 179,0 Q WS 1706892 + 2 [jbd2/mmcblk0p6-]
jbd2/mmcblk0p5--97 [001] ...1 100.413012: 179,0 G WS 415902 + 2 [jbd2/mmcblk0p5-]
jbd2/mmcblk0p6--196 [000] ...1 100.413012: 179,0 G WS 1706892 + 2 [jbd2/mmcblk0p6-]
jbd2/mmcblk0p6--196 [000] ...1 100.413018: 179,0 P N [jbd2/mmcblk0p6-]
jbd2/mmcblk0p5--97 [001] ...1 100.413019: 179,0 P N [jbd2/mmcblk0p5-]
jbd2/mmcblk0p5--97 [001] ...1 100.413034: 179,0 A WS 415904 + 2 <- (179,5) 278654
jbd2/mmcblk0p6--196 [000] ...1 100.413034: 179,0 A WS 1706894 + 2 <- (179,6) 32780
jbd2/mmcblk0p5--97 [001] ...1 100.413040: 179,0 Q WS 415904 + 2 [jbd2/mmcblk0p5-]
jbd2/mmcblk0p6--196 [000] ...1 100.413040: 179,0 Q WS 1706894 + 2 [jbd2/mmcblk0p6-]
jbd2/mmcblk0p5--97 [001] ...1 100.413054: 179,0 G WS 415904 + 2 [jbd2/mmcblk0p5-]
jbd2/mmcblk0p6--196 [000] ...1 100.413056: 179,0 G WS 1706894 + 2 [jbd2/mmcblk0p6-]
jbd2/mmcblk0p6--196 [000] ...2 100.413071: 179,0 I WS 1706892 + 2 [jbd2/mmcblk0p6-]
jbd2/mmcblk0p6--196 [000] ...1 100.413092: 179,0 m N cfq196SN insert_request
jbd2/mmcblk0p6--196 [000] ...2 100.413104: 179,0 I WS 1706894 + 2 [jbd2/mmcblk0p6-]
jbd2/mmcblk0p6--196 [000] ...1 100.413111: 179,0 m N cfq196SN insert_request
jbd2/mmcblk0p6--196 [000] ...2 100.413118: 179,0 U N [jbd2/mmcblk0p6-] 2
jbd2/mmcblk0p5--97 [001] ...2 100.413135: 179,0 I WS 415902 + 2 [jbd2/mmcblk0p5-]
jbd2/mmcblk0p5--97 [001] ...1 100.413144: 179,0 m N cfq97SN insert_request
jbd2/mmcblk0p5--97 [001] ...1 100.413151: 179,0 m N cfq97SN add_to_rr
jbd2/mmcblk0p5--97 [001] ...1 100.413162: 179,0 m N cfq97SN preempt
jbd2/mmcblk0p5--97 [001] ...1 100.413168: 179,0 m N cfq196SN slice expired t=1
jbd2/mmcblk0p5--97 [001] ...1 100.413176: 179,0 m N cfq196SN resid=-32494149849
jbd2/mmcblk0p5--97 [001] ...1 100.413191: 179,0 m N cfq196SN sl_used=120000000 disp=1 charge=120000000 iops=0 sect=2
jbd2/mmcblk0p5--97 [001] ...2 100.413199: 179,0 I WS 415904 + 2 [jbd2/mmcblk0p5-]
jbd2/mmcblk0p5--97 [001] ...1 100.413205: 179,0 m N cfq97SN insert_request
jbd2/mmcblk0p5--97 [001] ...2 100.413211: 179,0 U N [jbd2/mmcblk0p5-] 2
mmcqd/0-80 [000] ...1 100.413224: 179,0 m N cfq workload slice:200000000
mmcqd/0-80 [000] ...1 100.413232: 179,0 m N cfq97SN set_active wl_class:0 wl_type:1
mmcqd/0-80 [000] ...1 100.413241: 179,0 m N cfq97SN dispatch_insert
mmcqd/0-80 [000] ...1 100.413250: 179,0 m N cfq97SN dispatched a request
mmcqd/0-80 [000] ...1 100.413256: 179,0 m N cfq97SN activate rq, drv=1
mmcqd/0-80 [000] ...2 100.413261: 179,0 D WS 415902 + 2 [mmcqd/0]
mmcqd/0-80 [000] ...1 100.413515: 179,0 m N cfq97SN dispatch_insert
mmcqd/0-80 [000] ...1 100.413524: 179,0 m N cfq97SN dispatched a request
mmcqd/0-80 [000] ...1 100.413530: 179,0 m N cfq97SN activate rq, drv=2
mmcqd/0-80 [000] ...2 100.413534: 179,0 D WS 415904 + 2 [mmcqd/0]
mmcqd/0-80 [000] ...1 100.417441: 179,0 C WS 415902 + 2 [0]
mmcqd/0-80 [000] ...1 100.417482: 179,0 m N cfq97SN complete rqnoidle 1
mmcqd/0-80 [000] ...1 100.417494: 179,0 m N cfq97SN set_slice=120000000
mmcqd/0-80 [000] ...1 100.417526: 179,0 m N cfq97SN slice expired t=0
mmcqd/0-80 [000] ...1 100.417539: 179,0 m N cfq97SN sl_used=40584 disp=2 charge=40584 iops=0 sect=4
mmcqd/0-80 [000] ...1 100.417545: 179,0 m N cfq97SN del_from_rr
mmcqd/0-80 [000] ...1 100.417555: 179,0 m N cfq196SN set_active wl_class:0 wl_type:1
mmcqd/0-80 [000] ...1 100.417561: 179,0 m N cfq196SN dispatch_insert
mmcqd/0-80 [000] ...1 100.417569: 179,0 m N cfq196SN dispatched a request
mmcqd/0-80 [000] ...1 100.417575: 179,0 m N cfq196SN activate rq, drv=2
mmcqd/0-80 [000] ...2 100.417579: 179,0 D WS 1706892 + 2 [mmcqd/0]
mmcqd/0-80 [000] ...1 100.419353: 179,0 C WS 415904 + 2 [0]
mmcqd/0-80 [000] ...1 100.419380: 179,0 m N cfq97SN complete rqnoidle 1
mmcqd/0-80 [000] ...1 100.419393: 179,0 m N cfq196SN dispatch_insert
mmcqd/0-80 [000] ...1 100.419400: 179,0 m N cfq196SN dispatched a request
mmcqd/0-80 [000] ...1 100.419405: 179,0 m N cfq196SN activate rq, drv=2
mmcqd/0-80 [000] ...2 100.419409: 179,0 D WS 1706894 + 2 [mmcqd/0]
jbd2/mmcblk0p5--97 [001] ...1 100.419431: 179,0 A FWFS 415906 + 2 <- (179,5) 278656
jbd2/mmcblk0p5--97 [001] ...1 100.419440: 179,0 Q WS 415906 + 2 [jbd2/mmcblk0p5-]
jbd2/mmcblk0p5--97 [001] ...1 100.419465: 179,0 G WS 415906 + 2 [jbd2/mmcblk0p5-]
jbd2/mmcblk0p5--97 [001] ...2 100.419475: 179,0 I WS 415906 + 2 [jbd2/mmcblk0p5-]
jbd2/mmcblk0p5--97 [001] ...1 100.419484: 179,0 m N cfq97SN insert_request
jbd2/mmcblk0p5--97 [001] ...1 100.419491: 179,0 m N cfq97SN add_to_rr
jbd2/mmcblk0p5--97 [001] ...1 100.419502: 179,0 m N cfq97SN preempt
jbd2/mmcblk0p5--97 [001] ...1 100.419507: 179,0 m N cfq196SN slice expired t=1
jbd2/mmcblk0p5--97 [001] ...1 100.419514: 179,0 m N cfq196SN resid=120000000
jbd2/mmcblk0p5--97 [001] ...1 100.419526: 179,0 m N cfq196SN sl_used=10000000 disp=2 charge=10000000 iops=0 sect=4
jbd2/mmcblk0p5--97 [001] ...1 100.419530: 179,0 m N cfq196SN del_from_rr
mmcqd/0-80 [000] ...1 100.424339: 179,0 C WS 1706892 + 2 [0]
mmcqd/0-80 [000] ...1 100.424367: 179,0 m N cfq196SN complete rqnoidle 1
mmcqd/0-80 [000] ...1 100.424388: 179,0 m N cfq97SN set_active wl_class:0 wl_type:1
mmcqd/0-80 [000] ...1 100.424396: 179,0 m N cfq97SN dispatch_insert
mmcqd/0-80 [000] ...1 100.424404: 179,0 m N cfq97SN dispatched a request
mmcqd/0-80 [000] ...1 100.424409: 179,0 m N cfq97SN activate rq, drv=2
mmcqd/0-80 [000] ...2 100.424413: 179,0 D WS 415906 + 2 [mmcqd/0]
mmcqd/0-80 [000] ...1 100.427349: 179,0 C WS 1706894 + 2 [0]
mmcqd/0-80 [000] ...1 100.427382: 179,0 m N cfq196SN complete rqnoidle 1
jbd2/mmcblk0p6--196 [000] ...1 100.427441: 179,0 A FWFS 1706896 + 2 <- (179,6) 32782
jbd2/mmcblk0p6--196 [000] ...1 100.427458: 179,0 Q WS 1706896 + 2 [jbd2/mmcblk0p6-]
jbd2/mmcblk0p6--196 [000] ...1 100.427482: 179,0 G WS 1706896 + 2 [jbd2/mmcblk0p6-]
jbd2/mmcblk0p6--196 [000] ...2 100.427492: 179,0 I WS 1706896 + 2 [jbd2/mmcblk0p6-]
jbd2/mmcblk0p6--196 [000] ...1 100.427499: 179,0 m N cfq196SN insert_request
jbd2/mmcblk0p6--196 [000] ...1 100.427505: 179,0 m N cfq196SN add_to_rr
jbd2/mmcblk0p6--196 [000] ...1 100.427516: 179,0 m N cfq196SN preempt
jbd2/mmcblk0p6--196 [000] ...1 100.427521: 179,0 m N cfq97SN slice expired t=1
jbd2/mmcblk0p6--196 [000] ...1 100.427528: 179,0 m N cfq97SN resid=120000000
jbd2/mmcblk0p6--196 [000] ...1 100.427545: 179,0 m N cfq97SN sl_used=10000000 disp=1 charge=10000000 iops=0 sect=2
jbd2/mmcblk0p6--196 [000] ...1 100.427550: 179,0 m N cfq97SN del_from_rr
mmcqd/0-80 [000] ...1 100.427598: 179,0 m N cfq196SN set_active wl_class:0 wl_type:1
mmcqd/0-80 [000] ...1 100.427605: 179,0 m N cfq196SN dispatch_insert
mmcqd/0-80 [000] ...1 100.427612: 179,0 m N cfq196SN dispatched a request
mmcqd/0-80 [000] ...1 100.427618: 179,0 m N cfq196SN activate rq, drv=2
mmcqd/0-80 [000] ...2 100.427622: 179,0 D WS 1706896 + 2 [mmcqd/0]
mmcqd/0-80 [000] ...1 100.431133: 179,0 C WS 415906 + 2 [0]
mmcqd/0-80 [000] ...1 100.431164: 179,0 m N cfq97SN complete rqnoidle 1
mmcqd/0-80 [000] ...1 100.434921: 179,0 C WS 1706896 + 2 [0]
mmcqd/0-80 [000] ...1 100.434951: 179,0 m N cfq196SN complete rqnoidle 1
mmcqd/0-80 [000] ...1 100.434962: 179,0 m N cfq196SN set_slice=120000000
mmcqd/0-80 [000] ...1 100.434969: 179,0 m N cfq schedule dispatch
kworker/u4:1-65 [001] ...1 101.612916: 179,0 A WM 137922 + 2 <- (179,5) 672
kworker/u4:1-65 [001] ...1 101.612949: 179,0 Q WM 137922 + 2 [kworker/u4:1]
kworker/u4:1-65 [001] ...1 101.613001: 179,0 G WM 137922 + 2 [kworker/u4:1]
kworker/u4:1-65 [001] ...1 101.613012: 179,0 P N [kworker/u4:1]
kworker/u4:1-65 [001] ...1 101.613071: 179,0 A WM 1674662 + 2 <- (179,6) 548
kworker/u4:1-65 [001] ...1 101.613077: 179,0 Q WM 1674662 + 2 [kworker/u4:1]
kworker/u4:1-65 [001] ...1 101.613093: 179,0 G WM 1674662 + 2 [kworker/u4:1]
kworker/u4:1-65 [001] ...2 101.613119: 179,0 I WM 137922 + 2 [kworker/u4:1]
kworker/u4:1-65 [001] ...1 101.613131: 179,0 m N cfq200A insert_request
kworker/u4:1-65 [001] ...1 101.613139: 179,0 m N cfq200A add_to_rr
kworker/u4:1-65 [001] ...1 101.613152: 179,0 m N cfq200A preempt
kworker/u4:1-65 [001] ...1 101.613157: 179,0 m N cfq196SN slice expired t=1
kworker/u4:1-65 [001] ...1 101.613164: 179,0 m N cfq196SN resid=-1058203000
kworker/u4:1-65 [001] ...1 101.613179: 179,0 m N cfq196SN sl_used=120000000 disp=1 charge=120000000 iops=0 sect=2
kworker/u4:1-65 [001] ...1 101.613185: 179,0 m N cfq196SN del_from_rr
kworker/u4:1-65 [001] ...2 101.613198: 179,0 I WM 1674662 + 2 [kworker/u4:1]
kworker/u4:1-65 [001] ...1 101.613206: 179,0 m N cfq200A insert_request
kworker/u4:1-65 [001] ...2 101.613214: 179,0 U N [kworker/u4:1] 2
mmcqd/0-80 [000] ...1 101.613238: 179,0 m N cfq workload slice:40000000
mmcqd/0-80 [000] ...1 101.613248: 179,0 m N cfq200A set_active wl_class:0 wl_type:0
mmcqd/0-80 [000] ...1 101.613258: 179,0 m N cfq200A dispatch_insert
mmcqd/0-80 [000] ...1 101.613267: 179,0 m N cfq200A dispatched a request
mmcqd/0-80 [000] ...1 101.613274: 179,0 m N cfq200A activate rq, drv=1
mmcqd/0-80 [000] ...2 101.613280: 179,0 D WM 1674662 + 2 [mmcqd/0]
mmcqd/0-80 [000] ...1 101.613511: 179,0 m N cfq200A dispatch_insert
mmcqd/0-80 [000] ...1 101.613520: 179,0 m N cfq200A dispatched a request
mmcqd/0-80 [000] ...1 101.613525: 179,0 m N cfq200A activate rq, drv=2
mmcqd/0-80 [000] ...2 101.613529: 179,0 D WM 137922 + 2 [mmcqd/0]
mmcqd/0-80 [000] ...1 101.618520: 179,0 C WM 1674662 + 2 [0]
mmcqd/0-80 [000] ...1 101.618576: 179,0 m N cfq200A complete rqnoidle 0
mmcqd/0-80 [000] ...1 101.618586: 179,0 m N cfq200A set_slice=40000000
mmcqd/0-80 [000] ...1 101.623185: 179,0 C WM 137922 + 2 [0]
mmcqd/0-80 [000] ...1 101.623215: 179,0 m N cfq200A complete rqnoidle 0
mmcqd/0-80 [000] ...1 101.623221: 179,0 m N cfq schedule dispatch
- 注意:以下信息与 Android 发行版相关,因为文件系统为只读,因此必须使用ADB。
PC $> adb root; adb remount
PC $> adb shell
Board $> ...
参考
- 1. https://linux.die.net/man/8/blktrace
- 2. https://linux.die.net/man/1/blkparse
- 3. https://wiki.yoctoproject.org/wiki/Tracing_and_Profiling#blktrace
- 有用的外部链接
文件链接 | 文件类型 | 描述 |
---|---|---|
blktrace 工具源代码,包括用户空间工具 | 资料来源 | blktrace来源git |
blktrace 演示 | 介绍 | Alan D. Brunelle的演讲 |