• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 性能调优组件<a name="ZH-CN_TOPIC_0000001149491319"></a>
2
3-   [简介](#section6874544183112)
4-   [架构图](#section1514713331342)
5-   [目录](#section1742612449345)
6-   [说明](#section2165102016359)
7    -   [接口说明](#section558917318367)
8    -   [使用说明](#section681316903611)
9    -   [调测验证](#section35362541215)
10    -   [hiprofiler_cmd 使用说明](#section35362541216)
11        -   [参数说明](#section35362541290)
12        -   [命令展示](#section35362541500)
13            -   [基础配置参数](#section35362541219)
14            -   [ftrace抓取场景示例](#section35362541220)
15            -   [内存信息抓取场景示例](#section35362541221)
16                -   [内核内存信息](#section35362541222)
17                -   [虚拟内存统计](#section35362541223)
18                -   [进程内存使用跟踪](#section35362541224)
19                -   [输出进程jemalloc的stats信息](#section35362541227)
20            -   [bytrace/hitrace场景示例](#section35362541225)
21            -   [hiperf场景示例](#section35362541226)
22-   [相关仓](#section1293495681320)
23
24## 简介<a name="section6874544183112"></a>
25
26性能调优组件包含系统和应用调优框架,旨在为开发者提供一套性能调优平台,可以用来分析内存、性能等问题。
27
28该组件整体分为PC端和设备端两部分,PC端最终作为deveco studio的插件进行发布,内部主要包括分为UI绘制、设备管理、进程管理、插件管理、数据导入、数据存储、 数据分析、Session管理、配置管理等模块;设备端主要包括命令行工具、服务进程、插件集合、应用程序组件等模块。设备端提供了插件扩展能力,对外提供了插件接口,基于该扩展能力可以按需定义自己的能力,并集成到框架中来,目前基于插件能力已经完成了实时内存插件,trace插件。下文会重点对设备端提供的插件能力进行介绍。
29
30## 架构图<a name="section1514713331342"></a>
31
32![](figures/zh-cn_image_0000001162598155.png)
33
34## 目录<a name="section1742612449345"></a>
35
36```
37/developtools/profiler
38├── device                       # 设备侧代码目录
39│   ├── base                     # 基础功能代码
40│   │   ├── include              # 基础功能的头文件代码目录
41│   |   ├── src                  # 基础功能的源文件代码目录
42│   |   └── test                 # 基础功能的测试代码目录
43│   ├── cmds                     # 对外命令行模块的代码
44│   |   ├── include              # 对外命令行模块的头文件代码目录
45│   |   ├── src                  # 对外命令行模块的源文件代码目录
46│   |   └── test                 # 对外命令行模块的测试代码目录
47│   └── plugins                  # 插件代码目录
48│       ├── api                  # 插件模块对外提供的接口文件代码目录
49│       |   ├── include          # 插件模块对外提供的接口头文件代码目录
50│       |   └── src              # 插件模块对外提供的接口源文件代码目录
51│       ├── memory_plugin        # 内存插件模块代码目录
52│       |   ├── include          # 内存插件模块头文件代码目录
53│       |   ├── src              # 内存插件模块源文件代码目录
54│       |   └── test             # 内存插件模块测试代码目录
55│       └── trace_plugin         # trace插件模块代码目录
56│           ├── include          # trace插件模块头文件代码目录
57│           ├── src              # trace插件模块源文件代码目录
58│           └── test             # trace插件模块测试代码目录
59├── host                         # 主机侧代码目录
60│   └── ohosprofiler             # 主机侧调优模块代码目录
61│       └── src                  # 主机侧调优模块源文件代码目录
62├── protos                       # 项目中的proto格式文件的代码目录
63│   └── innerkits                # 对内部子系统暴露的头文件存放目录
64│       └── builtin              # JS应用框架对外暴露JS三方module API接口存放目录
65├── trace_analyzer               # bytrace解析模块的代码目录
66│   ├── include                  # bytrace解析模块的公共头文件存放目录
67│   └── src                      # bytrace解析模块功能源文件存放目录
68├── interfaces                   # 项目中接口的代码目录
69│   ├── innerkits                # 模块间接口的代码目录
70│   └── kits                     # 对外提供接口存放目录
71```
72
73## 说明<a name="section2165102016359"></a>
74
75下面针对设备端对外提供的插件扩展能力进行接口和使用说明。
76
77### 接口说明<a name="section558917318367"></a>
78
79下面是设备端插件模块对外提供的接口:
80
81-   PluginModuleCallbacks为插件模块对外提供的回调接口,插件管理模块通过该回调接口列表与每一个插件模块进行交互,每一个新增插件都需要实现该接口列表中的函数。
82
83**表 1**  PluginModuleCallbacks接口列表
84
85<a name="table214mcpsimp"></a>
86<table><thead align="left"><tr id="row221mcpsimp"><th class="cellrowborder" valign="top" width="30%" id="mcps1.2.4.1.1"><p id="p223mcpsimp"><a name="p223mcpsimp"></a><a name="p223mcpsimp"></a>接口名</p>
87</th>
88<th class="cellrowborder" valign="top" width="30.020000000000003%" id="mcps1.2.4.1.2"><p id="p225mcpsimp"><a name="p225mcpsimp"></a><a name="p225mcpsimp"></a>类型</p>
89</th>
90<th class="cellrowborder" valign="top" width="39.98%" id="mcps1.2.4.1.3"><p id="p227mcpsimp"><a name="p227mcpsimp"></a><a name="p227mcpsimp"></a>描述</p>
91</th>
92</tr>
93</thead>
94<tbody><tr id="row229mcpsimp"><td class="cellrowborder" valign="top" width="30%" headers="mcps1.2.4.1.1 "><p id="p231mcpsimp"><a name="p231mcpsimp"></a><a name="p231mcpsimp"></a>PluginModuleCallbacks::onPluginSessionStart</p>
95</td>
96<td class="cellrowborder" valign="top" width="30.020000000000003%" headers="mcps1.2.4.1.2 "><p id="p233mcpsimp"><a name="p233mcpsimp"></a><a name="p233mcpsimp"></a>int (*PluginSessionStartCallback)(const uint8_t* configData, uint32_t configSize);</p>
97</td>
98<td class="cellrowborder" valign="top" width="39.98%" headers="mcps1.2.4.1.3 "><a name="ul1467809165112"></a><a name="ul1467809165112"></a><ul id="ul1467809165112"><li>功能:<p id="p1208131116548"><a name="p1208131116548"></a><a name="p1208131116548"></a>插件会话开始接口,开始插件会话时会被调用,用来下发插件配置</p>
99</li><li>输入参数:<p id="p104087130518"><a name="p104087130518"></a><a name="p104087130518"></a>configData:配置信息内存块起始地址</p>
100<p id="p32731219115114"><a name="p32731219115114"></a><a name="p32731219115114"></a>configSize:配置信息内存块字节数</p>
101</li><li>返回值:<p id="p4892128135110"><a name="p4892128135110"></a><a name="p4892128135110"></a>0:成功</p>
102<p id="p1621513010517"><a name="p1621513010517"></a><a name="p1621513010517"></a>-1:失败</p>
103</li></ul>
104</td>
105</tr>
106<tr id="row236mcpsimp"><td class="cellrowborder" valign="top" width="30%" headers="mcps1.2.4.1.1 "><p id="p238mcpsimp"><a name="p238mcpsimp"></a><a name="p238mcpsimp"></a>PluginModuleCallbacks::onPluginReportResult</p>
107</td>
108<td class="cellrowborder" valign="top" width="30.020000000000003%" headers="mcps1.2.4.1.2 "><p id="p240mcpsimp"><a name="p240mcpsimp"></a><a name="p240mcpsimp"></a>int (*PluginReportResultCallback)(uint8_t* bufferData, uint32_t bufferSize);</p>
109</td>
110<td class="cellrowborder" valign="top" width="39.98%" headers="mcps1.2.4.1.3 "><a name="ul1046263617524"></a><a name="ul1046263617524"></a><ul id="ul1046263617524"><li>功能:<p id="p621321105415"><a name="p621321105415"></a><a name="p621321105415"></a>插件结果上报接口类型,当任务下发后,框架采集任务会周期性调用此接口请求回填数据</p>
111</li><li>输入参数:<p id="p12796339115211"><a name="p12796339115211"></a><a name="p12796339115211"></a>bufferData: 存放结果的内存缓冲区起始地址</p>
112<p id="p1163214085219"><a name="p1163214085219"></a><a name="p1163214085219"></a>bufferSize: 存放结果的内存缓冲区的字节数</p>
113</li><li>返回值:<p id="p114391444135212"><a name="p114391444135212"></a><a name="p114391444135212"></a>大于0:已经填充的内存字节数</p>
114<p id="p117881419526"><a name="p117881419526"></a><a name="p117881419526"></a>等于0:没有填充任何内容</p>
115<p id="p7337174625218"><a name="p7337174625218"></a><a name="p7337174625218"></a>小于0:失败</p>
116</li></ul>
117</td>
118</tr>
119<tr id="row243mcpsimp"><td class="cellrowborder" valign="top" width="30%" headers="mcps1.2.4.1.1 "><p id="p245mcpsimp"><a name="p245mcpsimp"></a><a name="p245mcpsimp"></a>PluginModuleCallbacks::onPluginSessionStop</p>
120</td>
121<td class="cellrowborder" valign="top" width="30.020000000000003%" headers="mcps1.2.4.1.2 "><p id="p247mcpsimp"><a name="p247mcpsimp"></a><a name="p247mcpsimp"></a>int (*PluginSessionStopCallback)();</p>
122</td>
123<td class="cellrowborder" valign="top" width="39.98%" headers="mcps1.2.4.1.3 "><a name="ul975785275211"></a><a name="ul975785275211"></a><ul id="ul975785275211"><li>功能:<p id="p11471347135914"><a name="p11471347135914"></a><a name="p11471347135914"></a>采集会话结束接口</p>
124</li><li>返回值:<p id="p4301105945210"><a name="p4301105945210"></a><a name="p4301105945210"></a>0:成功</p>
125<p id="p145541757125214"><a name="p145541757125214"></a><a name="p145541757125214"></a>-1:失败</p>
126</li></ul>
127</td>
128</tr>
129<tr id="row250mcpsimp"><td class="cellrowborder" valign="top" width="30%" headers="mcps1.2.4.1.1 "><p id="p252mcpsimp"><a name="p252mcpsimp"></a><a name="p252mcpsimp"></a>PluginModuleCallbacks::onRegisterWriterStruct</p>
130</td>
131<td class="cellrowborder" valign="top" width="30.020000000000003%" headers="mcps1.2.4.1.2 "><p id="p254mcpsimp"><a name="p254mcpsimp"></a><a name="p254mcpsimp"></a>int (*RegisterWriterStructCallback)(WriterStruct* writer);</p>
132</td>
133<td class="cellrowborder" valign="top" width="39.98%" headers="mcps1.2.4.1.3 "><a name="ul11459712105318"></a><a name="ul11459712105318"></a><ul id="ul11459712105318"><li>功能:<p id="p16725350135912"><a name="p16725350135912"></a><a name="p16725350135912"></a>采集框架注册写数据接口,当插件管理模块向插件注册此接口,插件可以主动调用write句柄,进行写入数据</p>
134</li><li>输入参数:<p id="p741312324531"><a name="p741312324531"></a><a name="p741312324531"></a>writer 写者指针</p>
135</li><li>返回值:<p id="p1937282325319"><a name="p1937282325319"></a><a name="p1937282325319"></a>0:成功</p>
136<p id="p3613421185314"><a name="p3613421185314"></a><a name="p3613421185314"></a>-1:失败</p>
137</li></ul>
138</td>
139</tr>
140</tbody>
141</table>
142
143-   WriterStruct是上面onRegisterWriterStruct接口中的参数,主要实现写数据接口,将插件中采集的数据通过该接口进行写入。
144
145**表 2**  WriterStruct接口列表
146
147<a name="table1469161115240"></a>
148<table><thead align="left"><tr id="row124691911182413"><th class="cellrowborder" valign="top" width="30%" id="mcps1.2.4.1.1"><p id="p14469151118247"><a name="p14469151118247"></a><a name="p14469151118247"></a>接口名</p>
149</th>
150<th class="cellrowborder" valign="top" width="30.020000000000003%" id="mcps1.2.4.1.2"><p id="p114691119249"><a name="p114691119249"></a><a name="p114691119249"></a>类型</p>
151</th>
152<th class="cellrowborder" valign="top" width="39.98%" id="mcps1.2.4.1.3"><p id="p134701611172413"><a name="p134701611172413"></a><a name="p134701611172413"></a>描述</p>
153</th>
154</tr>
155</thead>
156<tbody><tr id="row5470201102420"><td class="cellrowborder" valign="top" width="30%" headers="mcps1.2.4.1.1 "><p id="p144702115242"><a name="p144702115242"></a><a name="p144702115242"></a>WriterStruct::write</p>
157</td>
158<td class="cellrowborder" valign="top" width="30.020000000000003%" headers="mcps1.2.4.1.2 "><p id="p347010119246"><a name="p347010119246"></a><a name="p347010119246"></a>long (*WriteFuncPtr)(WriterStruct* writer, const void* data, size_t size);</p>
159</td>
160<td class="cellrowborder" valign="top" width="39.98%" headers="mcps1.2.4.1.3 "><a name="ul1783144245320"></a><a name="ul1783144245320"></a><ul id="ul1783144245320"><li>功能:<p id="p11675175517597"><a name="p11675175517597"></a><a name="p11675175517597"></a>写接口,将插件中采集的数据通过writer进行写入</p>
161</li><li>输入参数:<p id="p1812314462537"><a name="p1812314462537"></a><a name="p1812314462537"></a>writer:写者指针</p>
162<p id="p498224618534"><a name="p498224618534"></a><a name="p498224618534"></a>data:数据缓冲区首字节指针</p>
163<p id="p368519478533"><a name="p368519478533"></a><a name="p368519478533"></a>size:  数据缓冲区的字节数</p>
164</li><li>返回值:<p id="p162857527531"><a name="p162857527531"></a><a name="p162857527531"></a>0:成功</p>
165<p id="p101121150185318"><a name="p101121150185318"></a><a name="p101121150185318"></a>-1:失败</p>
166</li></ul>
167</td>
168</tr>
169<tr id="row84706116243"><td class="cellrowborder" valign="top" width="30%" headers="mcps1.2.4.1.1 "><p id="p2047081142415"><a name="p2047081142415"></a><a name="p2047081142415"></a>WriterStruct::flush</p>
170</td>
171<td class="cellrowborder" valign="top" width="30.020000000000003%" headers="mcps1.2.4.1.2 "><p id="p194111838267"><a name="p194111838267"></a><a name="p194111838267"></a>bool (*FlushFuncPtr)(WriterStruct* writer);</p>
172</td>
173<td class="cellrowborder" valign="top" width="39.98%" headers="mcps1.2.4.1.3 "><a name="ul9562185717538"></a><a name="ul9562185717538"></a><ul id="ul9562185717538"><li>功能:<p id="p744185910594"><a name="p744185910594"></a><a name="p744185910594"></a>触发数据上传接口</p>
174</li><li>输入参数:<p id="p69601111504"><a name="p69601111504"></a><a name="p69601111504"></a>writer:写者指针</p>
175</li><li>返回值:<p id="p970375016"><a name="p970375016"></a><a name="p970375016"></a>true:成功</p>
176<p id="p1314495407"><a name="p1314495407"></a><a name="p1314495407"></a>false:失败</p>
177</li></ul>
178</td>
179</tr>
180</tbody>
181</table>
182
183-   下面是插件模块对外提供的总入口,主要包括表1中的插件模块回调函数以及插件名称、插件模块需要申请的内存大小。
184
185**表 3**  PluginModuleStruct接口列表
186
187<a name="table14418172393018"></a>
188<table><thead align="left"><tr id="row14188236300"><th class="cellrowborder" valign="top" width="30%" id="mcps1.2.4.1.1"><p id="p041820239304"><a name="p041820239304"></a><a name="p041820239304"></a>接口名</p>
189</th>
190<th class="cellrowborder" valign="top" width="30.020000000000003%" id="mcps1.2.4.1.2"><p id="p34181823153010"><a name="p34181823153010"></a><a name="p34181823153010"></a>类型</p>
191</th>
192<th class="cellrowborder" valign="top" width="39.98%" id="mcps1.2.4.1.3"><p id="p10418023123011"><a name="p10418023123011"></a><a name="p10418023123011"></a>描述</p>
193</th>
194</tr>
195</thead>
196<tbody><tr id="row16418623143016"><td class="cellrowborder" valign="top" width="30%" headers="mcps1.2.4.1.1 "><p id="p625018817318"><a name="p625018817318"></a><a name="p625018817318"></a>PluginModuleStruct::callbacks</p>
197</td>
198<td class="cellrowborder" valign="top" width="30.020000000000003%" headers="mcps1.2.4.1.2 "><p id="p162501689312"><a name="p162501689312"></a><a name="p162501689312"></a>PluginModuleCallbacks*</p>
199</td>
200<td class="cellrowborder" valign="top" width="39.98%" headers="mcps1.2.4.1.3 "><p id="p122501085317"><a name="p122501085317"></a><a name="p122501085317"></a>功能:定义插件回调函数列表</p>
201</td>
202</tr>
203<tr id="row241952313015"><td class="cellrowborder" valign="top" width="30%" headers="mcps1.2.4.1.1 "><p id="p325018863113"><a name="p325018863113"></a><a name="p325018863113"></a>PluginModuleStruct::name</p>
204</td>
205<td class="cellrowborder" valign="top" width="30.020000000000003%" headers="mcps1.2.4.1.2 "><p id="p4250138123112"><a name="p4250138123112"></a><a name="p4250138123112"></a>C style string</p>
206</td>
207<td class="cellrowborder" valign="top" width="39.98%" headers="mcps1.2.4.1.3 "><p id="p425019883115"><a name="p425019883115"></a><a name="p425019883115"></a>功能:定义插件名称</p>
208</td>
209</tr>
210<tr id="row49481758173013"><td class="cellrowborder" valign="top" width="30%" headers="mcps1.2.4.1.1 "><p id="p1125010813316"><a name="p1125010813316"></a><a name="p1125010813316"></a>PluginModuleStruct::resultBufferSizeHint</p>
211</td>
212<td class="cellrowborder" valign="top" width="30.020000000000003%" headers="mcps1.2.4.1.2 "><p id="p142509810319"><a name="p142509810319"></a><a name="p142509810319"></a>uint32_t</p>
213</td>
214<td class="cellrowborder" valign="top" width="39.98%" headers="mcps1.2.4.1.3 "><p id="p1525112853115"><a name="p1525112853115"></a><a name="p1525112853115"></a>功能:用于提示插件管理模块调用数据上报接口时使用的内存缓冲区字节数</p>
215</td>
216</tr>
217</tbody>
218</table>
219
220### 使用说明<a name="section681316903611"></a>
221
222下面介绍在设备端基于性能调优框架提供的插件能力,新增一个插件涉及到的关键开发步骤:
223
2241.  编写proto数据定义文件_plugin\_data.proto_,定义数据源格式,数据源格式决定了插件上报哪些数据:
225
226    ```
227    message PluginData {
228        int32 pid = 1;
229        string name = 2;
230        uint64 count1 = 3;
231        uint64 count2 = 4;
232        uint64 count3 = 5;
233        ......
234    }
235    ```
236
2372.  编写数据源配置文件_plugin\_config.proto_,采集的行为可以根据配置进行变化,可以设置数据源上报间隔等信息:
238
239    ```
240    message PluginConfig {
241        int32 pid = 1;
242        bool report_interval = 2;
243        int report_counter_id_1 = 3;
244        int report_counter_id_2 = 4;
245        ......
246    }
247    ```
248
2493.  定义PluginModuleCallbacks实现插件回调接口;定义PluginModuleStruct类型的g\_pluginModule全局变量,注册插件信息。
250
251    ```
252    static PluginModuleCallbacks callbacks = {
253        PluginSessionStart,
254        PluginReportResult,
255        PluginSessionStop,
256    };
257    PluginModuleStruct g_pluginModule = {&callbacks, "test-plugin", MAX_BUFFER_SIZE};
258    ```
259
2604.  通过PluginSessionStart(名字可以自己定义)实现插件回调接口列表的onPluginSessionStart接口,主要处理插件的开始流程。
261
262    ```
263    int PluginSessionStart(const uint8_t* configData, uint32_t configSize)
264    {
265        ......
266        return 0;
267    }
268    ```
269
2705.  通过PluginReportResult(名字可以自己定义)实现插件回调接口列表的onPluginReportResult接口,将插件内部采集的信息通过该接口进行上报:
271
272    ```
273    int PluginReportResult(uint8_t* bufferData, uint32_t bufferSize)
274    {
275        ......
276        return 0;
277    }
278    ```
279
2806.  通过PluginSessionStop(名字可以自己定义)实现插件回调接口列表的onPluginSessionStop接口,主要进行插件停止后的操作流程。
281
282    ```
283    int PluginSessionStop()
284    {
285        ......
286        return 0;
287    }
288    ```
289
2907.  编写proto gn构建脚本, 生成protobuf源文件,protobuf源文件编译生成目标文件:
291
292    ```
293    action("plugin_cpp_gen") {
294      script = "${OHOS_PROFILER_DIR}/build/protoc.sh"  //依赖的编译工具链
295      sources = [   //定义的插件相关的proto文件,比如插件配置文件、插件数据对应的proto文件
296        "plugin_data.proto",
297        "plugin_config.proto",
298      ]
299      outputs = [    //通过protoc编译生成的结果文件
300        "plugin_data.pb.h",
301        "plugin_data.pb.cc",
302        "plugin_config.pb.h",
303        "plugin_config.pb.cc",
304      ]
305      args = [
306        "--cpp_out",
307        "$proto_rel_out_dir",
308        "--proto_path",
309        rebase_path(".", root_build_dir),
310      ]
311      deps = [
312        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc(${host_toolchain})",
313      ]
314    }
315    ohos_source_set("plug_cpp") {   //将定义的proto文件生成cpp文件
316      deps = [
317        ":plugin_cpp_gen",
318      ]
319      public_deps = [
320        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf",
321        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite",
322      ]
323      include_dirs = [ "$proto_out_dir" ]
324      sources = [   //目标plug_cpp中包括的源文件
325        "plugin_data.pb.h",
326        "plugin_data.pb.cc",
327        "plugin_config.pb.h",
328        "plugin_config.pb.cc",
329      ]
330    }
331    ```
332
3338.  编写插件GN构建脚本:
334
335    ```
336    ohos_shared_library("***plugin") {
337      output_name = "***plugin"
338      sources = [
339        "src/***plugin.cpp",  //插件中的源文件
340      ]
341      include_dirs = [
342        "../api/include",
343        "${OHOS_PROFILER_DIR}/device/base/include",
344      ]
345      deps = [
346        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite",
347        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc_lib",
348        "${OHOS_PROFILER_DIR}/protos/types/plugins/**:plug_cpp",  //上面ohos_source_set中生成的plug_cpp
349      ]
350      install_enable = true
351      subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}"
352    }
353    ```
354
355
356### 调测验证:<a name="section35362541215"></a>
357
358插件动态库生成后,可以自己编写测试代码,通过dlopen加载动态库,并调用上面代码中实现的插件模块回调函数进行验证。
359
360```
361int main(int argc, char** argv)
362{
363    void* handle;
364    PluginModuleStruct* memplugin;
365    handle = dlopen("./libplugin.z.so", RTLD_LAZY);   //动态打开上面生成的插件动态库
366    if (handle == nullptr) {
367        HILOGD("dlopen err:%s.", dlerror());
368        return 0;
369    }
370     memplugin = (PluginModuleStruct*)dlsym(handle, "g_pluginModule");  //获取开发步骤3中定义的g_pluginModule全局变量
371     //check memplugin->callbacks   // 通过该指针调用上面开发步骤3中定义的回调函数
372     return 0;
373```
374
375## hiprofiler_cmd 使用说明<a name="section35362541216"></a>
376
377### 参数说明<a name="section35362541290"></a>
378
379 执行hiprofiler_cmd 为调优业务的离线命令行抓取工具,具体使用方法及命令行参数介绍如下。
380
381可以使用`-h`或者`--help`参数查看命令的使用描述信息:
382
383```sh
384hiprofiler_cmd -h
385help :
386  --getport        -q     : get grpc address
387  --time           -t     : trace time
388  --out            -o     : output file name
389  --help           -h     : make some help
390  --list           -l     : plugin list
391  --start          -s     : start dependent process
392  --kill           -k     : kill dependent process
393  --config         -c     : start trace by config file
394```
395
396其余参数使用说明如下:
397
398* `-q`或者`--getport`选项,用于查询服务的端口信息;
399* `-t`或者`--time`选项,用于指定抓取时间,单位是秒;
400* `-o`或者`--out`选项,用于指定输出的离线数据文件名;
401* `-h`或者`--help`选项,用于输出帮助信息;
402* `-l`或者`--list`选项,用于查询插件列表;
403* `-s`或者`--start`选项,用于启动依赖的进程;
404* `-k`或者`--kill`选项,用于关闭依赖的进程;
405* `-c`或者`--config`选项,用于指定配置文件;
406
407### 命令展示<a name="section35362541500"></a>
408
409#### 基础配置参数<a name="section35362541219"></a>
410
411```sh
412hiprofiler_cmd \
413  -c - \
414  -o /data/local/tmp/hiprofiler_data.htrace \
415  -t 50 \
416  -s \
417  -k \
418<<CONFIG
419 request_id: 1
420 session_config {
421  buffers {
422   pages: 16384
423  }
424  result_file: "/data/local/tmp/hiprofiler_data.htrace"
425  sample_duration: 50000
426 }
427CONFIG
428```
429
430命令参数说明:
431
432* request_id:本次请求的id
433* pages:存储trace数据的buffer大小(4 * pages kb)
434* result_file:结果输出的文件路径,与-o参数对应
435* sample_duration:抓取时长(ms),与-t参数对应
436
437#### ftrace抓取场景示例<a name="section35362541220"></a>
438
439```sh
440hiprofiler_cmd \
441  -c - \
442  -o /data/local/tmp/hiprofiler_data.htrace \
443  -t 50 \
444  -s \
445  -k \
446<<CONFIG
447 request_id: 1
448 session_config {
449  buffers {
450   pages: 16384
451  }
452  result_file: "/data/local/tmp/hiprofiler_data.htrace"
453  sample_duration: 50000
454 }
455 plugin_configs {
456  plugin_name: "ftrace-plugin"
457  sample_interval: 1000
458  config_data {
459   ftrace_events: "sched/sched_switch"
460   ftrace_events: "power/suspend_resume"
461   ftrace_events: "sched/sched_wakeup"
462   ftrace_events: "sched/sched_wakeup_new"
463   ftrace_events: "sched/sched_waking"
464   ftrace_events: "sched/sched_process_exit"
465   ftrace_events: "sched/sched_process_free"
466   ftrace_events: "task/task_newtask"
467   ftrace_events: "task/task_rename"
468   buffer_size_kb: 2048
469   flush_interval_ms: 1000
470   flush_threshold_kb: 4096
471   parse_ksyms: true
472   clock: "mono"
473   trace_period_ms: 200
474   debug_on: false
475   hitrace_time: 50
476  }
477 }
478CONFIG
479```
480
481命令参数说明:
482
483* sample_interval:轮循模式下,插件上报数据的间隔时间(ms)
484* trace_period_ms:ftrace插件读取内核缓冲区数据的间隔时间(ms)
485* hitrace_time:hitrace命令行抓取时间,与hiprofiler_cmd下发的-t配置联动
486
487#### 内存信息抓取场景示例<a name="section35362541221"></a>
488
489##### 内核内存信息<a name="section35362541222"></a>
490
491使用如下命令:
492
493```sh
494hiprofiler_cmd \
495  -c - \
496  -o /data/local/tmp/hiprofiler_data.htrace \
497  -t 50 \
498  -s \
499  -k \
500<<CONFIG
501 request_id: 1
502 session_config {
503  buffers {
504   pages: 16384
505  }
506  result_file: "/data/local/tmp/hiprofiler_data.htrace"
507  sample_duration: 50000
508 }
509 plugin_configs {
510  plugin_name: "memory-plugin"
511  sample_interval: 5000
512  config_data {
513   report_process_tree: true
514   report_sysmem_mem_info: true
515   sys_meminfo_counters: PMEM_ACTIVE
516   sys_meminfo_counters: PMEM_ACTIVE_ANON
517   sys_meminfo_counters: PMEM_ACTIVE_FILE
518   sys_meminfo_counters: PMEM_ANON_PAGES
519   sys_meminfo_counters: PMEM_BUFFERS
520   sys_meminfo_counters: PMEM_CACHED
521   sys_meminfo_counters: PMEM_CMA_FREE
522   sys_meminfo_counters: PMEM_CMA_TOTAL
523   sys_meminfo_counters: PMEM_COMMIT_LIMIT
524   sys_meminfo_counters: PMEM_COMMITED_AS
525   sys_meminfo_counters: PMEM_DIRTY
526   sys_meminfo_counters: PMEM_INACTIVE
527   sys_meminfo_counters: PMEM_INACTIVE_ANON
528   sys_meminfo_counters: PMEM_INACTIVE_FILE
529   sys_meminfo_counters: PMEM_KERNEL_STACK
530   sys_meminfo_counters: PMEM_MAPPED
531   sys_meminfo_counters: PMEM_MEM_AVAILABLE
532   sys_meminfo_counters: PMEM_MEM_FREE
533   sys_meminfo_counters: PMEM_MEM_TOTAL
534   sys_meminfo_counters: PMEM_MLOCKED
535   sys_meminfo_counters: PMEM_PAGE_TABLES
536   sys_meminfo_counters: PMEM_SHMEM
537   sys_meminfo_counters: PMEM_SLAB
538   sys_meminfo_counters: PMEM_SLAB_RECLAIMABLE
539   sys_meminfo_counters: PMEM_SLAB_UNRECLAIMABLE
540   sys_meminfo_counters: PMEM_SWAP_CACHED
541   sys_meminfo_counters: PMEM_SWAP_FREE
542   sys_meminfo_counters: PMEM_SWAP_TOTAL
543   sys_meminfo_counters: PMEM_UNEVICTABLE
544   sys_meminfo_counters: PMEM_VMALLOC_CHUNK
545   sys_meminfo_counters: PMEM_VMALLOC_TOTAL
546   sys_meminfo_counters: PMEM_VMALLOC_USED
547   sys_meminfo_counters: PMEM_WRITEBACK
548   sys_meminfo_counters: PMEM_KERNEL_RECLAIMABLE
549   report_sysmem_vmem_info: true
550   report_process_mem_info: true
551   report_app_mem_info: false
552   report_app_mem_by_memory_service: false
553  }
554 }
555CONFIG
556```
557
558##### 虚拟内存统计<a name="section35362541223"></a>
559
560使用如下命令:
561
562```sh
563hiprofiler_cmd \
564  -c - \
565  -o /data/local/tmp/hiprofiler_data.htrace \
566  -t 50 \
567  -s \
568  -k \
569<<CONFIG
570 request_id: 1
571 session_config {
572  buffers {
573   pages: 16384
574  }
575  result_file: "/data/local/tmp/hiprofiler_data.htrace"
576  sample_duration: 50000
577 }
578 plugin_configs {
579  plugin_name: "memory-plugin"
580  sample_interval: 5000
581  config_data {
582   report_process_tree: true
583   report_sysmem_mem_info: true
584   report_sysmem_vmem_info: true
585   sys_vmeminfo_counters: VMEMINFO_UNSPECIFIED
586   sys_vmeminfo_counters: VMEMINFO_NR_FREE_PAGES
587   sys_vmeminfo_counters: VMEMINFO_NR_ALLOC_BATCH
588   sys_vmeminfo_counters: VMEMINFO_NR_INACTIVE_ANON
589   sys_vmeminfo_counters: VMEMINFO_NR_ACTIVE_ANON
590   sys_vmeminfo_counters: VMEMINFO_NR_INACTIVE_FILE
591   sys_vmeminfo_counters: VMEMINFO_NR_ACTIVE_FILE
592   sys_vmeminfo_counters: VMEMINFO_NR_UNEVICTABLE
593   sys_vmeminfo_counters: VMEMINFO_NR_MLOCK
594   sys_vmeminfo_counters: VMEMINFO_NR_ANON_PAGES
595   sys_vmeminfo_counters: VMEMINFO_NR_MAPPED
596   sys_vmeminfo_counters: VMEMINFO_NR_FILE_PAGES
597   sys_vmeminfo_counters: VMEMINFO_NR_DIRTY
598   sys_vmeminfo_counters: VMEMINFO_NR_WRITEBACK
599   sys_vmeminfo_counters: VMEMINFO_NR_SLAB_RECLAIMABLE
600   sys_vmeminfo_counters: VMEMINFO_NR_SLAB_UNRECLAIMABLE
601   sys_vmeminfo_counters: VMEMINFO_NR_PAGE_TABLE_PAGES
602   sys_vmeminfo_counters: VMEMINFO_NR_KERNEL_STACK
603   sys_vmeminfo_counters: VMEMINFO_NR_OVERHEAD
604   sys_vmeminfo_counters: VMEMINFO_NR_UNSTABLE
605   sys_vmeminfo_counters: VMEMINFO_NR_BOUNCE
606   sys_vmeminfo_counters: VMEMINFO_NR_VMSCAN_WRITE
607   sys_vmeminfo_counters: VMEMINFO_NR_VMSCAN_IMMEDIATE_RECLAIM
608   sys_vmeminfo_counters: VMEMINFO_NR_WRITEBACK_TEMP
609   sys_vmeminfo_counters: VMEMINFO_NR_ISOLATED_ANON
610   sys_vmeminfo_counters: VMEMINFO_NR_ISOLATED_FILE
611   sys_vmeminfo_counters: VMEMINFO_NR_SHMEM
612   sys_vmeminfo_counters: VMEMINFO_NR_DIRTIED
613   sys_vmeminfo_counters: VMEMINFO_NR_WRITTEN
614   sys_vmeminfo_counters: VMEMINFO_NR_PAGES_SCANNED
615   sys_vmeminfo_counters: VMEMINFO_WORKINGSET_REFAULT
616   sys_vmeminfo_counters: VMEMINFO_WORKINGSET_ACTIVATE
617   sys_vmeminfo_counters: VMEMINFO_WORKINGSET_NODERECLAIM
618   sys_vmeminfo_counters: VMEMINFO_NR_ANON_TRANSPARENT_HUGEPAGES
619   sys_vmeminfo_counters: VMEMINFO_NR_FREE_CMA
620   sys_vmeminfo_counters: VMEMINFO_NR_SWAPCACHE
621   sys_vmeminfo_counters: VMEMINFO_NR_DIRTY_THRESHOLD
622   sys_vmeminfo_counters: VMEMINFO_NR_DIRTY_BACKGROUND_THRESHOLD
623   sys_vmeminfo_counters: VMEMINFO_PGPGIN
624   sys_vmeminfo_counters: VMEMINFO_PGPGOUT
625   sys_vmeminfo_counters: VMEMINFO_PGPGOUTCLEAN
626   sys_vmeminfo_counters: VMEMINFO_PSWPIN
627   sys_vmeminfo_counters: VMEMINFO_PSWPOUT
628   sys_vmeminfo_counters: VMEMINFO_PGALLOC_DMA
629   sys_vmeminfo_counters: VMEMINFO_PGALLOC_NORMAL
630   sys_vmeminfo_counters: VMEMINFO_PGALLOC_MOVABLE
631   sys_vmeminfo_counters: VMEMINFO_PGFREE
632   sys_vmeminfo_counters: VMEMINFO_PGACTIVATE
633   sys_vmeminfo_counters: VMEMINFO_PGDEACTIVATE
634   sys_vmeminfo_counters: VMEMINFO_PGFAULT
635   sys_vmeminfo_counters: VMEMINFO_PGMAJFAULT
636   sys_vmeminfo_counters: VMEMINFO_PGREFILL_DMA
637   sys_vmeminfo_counters: VMEMINFO_PGREFILL_NORMAL
638   sys_vmeminfo_counters: VMEMINFO_PGREFILL_MOVABLE
639   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD_DMA
640   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD_NORMAL
641   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD_MOVABLE
642   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT_DMA
643   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT_NORMAL
644   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT_MOVABLE
645   sys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD_DMA
646   sys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD_NORMAL
647   sys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD_MOVABLE
648   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_DMA
649   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_NORMAL
650   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_MOVABLE
651   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_THROTTLE
652   sys_vmeminfo_counters: VMEMINFO_PGINODESTEAL
653   sys_vmeminfo_counters: VMEMINFO_SLABS_SCANNED
654   sys_vmeminfo_counters: VMEMINFO_KSWAPD_INODESTEAL
655   sys_vmeminfo_counters: VMEMINFO_KSWAPD_LOW_WMARK_HIT_QUICKLY
656   sys_vmeminfo_counters: VMEMINFO_KSWAPD_HIGH_WMARK_HIT_QUICKLY
657   sys_vmeminfo_counters: VMEMINFO_PAGEOUTRUN
658   sys_vmeminfo_counters: VMEMINFO_ALLOCSTALL
659   sys_vmeminfo_counters: VMEMINFO_PGROTATED
660   sys_vmeminfo_counters: VMEMINFO_DROP_PAGECACHE
661   sys_vmeminfo_counters: VMEMINFO_DROP_SLAB
662   sys_vmeminfo_counters: VMEMINFO_PGMIGRATE_SUCCESS
663   sys_vmeminfo_counters: VMEMINFO_PGMIGRATE_FAIL
664   sys_vmeminfo_counters: VMEMINFO_COMPACT_MIGRATE_SCANNED
665   sys_vmeminfo_counters: VMEMINFO_COMPACT_FREE_SCANNED
666   sys_vmeminfo_counters: VMEMINFO_COMPACT_ISOLATED
667   sys_vmeminfo_counters: VMEMINFO_COMPACT_STALL
668   sys_vmeminfo_counters: VMEMINFO_COMPACT_FAIL
669   sys_vmeminfo_counters: VMEMINFO_COMPACT_SUCCESS
670   sys_vmeminfo_counters: VMEMINFO_COMPACT_DAEMON_WAKE
671   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_CULLED
672   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_SCANNED
673   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_RESCUED
674   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_MLOCKED
675   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_MUNLOCKED
676   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_CLEARED
677   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_STRANDED
678   sys_vmeminfo_counters: VMEMINFO_NR_ZSPAGES
679   sys_vmeminfo_counters: VMEMINFO_NR_ION_HEAP
680   sys_vmeminfo_counters: VMEMINFO_NR_GPU_HEAP
681   sys_vmeminfo_counters: VMEMINFO_ALLOCSTALL_DMA
682   sys_vmeminfo_counters: VMEMINFO_ALLOCSTALL_MOVABLE
683   sys_vmeminfo_counters: VMEMINFO_ALLOCSTALL_NORMAL
684   sys_vmeminfo_counters: VMEMINFO_COMPACT_DAEMON_FREE_SCANNED
685   sys_vmeminfo_counters: VMEMINFO_COMPACT_DAEMON_MIGRATE_SCANNED
686   sys_vmeminfo_counters: VMEMINFO_NR_FASTRPC
687   sys_vmeminfo_counters: VMEMINFO_NR_INDIRECTLY_RECLAIMABLE
688   sys_vmeminfo_counters: VMEMINFO_NR_ION_HEAP_POOL
689   sys_vmeminfo_counters: VMEMINFO_NR_KERNEL_MISC_RECLAIMABLE
690   sys_vmeminfo_counters: VMEMINFO_NR_SHADOW_CALL_STACK_BYTES
691   sys_vmeminfo_counters: VMEMINFO_NR_SHMEM_HUGEPAGES
692   sys_vmeminfo_counters: VMEMINFO_NR_SHMEM_PMDMAPPED
693   sys_vmeminfo_counters: VMEMINFO_NR_UNRECLAIMABLE_PAGES
694   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_ACTIVE_ANON
695   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_ACTIVE_FILE
696   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_INACTIVE_ANON
697   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_INACTIVE_FILE
698   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_UNEVICTABLE
699   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_WRITE_PENDING
700   sys_vmeminfo_counters: VMEMINFO_OOM_KILL
701   sys_vmeminfo_counters: VMEMINFO_PGLAZYFREE
702   sys_vmeminfo_counters: VMEMINFO_PGLAZYFREED
703   sys_vmeminfo_counters: VMEMINFO_PGREFILL
704   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT
705   sys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD
706   sys_vmeminfo_counters: VMEMINFO_PGSKIP_DMA
707   sys_vmeminfo_counters: VMEMINFO_PGSKIP_MOVABLE
708   sys_vmeminfo_counters: VMEMINFO_PGSKIP_NORMAL
709   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT
710   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD
711   sys_vmeminfo_counters: VMEMINFO_SWAP_RA
712   sys_vmeminfo_counters: VMEMINFO_SWAP_RA_HIT
713   sys_vmeminfo_counters: VMEMINFO_WORKINGSET_RESTORE
714   report_process_mem_info: true
715   report_app_mem_info: false
716   report_app_mem_by_memory_service: false
717  }
718 }
719CONFIG
720```
721
722##### 进程内存使用跟踪<a name="section35362541224"></a>
723
724如配置抓取的进程名是com.ohos.mms
725
726``` sh
727hiprofiler_cmd \
728  -c - \
729  -o /data/local/tmp/hiprofiler_data.htrace \
730  -t 50 \
731  -s \
732  -k \
733<<CONFIG
734 request_id: 1
735 session_config {
736  buffers {
737   pages: 16384
738  }
739  result_file: "/data/local/tmp/hiprofiler_data.htrace"
740  sample_duration: 50000
741 }
742 plugin_configs {
743  plugin_name: "nativehook"
744  sample_interval: 5000
745  config_data {
746   save_file: false
747   filter_size: 4096
748   smb_pages: 16384
749   max_stack_depth: 10
750   process_name: "com.ohos.mms"
751   malloc_free_matching_interval: 1000
752   malloc_free_matching_cnt: 1000
753   string_compressed: true
754   fp_unwind: true
755  }
756 }
757CONFIG
758```
759
760配置参数说明:
761
762* pid/process_name:设置抓取的进程ID或者进程名
763* max_stack_depth:抓取的栈的深度
764* smb_pages:native_daemon和native_hook进程之间存储数据的共享内存大小(4KB的倍数)
765* filter_size:只抓取大于该size的malloc数据(free不受影响)
766
767##### 输出进程jemalloc的stats信息<a name="section35362541227"></a>
768
769如配置抓取的进程名是com.ohos.mms
770
771``` sh
772hiprofiler_cmd \
773  -c - \
774  -o /data/local/tmp/hiprofiler_data222.htrace \
775  -t 5 \
776  -s \
777  -k \
778<<CONFIG
779request_id: 1
780plugin_configs {
781plugin_name: "nativehook"
782config_data {
783smb_pages: 16384
784process_name: "com.ohos.mms"
785dump_nmd: true
786}
787}
788CONFIG
789```
790
791使用说明:
792
793* pid/process_name:设置抓取的进程ID或者进程名
794* dump_nmd: 配置该参数为true表示会导出目标进程的stats信息
795* 若只是想导出stats信息,可以把-t参数的时间设置小一点,五秒最优。
796* 导出的stats信息最终保存路径为:/data/local/tmp/nmd_(process_name/pid).txt
797
798#### bytrace/hitrace场景示例<a name="section35362541225"></a>
799
800运行如下命令:
801
802```
803hiprofiler_cmd \
804  -c - \
805  -o /data/local/tmp/hiprofiler_data.htrace \
806  -t 30 \
807  -s \
808<<CONFIG
809 request_id: 1
810 session_config {
811  buffers {
812   pages: 1000
813  }
814  result_file: "/data/local/tmp/hiprofiler_data.htrace"
815  sample_duration: 30000
816 }
817 plugin_configs {
818  plugin_name: "ftrace-plugin"
819  sample_interval: 1000
820  config_data {
821   hitrace_time: 10
822   hitrace_categories: "ability"
823   hitrace_categories: "ace"
824   hitrace_categories: "binder"
825   hitrace_categories: "dsoftbus"
826   hitrace_categories: "freq"
827   hitrace_categories: "graphic"
828   hitrace_categories: "idle"
829   hitrace_categories: "memory"
830   hitrace_categories: "dcamera"
831   hitrace_categories: "ohos"
832   hitrace_categories: "rpc"
833   hitrace_categories: "sched"
834   hitrace_categories: "sync"
835   hitrace_categories: "window"
836   buffer_size_kb: 51200
837   flush_interval_ms: 1000
838   flush_threshold_kb: 4096
839   parse_ksyms: true
840   clock: "mono"
841   trace_period_ms: 200
842   debug_on: false
843  }
844 }
845CONFIG
846```
847
848#### hiperf场景示例<a name="section35362541226"></a>
849
850运行如下命令:
851
852``` sh
853hiprofiler_cmd \
854  -c - \
855  -o /data/local/tmp/hiprofiler_data.htrace \
856  -t 50 \
857  -s \
858  -k \
859<<CONFIG
860 request_id: 1
861 session_config {
862  buffers {
863   pages: 16384
864  }
865  result_file: "/data/local/tmp/hiprofiler_data.htrace"
866  sample_duration: 50000
867 }
868 plugin_configs {
869  plugin_name: "hiperf-plugin"
870  sample_interval: 5000
871  config_data {
872   is_root: false
873   outfile_name: "/data/local/tmp/perf.data"
874   record_args: "-f 1000 -a  --cpu-limit 100 -e hw-cpu-cycles,sched:sched_waking --call-stack dwarf --clockid monotonic --offcpu -m 256"
875  }
876 }
877CONFIG
878```
879
880
881
882## 相关仓<a name="section1293495681320"></a>
883
884[研发工具链子系统]()
885
886**developtools\_profiler**
887
888[developtools\_hdc](https://gitee.com/openharmony/developtools_hdc)
889
890[developtools\_bytrace](https://gitee.com/openharmony/developtools_bytrace)
891