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 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