• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# hiperf 应用性能优化剖析组件
2
3-   [简介](#简介)
4    -   [架构](#架构)
5
6-   [约束](#约束)
7-   [编译构建](编译构建)
8-   [目录](#目录)
9    -   [使用说明](#使用说明)
10    -   [接口说明](#接口说明)
11-   [相关仓](相关仓)
12
13## 简介
14
15hiperf 是 OpenHarmony 为开发人员提供的用于调试的命令行工具,用于抓取特定程序或者系统的性能数据,类似内核的 perf  工具,该工具支持在 Windows/Linux/Mac 等操作系统上运行。
16
17### 架构
18
19![](figures/hiperf_architecture_zh.png)
20
21## 目录
22
23```
24/developtools/hiperf
25├── demo			# demo 程序
26│   ├── cpp			# C++ demo 程序,示范了如何调用API和模拟的采样场景
27│   └── js			# JS demo 程序,示范了如何调用API
28├── include			# 工程的头文件
29│   └── nonlinux	# 交叉编译的头文件(非linux平台)
30├── interfaces		# 接口忘记
31│   ├── innerkits	# C++ API 接口
32│   └── kits		# JS API 接口
33├── proto			# report 命令导出到proto的数据结构定义
34├── script			# Host 脚本,包括 HTML
35│   └── test		# 脚本的单元测试
36├── src				# 源代码文件夹
37└── test			# 源代码的单元测试
38
39```
40
41## 约束
42
43运行环境条件约束如下
44
45| 依赖组件 | 版本  |
46| -------- | ----- |
47| Python   | 3.7.0 |
48|          |       |
49
50
51
52## 编译构建
53
54#### 基础配置
55
56- 确保组件名在于产品形态配置的 json 中
57  - [产品形态配置](https://gitee.com/openharmony/productdefine_common)
58    - 加入 `"developtools:hiperf":{}` 即可
59
60
61#### 编译命令
62
63| 编译说明                               | 编译参数                            |
64| -------------------------------------- | ----------------------------------- |
65| 只编译当前设备平台的二进制执行文件     | --build-target hiperf_target        |
66| 编译所有的平台的所有组件(包括单元测试) | --build-target hiperf_all           |
67| 编译目标为 x86_64 Linux 平台的工具     | --gn-args "hiperf_target_host=true" |
68| 编译单元测试                           | --build-target hiperf_unittest      |
69| 编译单元测试的接口部分(命令行部分)     | --build-target hiperf_interfacetest |
70
71
72#### 编译输出 ####
73
74| 编译目标          | 运行平台 | 文件位置                                              | 文件名               |
75| ----------------- | -------- | ----------------------------------------------------- | -------------------- |
76| Dev 端命令行程序  | arm      | out\ohos-arm-release\developtools\hiperf\hiperf       | hiperf               |
77|                   | linux    | out\ohos-arm-release\clang_x64\developtools\hiperf    | hiperf               |
78| Host 端命令行程序 | linux    | out\ohos-arm-release\clang_x64\developtools\hiperf    | hiperf_host          |
79|                   | windows  | out\ohos-arm-release\mingw_x86_64\developtools\hiperf | hiperf_host.exe      |
80| Host 端动态库     | linux    | out\ohos-arm-release\clang_x64\developtools\hiperf    | libhiperf_report.so  |
81|                   | windows  | out\ohos-arm-release\mingw_x86_64\developtools\hiperf | libhiperf_report.dll |
82
83也可以在编译完成后
84
85运行 developtools/hiperf/script/package.sh 打包到out文件夹中
86
87```
88host/
89└── developtools
90    ├── hiperf
91    │   ├── bin									# 所有的二进制文件
92    │   │   ├── linux							# linux 平台
93    │   │   │   └── x86_64
94    │   │   │       ├── hiperf_host				# PC运行的执行程序,支持Report和Dump命令
95    │   │   │       └── libhiperf_report.so		# PC运行的LIB文件,供python脚本使用
96    │   │   ├── ohos
97    │   │   │   └── arm							# arm 平台
98    │   │   │       └── hiperf					# 板端执行程序
99    │   │   └── windows							# windows 平台
100    │   │       └── x86_64
101    │   │           ├── hiperf_host.exe			# PC运行的执行程序
102    │   │           └── libhiperf_report.dll	# PC运行的LIB文件
103    │   │
104    │   │										# 下面都是python文件,在PC侧执行
105    │   ├── command_script.py					# hiperf 命令行的包装脚本,产生采样数据
106    │   ├── hiperf_utils.py						# 脚本自己的工具类
107    │   ├── loadlib_test.py						# lib 测试脚本
108    │   ├── make_diff.py						# 产生Diff数据的脚本
109    │   ├── make_report.py						# 从采样数据产生报告的脚本
110    │   ├── recv_binary_cache.py				# 收集符号表的脚本
111    │   └── report.html							# HTML 展示页面的模板
112    └── hiperf.tar.gz							# 上述文件的打包文件
113
114```
115
116
117
118#### 带调试符号的版本
119
120- 在对应的平台out里面找 exe.unstrippedlib.unstripped,例如:
121
122  - out\ohos-arm-release\clang_x64\exe.unstripped\clang_x64\developtools\hiperf
123
124
125
126## 使用说明
127
128### 测试代码
129
130我们在 hiperf_example_cmd.cpp 里面提供了一些测试代码,
131
132用来验证一些采样功能,比如线程调度,内存申请,CPU 负荷等等。
133
134代码位于
135
136```
137hiperf\demo\cpp\hiperf_example_cmd.cpp
138```
139
140测试命令帮助
141
142```
143 ./hiperf_example_cmd --help
144this is a demo test command
145  Use the following commands to simulate different scenarios
146  --help
147    this page
148  --thread <number>
149    setup the thread number, default is 5 second
150  --time <time>
151    setup run sec, default is 10 second
152  --stack <level>
153    setup stack level, default is 5
154  --nowait
155    setup skip the start, default wait the start
156  --dynamic
157    will run some code in each stack level
158  --mmap
159    will run mmap code in the loop
160```
161
162
163
164### 主要的命令格式
165
166```
167hiperf [options] COMMAND [args for command]
168```
169
170
171
172- [options]
173  - 可选的参数
174  - 主要是一些调试命令,如打开log等
175- COMMAND
176  - 必选参数
177  - 子功能的名字,如recrod,report 等等
178- [args for command]
179  - 子功能的参数
180
181### 帮助命令
182
183可以用 --help 查看帮助
184
185```
186--help [command]
187
188[command] --help
189```
190
191以上两种格式都是可以的
192
193### 主命令参数
194
195| 参数                            | 功能说明                         |
196| ------------------------------- | -------------------------------- |
197| --help [command]                | 显示指定功能的帮助信息           |
198| --debug                         | 打开 DEBUG 级别的调试日志        |
199| --verbose                       | 打开 VERBOSE 级别的调试日志      |
200| --much                          | 打开 MUCH 级别的调试日志         |
201| --mixlog                        | 混合调试日志输出到屏幕上(stdout) |
202| --logtag <tagA [,tagB] [,tagC]> | 打开指定模块的MUCH级别的调试日志 |
203| --hilog                         | 日志打印到Hilog中                |
204| --logpath                       | 指定日志保存的路径               |
205| --nodebug                       | 停止打印任何日志                 |
206
207### list 命令
208
209列出设备上支持的所有事件名称
210
211事件名称用于 stat 和 record 的 -e 和 -g 参数
212
213```
214Usage: hiperf list [event type name]
215```
216
217下面列出了设备支持的HW事件,并且会提示哪些事件此设备不支持
218
219```
220./hiperf list hw
221```
222
223### stat 命令
224
225监听指定目标程序,周期性打印性能计数器的值
226
227```
228Usage: hiperf stat [options] [command [command-args]]
229       Collect performance counter information of running [command].
230```
231
232下面展示了一个 stats 监听本进程 在 CPU 0 上 3 秒的性能计数器命令
233
234```
235 ./hiperf stat -d 3 -c 0
236```
237
238### record 命令
239
240采样指定目标程序,并且将采样数据保存到指定的文件中(默认为perf.data)
241
242```
243Usage: hiperf record [options] [command [command-args]]
244       Collect performance sampling information of running [command].
245```
246
247对全系统所有进程采样3秒,并且显示详细的信息
248
249```
250./hiperf record -d 3 -a --verbose
251```
252
253### dump 命令
254
255此命令主要用于以不加以处理的方式直接读取perf.data的数据
256
257开发和测试人员可以核对其中的原始采样数据的正确性。
258
259```
260Usage: hiperf dump [option] \<filename\>
261       Dump specific parts of specified file .
262```
263
264### report 命令
265
266此命令主要用于展示相关采样数据(从perf.data中读取)
267
268并且转换为用户需要的格式(比如Json或者ProtoBuf)
269
270```
271Usage: hiperf dump [option] \<filename\>
272       Dump specific parts of specified file .
273```
274
275范例输出普通报告的命令,限制为占比不超过1%
276
277```
278./hiperf report --limit-percent 1
279```
280
281### 脚本
282
283一般用户用脚本执行采样操作(因为可以简单的产生HTML报告)
284
285##### 采样
286
287command_script.py 完成,他是 report 命令的包装脚本
288
289```
290usage: command_script.py [-h]
291                         (-app PACKAGE_NAME | -lp LOCAL_PROGRAM | -cmd CMD | -p [PID [PID ...]] | -t [TID [TID ...]] | -sw)
292                         [-a ABILITY] [-r RECORD_OPTIONS] [-lib LOCAL_LIB_DIR]
293                         [-o OUTPUT_PERF_DATA] [--not_hdc_root]
294
295Collect performance sampling information of running [command].
296```
297
298对指定包名采样,包名是 com.ohos.launch
299
300```
301python command_script.py -app com.ohos.launch
302```
303
304对特定进程采样,进程名称是 hdcd
305
306```
307python command_script.py -lp hdcd
308```
309
310##### 收集符号表
311
312recv_binary_cache.py 完成,他主要根据 perf.data 里面记录的相关文件和库,以及它们的 buildid 在用户指定的路径中去寻找对应的 ELF 作为符号表文件用于回栈或者打印函数名等。
313
314```
315usage: recv_binary_cache.py [-h] [-i PERF_DATA]
316                            [-l LOCAL_LIB_DIR [LOCAL_LIB_DIR ...]]
317
318Recv binaries needed by perf.data from device to binary_cache directory.
319```
320
321指定了2个符号表路径的位置
322
323```
324python recv_binary_cache.py -l Z:\OHOS_MASTER\out\ohos-arm-release\lib.unstripped  Z:\OHOS_MASTER\out\ohos-arm-release\exe.unstripped
325```
326
327对应的符号表文件会复制到 binary_cache 文件夹里面
328
329优先检查用户给出的符号表位置,如果没有则复制设备中的文件
330
331##### 展示
332
333make_report.py 完成,将采样后的数据导出为HTML展示页面
334
335```
336usage: make_report.py [-h] [-i PERF_DATA] [-r REPORT_HTML]
337
338To make a report, you need to enter the data source and the path of the
339report.
340```
341
342产生HTML文件,默认的文件名是 hiperf_report.html
343
344```
345python make_report.py
346```
347
348- 展示页面首页
349
350![](figures/hiperf_homepage.png)
351
352- 展示页面火焰图
353
354![](figures/hiperf_flame.png)
355
356## 常见故障说明
357
358#### Can't find hdc_std in PATH environment.
359
360```
361python command_script.py -lp ps
362['../..\\..\\platform-tools\\hdc', 'version']
363['hdc', 'version']
364Traceback (most recent call last):
365  File "command_script.py", line 367, in <module>
366    main(parser_add_argument())
367  File "command_script.py", line 361, in main
368    profiler = PerformanceProfile(args)
369  File "command_script.py", line 143, in __init__
370    self.hdc = HdcInterface(root_authority=not args.not_hdc_root)
371  File "Z:\OHOS_MASTER\out\host\developtools\hiperf\hiperf_utils.py", line 173, in __init__
372    raise Exception("Can't find hdc in PATH environment.")
373Exception: Can't find hdc_std in PATH environment.
374```
375
376请确认 PATH 环境变量中有 hdc 的执行文件
377
378确认方法
379
380```
381where hdc_std
382Z:\OHOS_MASTER\developtools\hdc_standard\prebuilt\windows\hdc_std.exe
383Z:\OHOS_STD_2.0\developtools\hdc_standard\prebuilt\windows\hdc_std.exe
384```
385
386
387
388
389## 相关仓
390
391研发工具链子系统
392
393[**developtools\hiperf**](https://gitee.com/openharmony/developtools_hiperf)
394
395[developtools\developtools_profiler](https://gitee.com/openharmony/developtools_profiler)
396
397[developtools\developtools_bytrace_standard](https://gitee.com/openharmony/developtools_bytrace_standard/)
398
399[third_party\libunwind](https://gitee.com/openharmony/third_party_libunwind)
400
401[third_party\protobuf](https://gitee.com/openharmony/third_party_protobuf)
402