• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.data120
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&nbsp;&lt;freq&gt; | 设置采样事件的触发频率,默认为4000。<br/>说明:该频率越高cpu负载会越高,但是数据采样会越多。 |
135| --period&nbsp;&lt;_num_&gt; | 设置采样事件触发周期,以次数为单位,即发生指定的次数后采样一次。 |
136| -e | 指定监听的事件,可以通过list命令查看支持的所有事件,其中event:u&nbsp;或者&nbsp;:k&nbsp;可以表示限制事件为用户空间或者内核空间。 |
137| -g | 指定需要在同一组监听的事件,同一组事件会被放入同一个PMU监听。 |
138| --no-inherit | 不监听目标线程或者进程启动的子线程。 |
139| -p | 指定需要监听的进程。 |
140| -t | 指定需要监听的线程。 |
141| --offcpu | 监听CPU调度事件,它等价于&nbsp;--period&nbsp;1&nbsp;-e&nbsp;sched:sched_switch&nbsp;事件。 |
142| -j&nbsp;&lt;_branch_filter1_&gt;[,_branch_filter2_]... | 监听分支预测事件。分支预测就是指令存在多个if&nbsp;else判定的情况下,CPU去预测下一步即将执行哪一条指令。 |
143| -s&nbsp;/&nbsp;--call-stack&nbsp;&lt;_fp&nbsp;\\|&nbsp;dwarf[,size]_&gt; | 设置用户栈的回栈方式,支持fp和dwarf两种方式。dwarf&nbsp;后面可以指定采样的用户堆栈大小,默认是&nbsp;65528。 |
144| --delay-unwind | 延迟回栈,等到采样结束再进行回栈。 |
145| --disable-unwind | 不进行回栈,用户的寄存器和堆栈数据会保存在perf.data中,供离线回栈使用。 |
146| --disable-callstack-expend | 默认会对回栈的调用栈信息进行合并扩展,此选项会关闭该功能。 |
147| --clockid&nbsp;&lt;_clock&nbsp;type_&gt; | 设置采样数据的时钟源,支持monotonic、boottime、realtime等。 |
148| --symbol-dir&nbsp;&lt;_dir_&gt; | 指定符号表路径,如果指定了回栈时会优先使用该路径下的符号表。 |
149| -m&nbsp;&lt;_mmap&nbsp;pages_&gt; | 指定缓存的大小,默认值为1024,以页为单位。参数需要为2的幂,范围为&nbsp;[2&nbsp;-&nbsp;1024]。<br/>说明:该值越高,事件丢失率会越低,但是内存占用会增大。 |
150| --app&nbsp;&lt;_package&nbsp;name_&gt; | 指定采样的目标应用的包名,默认超时等待时间为10秒。 |
151| --data-limit&nbsp;&lt;_SIZE[K\|M\|G]_&gt; | 指定采样结果的最大容量,支持K/M/G(B)为单位,默认无大小限制。 |
152| -o&nbsp;&lt;_output&nbsp;file&nbsp;name_&gt; | 指定采样数据结果文件名,默认为/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&nbsp;&lt;_dir_&gt; | 指定符号表路径。 |
221| --limit-percent&nbsp;&lt;_number_&gt; | 指定展示结果的最低百分比(低于的不显示)。 |
222| -s&nbsp;/&nbsp;--call-stack | 指定该选项后结果数据中会包含详细的调用栈信息。 |
223| --call-stack-limit-percent&nbsp;&lt;_number_&gt; | 调用栈的百分比最小值(低于的不显示)。 |
224| --proto | 将输入的&nbsp;perf.data&nbsp;文件转换为&nbsp;proto&nbsp;格式,默认文件名为&nbsp;perf.proto。 |
225| --json | 将输入的&nbsp;perf.data&nbsp;文件转换为&nbsp;json&nbsp;格式,默认文件名为&nbsp;perf.json。 |
226| --branch | 按分支预测的结果地址来展示报告,而不是调用栈的IP地址。 |
227| --&lt;_keys_&gt;&nbsp;&lt;_keyname1_&gt;[,_keyname2_][,...] | 按给出的关键字来过滤展示报告,keys支持:comms、pids、tids等&nbsp;例如&nbsp;--comms&nbsp;hiperf,hilog&nbsp;表示仅显示进程/线程名称为&nbsp;hiperf或者hilog的记录条目。 |
228| --sort&nbsp;&lt;_key1_&gt;[,_key2_][,...] | 按照给出的关键字来排序和显示,支持:pid、tid、comm等,可以指定多个关键字。 |
229| -i&nbsp;&lt;_filename_&gt; | 指定输入的采样数据(默认为perf.data)。 |
230| -o&nbsp;&lt;_filename_&gt; | 指定输出的报告文件名。 |
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