1# hiperf使用指导 2 3 4hiperf是为开发人员提供性能采样分析的工具,基于内核perf机制进行的用户态能力的扩展,可以对指定的程序或者整个系统进行性能采样。 5 6 7hiperf支持的命令有:list、stat、record、report等,可以通过hiperf -h进行查看。 8 9 10下面对hiperf的常用命令进行详细说明: 11 12 13## list 命令 14 15 16### 参数说明 17 18列出设备上支持的所有perf事件名称,事件名称用于 stat 和 record命令的 -e 和 -g 参数。 19 20 21``` 22Usage: hiperf list [event type] 23``` 24 25 | 参数 | 功能说明 | 26| -------- | -------- | 27| hw | 列出支持的 hardware 事件(PMU支持) | 28| sw | 列出支持的 software 事件 | 29| tp | 列出支持 tracepotint 事件 | 30| cache | 列出支持的 cache 事件(PMU支持) | 31| raw | 列出支持的原始PMU事件 | 32 33 34### 使用示例 35 36下面列出了设备支持的hardware事件,并且会提示哪些事件此设备不支持。 37 38 39``` 40hiperf list hw 41event not support hw-stalled-cycles-backend 42event not support hw-stalled-cycles-frontend 43event not support hw-ref-cpu-cycles 44 45Supported events for hardware: 46 hw-cpu-cycles 47 hw-instructions 48 hw-cache-references 49 hw-cache-misses 50 hw-branch-instructions 51 hw-branch-misses 52 hw-bus-cycles 53``` 54 55 56## stat 命令 57 58 59### 参数说明 60 61 监听指定目标程序,周期性打印性能计数器的值。 62 63``` 64Usage: hiperf stat [options] 65 Collect performance counter information. 66``` 67 68 69 | 参数 | 功能说明 | 70| -------- | -------- | 71| -a | 采集监听整个系统的所有线程和默认的性能计数器的值。 | 72| -c | 指定cpu id,可以是0,1,2用逗号分隔。 | 73| -d <_sec_> | 指定监听的时间,单位为秒。 | 74| -i <_ms_> | 指定监听事件的间隔打印时间,单位毫秒。 | 75| -e | 指定监听的事件,可以通过list命令查看支持的所有事件,其中event:u 或者 :k 表示限制事件为用户空间或者内核空间。 | 76| -g | 指定需要在同一组监听的事件,同一组事件会被放入同一个PMU监听。 | 77| --no-inherit | 不监听目标线程/进程启动的子线程。 | 78| -p | 指定需要监听的进程pid。 | 79| -t | 指定需要监听的线程tid。 | 80| --verbose | 显示详细的报告内容,包括一些原始的时间数据等等。 | 81 82 83### 使用示例 84 85下面是通过 stat 监听整个系统3秒的示例: 86 87 88``` 89hiperf stat -d 3 -a 90this is root mode, perfEventParanoid assume as -1 91Start Profiling... 92Timeout exit (total 3009 ms) 93 count name | comment | coverage 94 132523 hw-branch-instructions | 15.750 M/sec | (100%) 95 62554 hw-branch-misses | 47.202372% miss rate | (100%) 96 6994768 hw-cpu-cycles | 0.832068 GHz | (100%) 97 1237627 hw-instructions | 5.651758 cycles per instruction | (100%) 98 248 sw-context-switches | 29.959 K/sec | (100%) 99 0 sw-page-faults | 0.000 /sec | (100%) 100 9402580 sw-task-clock | 0.002758 cpus used | (100%) 101``` 102 103 104### 字段说明 105 106 | 字段名 | 含义 | 107| -------- | -------- | 108| count | 表示事件发生的次数。 | 109| name | 事件的名称,在 list 命令中可以看到所有支持的命令,hw 和 sw 的前缀分别代表是hardware事件还是software事件。 | 110| comment | 一些经过计算的方便用户阅读的值。例如 CPU 的相对主频,千位进制换算等等。 | 111| coverage | 该事件在PMU中的 enable 百分比,受限于PMU数量,每次装载的PMU监听事件是有限的。 | 112 113 114## record 命令 115 116 117### 参数说明 118 119采样指定目标程序,并且将采样数据保存到指定的文件中(默认为perf.data) 120 121 122``` 123Usage: hiperf record [options] 124 Collect performance sampling information. 125``` 126 127 | 参数 | 功能说明 | 128| -------- | -------- | 129| -a | 对整个系统的所有进程和线程进行采样。 | 130| --exclude-hiperf | 不采样hiperf自身进程。 | 131| -c | 指定采样的cpu id。 | 132| --cpu-limit <_percent_> | 限定采样过程占用的CPU最大百分比。 | 133| -d <sec> | 指定采样时长,单位秒。 | 134| -f <freq> | 设置采样事件的触发频率,默认为4000。<br/>说明:该频率越高cpu负载会越高,但是数据采样会越多。 | 135| --period <_num_> | 设置采样事件触发周期,以次数为单位,即发生指定的次数后采样一次。 | 136| -e | 指定监听的事件,可以通过list命令查看支持的所有事件,其中event:u 或者 :k 可以表示限制事件为用户空间或者内核空间。 | 137| -g | 指定需要在同一组监听的事件,同一组事件会被放入同一个PMU监听。 | 138| --no-inherit | 不监听目标线程或者进程启动的子线程。 | 139| -p | 指定需要监听的进程。 | 140| -t | 指定需要监听的线程。 | 141| --offcpu | 监听CPU调度事件,它等价于 --period 1 -e sched:sched_switch 事件。 | 142| -j <_branch_filter1_>[,_branch_filter2_]... | 监听分支预测事件。分支预测就是指令存在多个if else判定的情况下,CPU去预测下一步即将执行哪一条指令。 | 143| -s / --call-stack <_fp \\| dwarf[,size]_> | 设置用户栈的回栈方式,支持fp和dwarf两种方式。dwarf 后面可以指定采样的用户堆栈大小,默认是 65528。 | 144| --delay-unwind | 延迟回栈,等到采样结束再进行回栈。 | 145| --disable-unwind | 不进行回栈,用户的寄存器和堆栈数据会保存在perf.data中,供离线回栈使用。 | 146| --disable-callstack-expend | 默认会对回栈的调用栈信息进行合并扩展,此选项会关闭该功能。 | 147| --clockid <_clock type_> | 设置采样数据的时钟源,支持monotonic、boottime、realtime等。 | 148| --symbol-dir <_dir_> | 指定符号表路径,如果指定了回栈时会优先使用该路径下的符号表。 | 149| -m <_mmap pages_> | 指定缓存的大小,默认值为1024,以页为单位。参数需要为2的幂,范围为 [2 - 1024]。<br/>说明:该值越高,事件丢失率会越低,但是内存占用会增大。 | 150| --app <_package name_> | 指定采样的目标应用的包名,默认超时等待时间为10秒。 | 151| --data-limit <_SIZE[K\|M\|G]_> | 指定采样结果的最大容量,支持K/M/G(B)为单位,默认无大小限制。 | 152| -o <_output file name_> | 指定采样数据结果文件名,默认为/data/local/tmp/perf.data。 | 153| -z | 启动压缩模式,在保存到文件的时候,会用gzip进行压缩。 | 154| --verbose | 采样的时候显示更详细的日志信息。 | 155 156 157### 使用示例 158 159- 对全系统所有进程采样3秒,并且显示详细的日志信息 160 161 ``` 162 hiperf record -d 3 -a --verbose 163 ``` 164 165- 指定使用fp方式进行回栈 166 167 ``` 168 hiperf record -s fp -d 3 -a 169 ``` 170 171- 指定使用dwarf方式进行回栈 172 173 ``` 174 hiperf record -s dwarf -d 3 -a 175 ``` 176 177- 指定采样offcpu事件 178 179 ``` 180 hiperf record --offcpu -s dwarf -d 3 -a 181 ``` 182 183- 指定延迟回栈 184 185 ``` 186 hiperf record -d 3 -s dwarf --delay-unwind -a 187 ``` 188 189- 禁止回栈,此时会保存堆栈数据到perf.data文件 190 191 ``` 192 hiperf record -d 3 -s dwarf --disable-unwind -a 193 ``` 194 195- 指定追踪的包名,如果指定的包名对应的进程不存在则会延时等待10秒,超时后进程退出 196 197 ``` 198 hiperf record -d 3 -s dwarf --app com.ohos.launch 199 ``` 200 201- 指定对采样结果数据进行压缩保存 202 203 ``` 204 hiperf record -z -s dwarf -d 3 -a 205 ``` 206 207 208## report 命令 209 210此命令主要用于展示record中抓取的采样数据 211 212 213``` 214Usage: hiperf report [option] 215 Report sampling information from perf.data. 216``` 217 218 | 参数 | 功能说明 | 219| -------- | -------- | 220| --symbol-dir <_dir_> | 指定符号表路径。 | 221| --limit-percent <_number_> | 指定展示结果的最低百分比(低于的不显示)。 | 222| -s / --call-stack | 指定该选项后结果数据中会包含详细的调用栈信息。 | 223| --call-stack-limit-percent <_number_> | 调用栈的百分比最小值(低于的不显示)。 | 224| --proto | 将输入的 perf.data 文件转换为 proto 格式,默认文件名为 perf.proto。 | 225| --json | 将输入的 perf.data 文件转换为 json 格式,默认文件名为 perf.json。 | 226| --branch | 按分支预测的结果地址来展示报告,而不是调用栈的IP地址。 | 227| --<_keys_> <_keyname1_>[,_keyname2_][,...] | 按给出的关键字来过滤展示报告,keys支持:comms、pids、tids等 例如 --comms hiperf,hilog 表示仅显示进程/线程名称为 hiperf或者hilog的记录条目。 | 228| --sort <_key1_>[,_key2_][,...] | 按照给出的关键字来排序和显示,支持:pid、tid、comm等,可以指定多个关键字。 | 229| -i <_filename_> | 指定输入的采样数据(默认为perf.data)。 | 230| -o <_filename_> | 指定输出的报告文件名。 | 231 232 233## 使用示例 234 235- 输出采样数据的报告,默认读取perf.data文件 236 237 ``` 238 hiperf report 239 ``` 240 241 输出结果举例: 242 243 244 ``` 245 Heating count comm pid tid dso func 246 5.68% 15073949 hiperf_example_ 1085 1091 /system/lib/ld-musl-arm.so.1 malloc 247 2.57% 6834119 hiperf_example_ 1085 1091 [kernel.kallsyms] vector_swi 248 2.27% 6013910 hiperf_example_ 1085 1087 /system/lib/ld-musl-arm.so.1 malloc 249 2.19% 5805738 hiperf_example_ 1085 1091 /system/lib/ld-musl-arm.so.1 vfprintf 250 2.09% 5543362 hiperf_example_ 1085 1091 [kernel.kallsyms] ktime_get_ts64 251 report done 252 ``` 253 254- 输出采集数据的调用栈报告 255 256 ``` 257 hiperf report -s 258 ``` 259 260- 指定符号表路径 261 262 ``` 263 hiperf report -s --symbol-dir /data/local/tmp 264 ``` 265 266- 指定结果过滤的关键字,指定后会只显示包含该关键字的信息。比如过滤libutils.z.so则命令如下: 267 268 ``` 269 hiperf report --dsos libuitls.z.so 270 ``` 271 272- 指定按照特定的关键字进行排序展示,比如按照dso进行排序: 273 274 ``` 275 hiperf report --sort dso 276 ``` 277