鸿蒙开发实战:【性能调优组件】

简介

性能调优组件包含系统和应用调优框架,旨在为开发者提供一套性能调优平台,可以用来分析内存、性能等问题。

该组件整体分为PC端和设备端两部分,PC端最终作为deveco studio的插件进行发布,内部主要包括分为UI绘制、设备管理、进程管理、插件管理、数据导入、数据存储、 数据分析、Session管理、配置管理等模块;设备端主要包括命令行工具、服务进程、插件集合、应用程序组件等模块。设备端提供了插件扩展能力,对外提供了插件接口,基于该扩展能力可以按需定义自己的能力,并集成到框架中来,目前基于插件能力已经完成了实时内存插件,trace插件。下文会重点对设备端提供的插件能力进行介绍。

架构图

说明

下面针对设备端对外提供的插件扩展能力进行接口和使用说明。

接口说明

下面是设备端插件模块对外提供的接口:

  • PluginModuleCallbacks为插件模块对外提供的回调接口,插件管理模块通过该回调接口列表与每一个插件模块进行交互,每一个新增插件都需要实现该接口列表中的函数。

表 1 PluginModuleCallbacks接口列表

接口名类型描述
PluginModuleCallbacks::onPluginSessionStartint (PluginSessionStartCallback)(const uint8_t configData, uint32_t configSize);- 功能:
[]()[]()插件会话开始接口,开始插件会话时会被调用,用来下发插件配置

表 2 WriterStruct接口列表

接口名类型描述
WriterStruct::writelong (WriteFuncPtr)(WriterStruct writer, const void* data, size_t size);- 功能:
[]()[]()写接口,将插件中采集的数据通过writer进行写入

表 3 PluginModuleStruct接口列表

接口名类型描述
PluginModuleStruct::callbacksPluginModuleCallbacks*功能:定义插件回调函数列表
PluginModuleStruct::nameC style string功能:定义插件名称
PluginModuleStruct::resultBufferSizeHintuint32_t功能:用于提示插件管理模块调用数据上报接口时使用的内存缓冲区字节数

使用说明

下面介绍在设备端基于性能调优框架提供的插件能力,新增一个插件涉及到的关键开发步骤:

  1. 编写proto数据定义文件_plugin_data.proto_,定义数据源格式,数据源格式决定了插件上报哪些数据:

    message PluginData {int32 pid = 1;string name = 2;uint64 count1 = 3;uint64 count2 = 4;uint64 count3 = 5;......
    }
    
  2. 编写数据源配置文件_plugin_config.proto_,采集的行为可以根据配置进行变化,可以设置数据源上报间隔等信息:

    message PluginConfig {int32 pid = 1;bool report_interval = 2;int report_counter_id_1 = 3;int report_counter_id_2 = 4;......
    }
    
  3. 定义PluginModuleCallbacks实现插件回调接口;定义PluginModuleStruct类型的g_pluginModule全局变量,注册插件信息。

    static PluginModuleCallbacks callbacks = {PluginSessionStart,PluginReportResult,PluginSessionStop,
    };
    PluginModuleStruct g_pluginModule = {&callbacks, "test-plugin", MAX_BUFFER_SIZE};
    
  4. 通过PluginSessionStart(名字可以自己定义)实现插件回调接口列表的onPluginSessionStart接口,主要处理插件的开始流程。

    int PluginSessionStart(const uint8_t* configData, uint32_t configSize)
    {......return 0;
    } 
    
  5. 通过PluginReportResult(名字可以自己定义)实现插件回调接口列表的onPluginReportResult接口,将插件内部采集的信息通过该接口进行上报:

    int PluginReportResult(uint8_t* bufferData, uint32_t bufferSize)
    {......return 0;
    } 
    
  6. 通过PluginSessionStop(名字可以自己定义)实现插件回调接口列表的onPluginSessionStop接口,主要进行插件停止后的操作流程。

    int PluginSessionStop()
    {......return 0;
    }
    
  7. 编写proto gn构建脚本, 生成protobuf源文件,protobuf源文件编译生成目标文件:

    action("plugin_cpp_gen") {script = "${OHOS_PROFILER_DIR}/build/protoc.sh"  //依赖的编译工具链sources = [   //定义的插件相关的proto文件,比如插件配置文件、插件数据对应的proto文件"plugin_data.proto","plugin_config.proto",]outputs = [    //通过protoc编译生成的结果文件"plugin_data.pb.h","plugin_data.pb.cc","plugin_config.pb.h","plugin_config.pb.cc",]args = ["--cpp_out","$proto_rel_out_dir","--proto_path",rebase_path(".", root_build_dir),]deps = ["${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc(${host_toolchain})",]
    }
    ohos_source_set("plug_cpp") {   //将定义的proto文件生成cpp文件deps = [":plugin_cpp_gen",]public_deps = ["${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf","${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite",]include_dirs = [ "$proto_out_dir" ]sources = [   //目标plug_cpp中包括的源文件"plugin_data.pb.h","plugin_data.pb.cc","plugin_config.pb.h","plugin_config.pb.cc",]
    }
    
  8. 编写插件GN构建脚本:

    ohos_shared_library("***plugin") {output_name = "***plugin"sources = ["src/***plugin.cpp",  //插件中的源文件]include_dirs = ["../api/include","${OHOS_PROFILER_DIR}/device/base/include",]deps = ["${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite","${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc_lib","${OHOS_PROFILER_DIR}/protos/types/plugins/**:plug_cpp",  //上面ohos_source_set中生成的plug_cpp]install_enable = truesubsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}"
    }
    

调测验证:

插件动态库生成后,可以自己编写测试代码,通过dlopen加载动态库,并调用上面代码中实现的插件模块回调函数进行验证。

int main(int argc, char** argv)
{void* handle;PluginModuleStruct* memplugin;handle = dlopen("./libplugin.z.so", RTLD_LAZY);   //动态打开上面生成的插件动态库if (handle == nullptr) {HILOGD("dlopen err:%s.", dlerror());return 0;}memplugin = (PluginModuleStruct*)dlsym(handle, "g_pluginModule");  //获取开发步骤3中定义的g_pluginModule全局变量//check memplugin->callbacks   // 通过该指针调用上面开发步骤3中定义的回调函数return 0;

hiprofiler_cmd 使用说明

参数说明

执行hiprofiler_cmd 为调优业务的离线命令行抓取工具,具体使用方法及命令行参数介绍如下。

可以使用-h或者--help参数查看命令的使用描述信息:

hiprofiler_cmd -h
help :--getport        -q     : get grpc address--time           -t     : trace time--out            -o     : output file name--help           -h     : make some help--list           -l     : plugin list--start          -s     : start dependent process--kill           -k     : kill dependent process--config         -c     : start trace by config file

其余参数使用说明如下:

  • -q或者--getport选项,用于查询服务的端口信息;
  • -t或者--time选项,用于指定抓取时间,单位是秒;
  • -o或者--out选项,用于指定输出的离线数据文件名;
  • -h或者--help选项,用于输出帮助信息;
  • -l或者--list选项,用于查询插件列表;
  • -s或者--start选项,用于启动依赖的进程;
  • -k或者--kill选项,用于关闭依赖的进程;
  • -c或者--config选项,用于指定配置文件;

命令展示

基础配置参数
hiprofiler_cmd \-c - \-o /data/local/tmp/hiprofiler_data.htrace \-t 50 \-s \-k \
<<CONFIGrequest_id: 1session_config {buffers {pages: 16384}result_file: "/data/local/tmp/hiprofiler_data.htrace"sample_duration: 50000}
CONFIG

命令参数说明:

  • request_id:本次请求的id
  • pages:存储trace数据的buffer大小(4 * pages kb)
  • result_file:结果输出的文件路径,与-o参数对应
  • sample_duration:抓取时长(ms),与-t参数对应
ftrace抓取场景示例
hiprofiler_cmd \-c - \-o /data/local/tmp/hiprofiler_data.htrace \-t 50 \-s \-k \
<<CONFIGrequest_id: 1session_config {buffers {pages: 16384}result_file: "/data/local/tmp/hiprofiler_data.htrace"sample_duration: 50000}plugin_configs {plugin_name: "ftrace-plugin"sample_interval: 1000config_data {ftrace_events: "sched/sched_switch"ftrace_events: "power/suspend_resume"ftrace_events: "sched/sched_wakeup"ftrace_events: "sched/sched_wakeup_new"ftrace_events: "sched/sched_waking"ftrace_events: "sched/sched_process_exit"ftrace_events: "sched/sched_process_free"ftrace_events: "task/task_newtask"ftrace_events: "task/task_rename"buffer_size_kb: 2048flush_interval_ms: 1000flush_threshold_kb: 4096parse_ksyms: trueclock: "mono"trace_period_ms: 200debug_on: falsehitrace_time: 50}}
CONFIG

命令参数说明:

  • sample_interval:轮循模式下,插件上报数据的间隔时间(ms)
  • trace_period_ms:ftrace插件读取内核缓冲区数据的间隔时间(ms)
  • hitrace_time:hitrace命令行抓取时间,与hiprofiler_cmd下发的-t配置联动
内存信息抓取场景示例
内核内存信息

使用如下命令:

hiprofiler_cmd \-c - \-o /data/local/tmp/hiprofiler_data.htrace \-t 50 \-s \-k \
<<CONFIGrequest_id: 1session_config {buffers {pages: 16384}result_file: "/data/local/tmp/hiprofiler_data.htrace"sample_duration: 50000}plugin_configs {plugin_name: "memory-plugin"sample_interval: 5000config_data {report_process_tree: truereport_sysmem_mem_info: truesys_meminfo_counters: PMEM_ACTIVEsys_meminfo_counters: PMEM_ACTIVE_ANONsys_meminfo_counters: PMEM_ACTIVE_FILEsys_meminfo_counters: PMEM_ANON_PAGESsys_meminfo_counters: PMEM_BUFFERSsys_meminfo_counters: PMEM_CACHEDsys_meminfo_counters: PMEM_CMA_FREEsys_meminfo_counters: PMEM_CMA_TOTALsys_meminfo_counters: PMEM_COMMIT_LIMITsys_meminfo_counters: PMEM_COMMITED_ASsys_meminfo_counters: PMEM_DIRTYsys_meminfo_counters: PMEM_INACTIVEsys_meminfo_counters: PMEM_INACTIVE_ANONsys_meminfo_counters: PMEM_INACTIVE_FILEsys_meminfo_counters: PMEM_KERNEL_STACKsys_meminfo_counters: PMEM_MAPPEDsys_meminfo_counters: PMEM_MEM_AVAILABLEsys_meminfo_counters: PMEM_MEM_FREEsys_meminfo_counters: PMEM_MEM_TOTALsys_meminfo_counters: PMEM_MLOCKEDsys_meminfo_counters: PMEM_PAGE_TABLESsys_meminfo_counters: PMEM_SHMEMsys_meminfo_counters: PMEM_SLABsys_meminfo_counters: PMEM_SLAB_RECLAIMABLEsys_meminfo_counters: PMEM_SLAB_UNRECLAIMABLEsys_meminfo_counters: PMEM_SWAP_CACHEDsys_meminfo_counters: PMEM_SWAP_FREEsys_meminfo_counters: PMEM_SWAP_TOTALsys_meminfo_counters: PMEM_UNEVICTABLEsys_meminfo_counters: PMEM_VMALLOC_CHUNKsys_meminfo_counters: PMEM_VMALLOC_TOTALsys_meminfo_counters: PMEM_VMALLOC_USEDsys_meminfo_counters: PMEM_WRITEBACKsys_meminfo_counters: PMEM_KERNEL_RECLAIMABLEreport_sysmem_vmem_info: truereport_process_mem_info: truereport_app_mem_info: falsereport_app_mem_by_memory_service: false}}
CONFIG
虚拟内存统计

使用如下命令:

hiprofiler_cmd \-c - \-o /data/local/tmp/hiprofiler_data.htrace \-t 50 \-s \-k \
<<CONFIGrequest_id: 1session_config {buffers {pages: 16384}result_file: "/data/local/tmp/hiprofiler_data.htrace"sample_duration: 50000}plugin_configs {plugin_name: "memory-plugin"sample_interval: 5000config_data {report_process_tree: truereport_sysmem_mem_info: truereport_sysmem_vmem_info: truesys_vmeminfo_counters: VMEMINFO_UNSPECIFIEDsys_vmeminfo_counters: VMEMINFO_NR_FREE_PAGESsys_vmeminfo_counters: VMEMINFO_NR_ALLOC_BATCHsys_vmeminfo_counters: VMEMINFO_NR_INACTIVE_ANONsys_vmeminfo_counters: VMEMINFO_NR_ACTIVE_ANONsys_vmeminfo_counters: VMEMINFO_NR_INACTIVE_FILEsys_vmeminfo_counters: VMEMINFO_NR_ACTIVE_FILEsys_vmeminfo_counters: VMEMINFO_NR_UNEVICTABLEsys_vmeminfo_counters: VMEMINFO_NR_MLOCKsys_vmeminfo_counters: VMEMINFO_NR_ANON_PAGESsys_vmeminfo_counters: VMEMINFO_NR_MAPPEDsys_vmeminfo_counters: VMEMINFO_NR_FILE_PAGESsys_vmeminfo_counters: VMEMINFO_NR_DIRTYsys_vmeminfo_counters: VMEMINFO_NR_WRITEBACKsys_vmeminfo_counters: VMEMINFO_NR_SLAB_RECLAIMABLEsys_vmeminfo_counters: VMEMINFO_NR_SLAB_UNRECLAIMABLEsys_vmeminfo_counters: VMEMINFO_NR_PAGE_TABLE_PAGESsys_vmeminfo_counters: VMEMINFO_NR_KERNEL_STACKsys_vmeminfo_counters: VMEMINFO_NR_OVERHEADsys_vmeminfo_counters: VMEMINFO_NR_UNSTABLEsys_vmeminfo_counters: VMEMINFO_NR_BOUNCEsys_vmeminfo_counters: VMEMINFO_NR_VMSCAN_WRITEsys_vmeminfo_counters: VMEMINFO_NR_VMSCAN_IMMEDIATE_RECLAIMsys_vmeminfo_counters: VMEMINFO_NR_WRITEBACK_TEMPsys_vmeminfo_counters: VMEMINFO_NR_ISOLATED_ANONsys_vmeminfo_counters: VMEMINFO_NR_ISOLATED_FILEsys_vmeminfo_counters: VMEMINFO_NR_SHMEMsys_vmeminfo_counters: VMEMINFO_NR_DIRTIEDsys_vmeminfo_counters: VMEMINFO_NR_WRITTENsys_vmeminfo_counters: VMEMINFO_NR_PAGES_SCANNEDsys_vmeminfo_counters: VMEMINFO_WORKINGSET_REFAULTsys_vmeminfo_counters: VMEMINFO_WORKINGSET_ACTIVATEsys_vmeminfo_counters: VMEMINFO_WORKINGSET_NODERECLAIMsys_vmeminfo_counters: VMEMINFO_NR_ANON_TRANSPARENT_HUGEPAGESsys_vmeminfo_counters: VMEMINFO_NR_FREE_CMAsys_vmeminfo_counters: VMEMINFO_NR_SWAPCACHEsys_vmeminfo_counters: VMEMINFO_NR_DIRTY_THRESHOLDsys_vmeminfo_counters: VMEMINFO_NR_DIRTY_BACKGROUND_THRESHOLDsys_vmeminfo_counters: VMEMINFO_PGPGINsys_vmeminfo_counters: VMEMINFO_PGPGOUTsys_vmeminfo_counters: VMEMINFO_PGPGOUTCLEANsys_vmeminfo_counters: VMEMINFO_PSWPINsys_vmeminfo_counters: VMEMINFO_PSWPOUTsys_vmeminfo_counters: VMEMINFO_PGALLOC_DMAsys_vmeminfo_counters: VMEMINFO_PGALLOC_NORMALsys_vmeminfo_counters: VMEMINFO_PGALLOC_MOVABLEsys_vmeminfo_counters: VMEMINFO_PGFREEsys_vmeminfo_counters: VMEMINFO_PGACTIVATEsys_vmeminfo_counters: VMEMINFO_PGDEACTIVATEsys_vmeminfo_counters: VMEMINFO_PGFAULTsys_vmeminfo_counters: VMEMINFO_PGMAJFAULTsys_vmeminfo_counters: VMEMINFO_PGREFILL_DMAsys_vmeminfo_counters: VMEMINFO_PGREFILL_NORMALsys_vmeminfo_counters: VMEMINFO_PGREFILL_MOVABLEsys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD_DMAsys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD_NORMALsys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD_MOVABLEsys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT_DMAsys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT_NORMALsys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT_MOVABLEsys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD_DMAsys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD_NORMALsys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD_MOVABLEsys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_DMAsys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_NORMALsys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_MOVABLEsys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_THROTTLEsys_vmeminfo_counters: VMEMINFO_PGINODESTEALsys_vmeminfo_counters: VMEMINFO_SLABS_SCANNEDsys_vmeminfo_counters: VMEMINFO_KSWAPD_INODESTEALsys_vmeminfo_counters: VMEMINFO_KSWAPD_LOW_WMARK_HIT_QUICKLYsys_vmeminfo_counters: VMEMINFO_KSWAPD_HIGH_WMARK_HIT_QUICKLYsys_vmeminfo_counters: VMEMINFO_PAGEOUTRUNsys_vmeminfo_counters: VMEMINFO_ALLOCSTALLsys_vmeminfo_counters: VMEMINFO_PGROTATEDsys_vmeminfo_counters: VMEMINFO_DROP_PAGECACHEsys_vmeminfo_counters: VMEMINFO_DROP_SLABsys_vmeminfo_counters: VMEMINFO_PGMIGRATE_SUCCESSsys_vmeminfo_counters: VMEMINFO_PGMIGRATE_FAILsys_vmeminfo_counters: VMEMINFO_COMPACT_MIGRATE_SCANNEDsys_vmeminfo_counters: VMEMINFO_COMPACT_FREE_SCANNEDsys_vmeminfo_counters: VMEMINFO_COMPACT_ISOLATEDsys_vmeminfo_counters: VMEMINFO_COMPACT_STALLsys_vmeminfo_counters: VMEMINFO_COMPACT_FAILsys_vmeminfo_counters: VMEMINFO_COMPACT_SUCCESSsys_vmeminfo_counters: VMEMINFO_COMPACT_DAEMON_WAKEsys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_CULLEDsys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_SCANNED sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_RESCUEDsys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_MLOCKEDsys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_MUNLOCKEDsys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_CLEAREDsys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_STRANDEDsys_vmeminfo_counters: VMEMINFO_NR_ZSPAGESsys_vmeminfo_counters: VMEMINFO_NR_ION_HEAPsys_vmeminfo_counters: VMEMINFO_NR_GPU_HEAPsys_vmeminfo_counters: VMEMINFO_ALLOCSTALL_DMAsys_vmeminfo_counters: VMEMINFO_ALLOCSTALL_MOVABLEsys_vmeminfo_counters: VMEMINFO_ALLOCSTALL_NORMALsys_vmeminfo_counters: VMEMINFO_COMPACT_DAEMON_FREE_SCANNEDsys_vmeminfo_counters: VMEMINFO_COMPACT_DAEMON_MIGRATE_SCANNEDsys_vmeminfo_counters: VMEMINFO_NR_FASTRPCsys_vmeminfo_counters: VMEMINFO_NR_INDIRECTLY_RECLAIMABLEsys_vmeminfo_counters: VMEMINFO_NR_ION_HEAP_POOLsys_vmeminfo_counters: VMEMINFO_NR_KERNEL_MISC_RECLAIMABLEsys_vmeminfo_counters: VMEMINFO_NR_SHADOW_CALL_STACK_BYTESsys_vmeminfo_counters: VMEMINFO_NR_SHMEM_HUGEPAGESsys_vmeminfo_counters: VMEMINFO_NR_SHMEM_PMDMAPPEDsys_vmeminfo_counters: VMEMINFO_NR_UNRECLAIMABLE_PAGESsys_vmeminfo_counters: VMEMINFO_NR_ZONE_ACTIVE_ANONsys_vmeminfo_counters: VMEMINFO_NR_ZONE_ACTIVE_FILEsys_vmeminfo_counters: VMEMINFO_NR_ZONE_INACTIVE_ANONsys_vmeminfo_counters: VMEMINFO_NR_ZONE_INACTIVE_FILEsys_vmeminfo_counters: VMEMINFO_NR_ZONE_UNEVICTABLEsys_vmeminfo_counters: VMEMINFO_NR_ZONE_WRITE_PENDINGsys_vmeminfo_counters: VMEMINFO_OOM_KILL sys_vmeminfo_counters: VMEMINFO_PGLAZYFREEsys_vmeminfo_counters: VMEMINFO_PGLAZYFREEDsys_vmeminfo_counters: VMEMINFO_PGREFILLsys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECTsys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPDsys_vmeminfo_counters: VMEMINFO_PGSKIP_DMAsys_vmeminfo_counters: VMEMINFO_PGSKIP_MOVABLEsys_vmeminfo_counters: VMEMINFO_PGSKIP_NORMALsys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECTsys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPDsys_vmeminfo_counters: VMEMINFO_SWAP_RAsys_vmeminfo_counters: VMEMINFO_SWAP_RA_HITsys_vmeminfo_counters: VMEMINFO_WORKINGSET_RESTOREreport_process_mem_info: truereport_app_mem_info: falsereport_app_mem_by_memory_service: false}}
CONFIG
进程内存使用跟踪

如配置抓取的进程名是com.ohos.mms

hiprofiler_cmd \-c - \-o /data/local/tmp/hiprofiler_data.htrace \-t 50 \-s \-k \
<<CONFIGrequest_id: 1session_config {buffers {pages: 16384}result_file: "/data/local/tmp/hiprofiler_data.htrace"sample_duration: 50000}plugin_configs {plugin_name: "nativehook"sample_interval: 5000config_data {save_file: falsefilter_size: 4096smb_pages: 16384max_stack_depth: 10process_name: "com.ohos.mms"malloc_free_matching_interval: 1000malloc_free_matching_cnt: 1000string_compressed: truefp_unwind: true}}
CONFIG

配置参数说明:

  • pid/process_name:设置抓取的进程ID或者进程名
  • max_stack_depth:抓取的栈的深度
  • smb_pages:native_daemon和native_hook进程之间存储数据的共享内存大小(4KB的倍数)
  • filter_size:只抓取大于该size的malloc数据(free不受影响)
bytrace/hitrace场景示例

运行如下命令:

hiprofiler_cmd \-c - \-o /data/local/tmp/hiprofiler_data.htrace \-t 30 \-s \
<<CONFIGrequest_id: 1session_config {buffers {pages: 1000}result_file: "/data/local/tmp/hiprofiler_data.htrace"sample_duration: 30000}plugin_configs {plugin_name: "ftrace-plugin"sample_interval: 1000config_data {hitrace_time: 10hitrace_categories: "ability"hitrace_categories: "ace"hitrace_categories: "binder"hitrace_categories: "dsoftbus"hitrace_categories: "freq"hitrace_categories: "graphic"hitrace_categories: "idle"hitrace_categories: "memory"hitrace_categories: "dcamera"hitrace_categories: "ohos"hitrace_categories: "rpc"hitrace_categories: "sched"hitrace_categories: "sync"hitrace_categories: "window"buffer_size_kb: 51200flush_interval_ms: 1000flush_threshold_kb: 4096parse_ksyms: trueclock: "mono"trace_period_ms: 200debug_on: false}}
CONFIG
hiperf场景示例

运行如下命令:

hiprofiler_cmd \-c - \-o /data/local/tmp/hiprofiler_data.htrace \-t 50 \-s \-k \
<<CONFIGrequest_id: 1session_config {buffers {pages: 16384}result_file: "/data/local/tmp/hiprofiler_data.htrace"sample_duration: 50000}plugin_configs {plugin_name: "hiperf-plugin"sample_interval: 5000config_data {is_root: falseoutfile_name: "/data/local/tmp/perf.data"record_args: "-f 1000 -a  --cpu-limit 100 -e hw-cpu-cycles,sched:sched_waking --call-stack dwarf --clockid monotonic --offcpu -m 256"}}
CONFIG

鸿蒙OpenHarmony知识已更新←前往

483f4fa2a8fbe735e53c7584624b50e9.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/535224.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自学7

第二章第一节面向对象 程序的格式都不一样&#xff0c;每个人填写的方式也有自己的习惯&#xff0c;比如收集个人信息&#xff0c;可能有人用字典字符串或者列表&#xff0c; 类的成员方法 类和对象 构造方法 挨个传输值太麻烦了&#xff0c;也没有方便点的&#xff0c;有&…

活动预告:如何培养高质量应用型医学人才?

在大数据时代与“新医科”建设的背景下&#xff0c;掌握先进的医学数据处理技术成为了医学研究与应用的重要技能。 为了更好地培养社会所需要的高质量应用型医学人才&#xff0c;许多高校已经在广泛地开展面向医学生的医学数据分析教学工作。 在“课-训-赛”育人才系列活动的…

vue3 + antd二次封装a-table组件

前置条件 vue版本 v3.3.11 ant-design-vue版本 v4.1.1 内容梗概 二次封装a-table组件&#xff0c;大大提高工作效率和降低项目维护成本&#xff1b; 先看效果图 代码区域 utils.js文件 // 用于模拟接口请求 export const getRemoteTableData (data [], time 1000) >…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的输电线路设备检测系统(深度学习+UI界面+Python代码+训练数据集)

摘要&#xff1a;本篇博客详细介绍了如何运用深度学习构建一个先进的输电线路设备检测系统&#xff0c;并附上了完整的实现代码。该系统利用了最新的YOLOv8算法作为其核心&#xff0c;同时也对之前版本的YOLOv7、YOLOv6、YOLOv5进行了性能比较&#xff0c;包括但不限于mAP&…

代码随想录算法训练营第六天| 242.有效字母的异位词、349.两个数组的交集、202快乐数、1.两数之和

系列文章目录 目录 系列文章目录242.有效的字母异位词349. 两个数组的交集①使用HashSet②使用Hash数组 202. 快乐数1. 两数之和①暴力解法&#xff08;时间复杂度不符合要求&#xff09;②使用HashMap法 242.有效的字母异位词 这道题是数组在哈希表中的典型应用。 因为只有2…

Frostmourne - Elasticsearch源日志告警配置

简介 配置Frostmourne 接入Elasticsearch源进行日志匹配告警&#xff0c;并静默规则&#xff0c;告警消息发送到企业微信&#xff0c;告警信息使用Markdown。 部署安装教程查看&#xff1a; https://songxwn.com/frostmourne_install ELK 安装教程&#xff1a;https://songx…

【Python】新手入门学习:详细介绍开放封闭原则(OCP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍开放封闭原则&#xff08;OCP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyT…

【Linux】进程控制与进程调度

Linux进程介绍 进程的基本概念 Linux是多用户、多任务的操作系统。在这样的环境中&#xff0c;各种计算机资源的分配和管理都是以进程为单位进行的。 Linux操作系统包括三种不同类型的进程&#xff1a; 1&#xff09;交互进程&#xff1a;一种由Shell启动的进程。交互进程既可…

车辆监控系统:AI赋能黑科技,砼车监管有哨兵!

或许您也有兴趣看看这些&#xff1a; 超级调度 | 砼行ERP 搅拌站运转效率提高30% 生产控制 | 一机双控 省钱 省事 增收 智能地磅 | 自助过磅 料仓联动 自助卸料 管理系统 | 混凝土 用砼行 协同管理 | 智能制造 生产协同 ↓添加下方好友&#xff0c;获取更详细的资料

Windows从0到1部署项目

文章目录 1.创建虚拟机2.文件的传输--共享文件夹共享文件夹的访问 3.安装jdk&#xff0c;Tomcat3.1jdk的安装与配置配置环境变量 3.2Tomcat的安装与配置 4.安装mysql数据库5.下载nginx6.虚拟域名 因为Windows项目部署有很多操作都是博主之前做过的了&#xff0c;所及就只放了博…

Failed to open file:login.html段错误,核心已转储

目录 关于段错误 1.错误想象如下所示 2.相应代码 3.原因分析 4.段错误处理原则 关于段错误 "段错误"是一种常见的运行时错误&#xff0c;通常表示程序访问了无效的内存地址&#xff0c;导致操作系统终止了程序的执行并生成了核心转储文件。出现段错误的原因可能…

【漏洞复现】宏景HCM downlawbase SQL注入漏洞

0x01 产品简介 宏景人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景HCM downlawbase 接口处存在SQL注入漏洞&#xff0c;未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令&…