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

简介

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

该组件整体分为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 = true
      subsystem_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 \
<<CONFIG
 request_id: 1
 session_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 \
<<CONFIG
 request_id: 1
 session_config {
  buffers {
   pages: 16384
  }
  result_file: "/data/local/tmp/hiprofiler_data.htrace"
  sample_duration: 50000
 }
 plugin_configs {
  plugin_name: "ftrace-plugin"
  sample_interval: 1000
  config_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: 2048
   flush_interval_ms: 1000
   flush_threshold_kb: 4096
   parse_ksyms: true
   clock: "mono"
   trace_period_ms: 200
   debug_on: false
   hitrace_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 \
<<CONFIG
 request_id: 1
 session_config {
  buffers {
   pages: 16384
  }
  result_file: "/data/local/tmp/hiprofiler_data.htrace"
  sample_duration: 50000
 }
 plugin_configs {
  plugin_name: "memory-plugin"
  sample_interval: 5000
  config_data {
   report_process_tree: true
   report_sysmem_mem_info: true
   sys_meminfo_counters: PMEM_ACTIVE
   sys_meminfo_counters: PMEM_ACTIVE_ANON
   sys_meminfo_counters: PMEM_ACTIVE_FILE
   sys_meminfo_counters: PMEM_ANON_PAGES
   sys_meminfo_counters: PMEM_BUFFERS
   sys_meminfo_counters: PMEM_CACHED
   sys_meminfo_counters: PMEM_CMA_FREE
   sys_meminfo_counters: PMEM_CMA_TOTAL
   sys_meminfo_counters: PMEM_COMMIT_LIMIT
   sys_meminfo_counters: PMEM_COMMITED_AS
   sys_meminfo_counters: PMEM_DIRTY
   sys_meminfo_counters: PMEM_INACTIVE
   sys_meminfo_counters: PMEM_INACTIVE_ANON
   sys_meminfo_counters: PMEM_INACTIVE_FILE
   sys_meminfo_counters: PMEM_KERNEL_STACK
   sys_meminfo_counters: PMEM_MAPPED
   sys_meminfo_counters: PMEM_MEM_AVAILABLE
   sys_meminfo_counters: PMEM_MEM_FREE
   sys_meminfo_counters: PMEM_MEM_TOTAL
   sys_meminfo_counters: PMEM_MLOCKED
   sys_meminfo_counters: PMEM_PAGE_TABLES
   sys_meminfo_counters: PMEM_SHMEM
   sys_meminfo_counters: PMEM_SLAB
   sys_meminfo_counters: PMEM_SLAB_RECLAIMABLE
   sys_meminfo_counters: PMEM_SLAB_UNRECLAIMABLE
   sys_meminfo_counters: PMEM_SWAP_CACHED
   sys_meminfo_counters: PMEM_SWAP_FREE
   sys_meminfo_counters: PMEM_SWAP_TOTAL
   sys_meminfo_counters: PMEM_UNEVICTABLE
   sys_meminfo_counters: PMEM_VMALLOC_CHUNK
   sys_meminfo_counters: PMEM_VMALLOC_TOTAL
   sys_meminfo_counters: PMEM_VMALLOC_USED
   sys_meminfo_counters: PMEM_WRITEBACK
   sys_meminfo_counters: PMEM_KERNEL_RECLAIMABLE
   report_sysmem_vmem_info: true
   report_process_mem_info: true
   report_app_mem_info: false
   report_app_mem_by_memory_service: false
  }
 }
CONFIG
虚拟内存统计

使用如下命令:

hiprofiler_cmd \
  -c - \
  -o /data/local/tmp/hiprofiler_data.htrace \
  -t 50 \
  -s \
  -k \
<<CONFIG
 request_id: 1
 session_config {
  buffers {
   pages: 16384
  }
  result_file: "/data/local/tmp/hiprofiler_data.htrace"
  sample_duration: 50000
 }
 plugin_configs {
  plugin_name: "memory-plugin"
  sample_interval: 5000
  config_data {
   report_process_tree: true
   report_sysmem_mem_info: true
   report_sysmem_vmem_info: true
   sys_vmeminfo_counters: VMEMINFO_UNSPECIFIED
   sys_vmeminfo_counters: VMEMINFO_NR_FREE_PAGES
   sys_vmeminfo_counters: VMEMINFO_NR_ALLOC_BATCH
   sys_vmeminfo_counters: VMEMINFO_NR_INACTIVE_ANON
   sys_vmeminfo_counters: VMEMINFO_NR_ACTIVE_ANON
   sys_vmeminfo_counters: VMEMINFO_NR_INACTIVE_FILE
   sys_vmeminfo_counters: VMEMINFO_NR_ACTIVE_FILE
   sys_vmeminfo_counters: VMEMINFO_NR_UNEVICTABLE
   sys_vmeminfo_counters: VMEMINFO_NR_MLOCK
   sys_vmeminfo_counters: VMEMINFO_NR_ANON_PAGES
   sys_vmeminfo_counters: VMEMINFO_NR_MAPPED
   sys_vmeminfo_counters: VMEMINFO_NR_FILE_PAGES
   sys_vmeminfo_counters: VMEMINFO_NR_DIRTY
   sys_vmeminfo_counters: VMEMINFO_NR_WRITEBACK
   sys_vmeminfo_counters: VMEMINFO_NR_SLAB_RECLAIMABLE
   sys_vmeminfo_counters: VMEMINFO_NR_SLAB_UNRECLAIMABLE
   sys_vmeminfo_counters: VMEMINFO_NR_PAGE_TABLE_PAGES
   sys_vmeminfo_counters: VMEMINFO_NR_KERNEL_STACK
   sys_vmeminfo_counters: VMEMINFO_NR_OVERHEAD
   sys_vmeminfo_counters: VMEMINFO_NR_UNSTABLE
   sys_vmeminfo_counters: VMEMINFO_NR_BOUNCE
   sys_vmeminfo_counters: VMEMINFO_NR_VMSCAN_WRITE
   sys_vmeminfo_counters: VMEMINFO_NR_VMSCAN_IMMEDIATE_RECLAIM
   sys_vmeminfo_counters: VMEMINFO_NR_WRITEBACK_TEMP
   sys_vmeminfo_counters: VMEMINFO_NR_ISOLATED_ANON
   sys_vmeminfo_counters: VMEMINFO_NR_ISOLATED_FILE
   sys_vmeminfo_counters: VMEMINFO_NR_SHMEM
   sys_vmeminfo_counters: VMEMINFO_NR_DIRTIED
   sys_vmeminfo_counters: VMEMINFO_NR_WRITTEN
   sys_vmeminfo_counters: VMEMINFO_NR_PAGES_SCANNED
   sys_vmeminfo_counters: VMEMINFO_WORKINGSET_REFAULT
   sys_vmeminfo_counters: VMEMINFO_WORKINGSET_ACTIVATE
   sys_vmeminfo_counters: VMEMINFO_WORKINGSET_NODERECLAIM
   sys_vmeminfo_counters: VMEMINFO_NR_ANON_TRANSPARENT_HUGEPAGES
   sys_vmeminfo_counters: VMEMINFO_NR_FREE_CMA
   sys_vmeminfo_counters: VMEMINFO_NR_SWAPCACHE
   sys_vmeminfo_counters: VMEMINFO_NR_DIRTY_THRESHOLD
   sys_vmeminfo_counters: VMEMINFO_NR_DIRTY_BACKGROUND_THRESHOLD
   sys_vmeminfo_counters: VMEMINFO_PGPGIN
   sys_vmeminfo_counters: VMEMINFO_PGPGOUT
   sys_vmeminfo_counters: VMEMINFO_PGPGOUTCLEAN
   sys_vmeminfo_counters: VMEMINFO_PSWPIN
   sys_vmeminfo_counters: VMEMINFO_PSWPOUT
   sys_vmeminfo_counters: VMEMINFO_PGALLOC_DMA
   sys_vmeminfo_counters: VMEMINFO_PGALLOC_NORMAL
   sys_vmeminfo_counters: VMEMINFO_PGALLOC_MOVABLE
   sys_vmeminfo_counters: VMEMINFO_PGFREE
   sys_vmeminfo_counters: VMEMINFO_PGACTIVATE
   sys_vmeminfo_counters: VMEMINFO_PGDEACTIVATE
   sys_vmeminfo_counters: VMEMINFO_PGFAULT
   sys_vmeminfo_counters: VMEMINFO_PGMAJFAULT
   sys_vmeminfo_counters: VMEMINFO_PGREFILL_DMA
   sys_vmeminfo_counters: VMEMINFO_PGREFILL_NORMAL
   sys_vmeminfo_counters: VMEMINFO_PGREFILL_MOVABLE
   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD_DMA
   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD_NORMAL
   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD_MOVABLE
   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT_DMA
   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT_NORMAL
   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT_MOVABLE
   sys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD_DMA
   sys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD_NORMAL
   sys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD_MOVABLE
   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_DMA
   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_NORMAL
   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_MOVABLE
   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT_THROTTLE
   sys_vmeminfo_counters: VMEMINFO_PGINODESTEAL
   sys_vmeminfo_counters: VMEMINFO_SLABS_SCANNED
   sys_vmeminfo_counters: VMEMINFO_KSWAPD_INODESTEAL
   sys_vmeminfo_counters: VMEMINFO_KSWAPD_LOW_WMARK_HIT_QUICKLY
   sys_vmeminfo_counters: VMEMINFO_KSWAPD_HIGH_WMARK_HIT_QUICKLY
   sys_vmeminfo_counters: VMEMINFO_PAGEOUTRUN
   sys_vmeminfo_counters: VMEMINFO_ALLOCSTALL
   sys_vmeminfo_counters: VMEMINFO_PGROTATED
   sys_vmeminfo_counters: VMEMINFO_DROP_PAGECACHE
   sys_vmeminfo_counters: VMEMINFO_DROP_SLAB
   sys_vmeminfo_counters: VMEMINFO_PGMIGRATE_SUCCESS
   sys_vmeminfo_counters: VMEMINFO_PGMIGRATE_FAIL
   sys_vmeminfo_counters: VMEMINFO_COMPACT_MIGRATE_SCANNED
   sys_vmeminfo_counters: VMEMINFO_COMPACT_FREE_SCANNED
   sys_vmeminfo_counters: VMEMINFO_COMPACT_ISOLATED
   sys_vmeminfo_counters: VMEMINFO_COMPACT_STALL
   sys_vmeminfo_counters: VMEMINFO_COMPACT_FAIL
   sys_vmeminfo_counters: VMEMINFO_COMPACT_SUCCESS
   sys_vmeminfo_counters: VMEMINFO_COMPACT_DAEMON_WAKE
   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_CULLED
   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_SCANNED 
   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_RESCUED
   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_MLOCKED
   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_MUNLOCKED
   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_CLEARED
   sys_vmeminfo_counters: VMEMINFO_UNEVICTABLE_PGS_STRANDED
   sys_vmeminfo_counters: VMEMINFO_NR_ZSPAGES
   sys_vmeminfo_counters: VMEMINFO_NR_ION_HEAP
   sys_vmeminfo_counters: VMEMINFO_NR_GPU_HEAP
   sys_vmeminfo_counters: VMEMINFO_ALLOCSTALL_DMA
   sys_vmeminfo_counters: VMEMINFO_ALLOCSTALL_MOVABLE
   sys_vmeminfo_counters: VMEMINFO_ALLOCSTALL_NORMAL
   sys_vmeminfo_counters: VMEMINFO_COMPACT_DAEMON_FREE_SCANNED
   sys_vmeminfo_counters: VMEMINFO_COMPACT_DAEMON_MIGRATE_SCANNED
   sys_vmeminfo_counters: VMEMINFO_NR_FASTRPC
   sys_vmeminfo_counters: VMEMINFO_NR_INDIRECTLY_RECLAIMABLE
   sys_vmeminfo_counters: VMEMINFO_NR_ION_HEAP_POOL
   sys_vmeminfo_counters: VMEMINFO_NR_KERNEL_MISC_RECLAIMABLE
   sys_vmeminfo_counters: VMEMINFO_NR_SHADOW_CALL_STACK_BYTES
   sys_vmeminfo_counters: VMEMINFO_NR_SHMEM_HUGEPAGES
   sys_vmeminfo_counters: VMEMINFO_NR_SHMEM_PMDMAPPED
   sys_vmeminfo_counters: VMEMINFO_NR_UNRECLAIMABLE_PAGES
   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_ACTIVE_ANON
   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_ACTIVE_FILE
   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_INACTIVE_ANON
   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_INACTIVE_FILE
   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_UNEVICTABLE
   sys_vmeminfo_counters: VMEMINFO_NR_ZONE_WRITE_PENDING
   sys_vmeminfo_counters: VMEMINFO_OOM_KILL 
   sys_vmeminfo_counters: VMEMINFO_PGLAZYFREE
   sys_vmeminfo_counters: VMEMINFO_PGLAZYFREED
   sys_vmeminfo_counters: VMEMINFO_PGREFILL
   sys_vmeminfo_counters: VMEMINFO_PGSCAN_DIRECT
   sys_vmeminfo_counters: VMEMINFO_PGSCAN_KSWAPD
   sys_vmeminfo_counters: VMEMINFO_PGSKIP_DMA
   sys_vmeminfo_counters: VMEMINFO_PGSKIP_MOVABLE
   sys_vmeminfo_counters: VMEMINFO_PGSKIP_NORMAL
   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_DIRECT
   sys_vmeminfo_counters: VMEMINFO_PGSTEAL_KSWAPD
   sys_vmeminfo_counters: VMEMINFO_SWAP_RA
   sys_vmeminfo_counters: VMEMINFO_SWAP_RA_HIT
   sys_vmeminfo_counters: VMEMINFO_WORKINGSET_RESTORE
   report_process_mem_info: true
   report_app_mem_info: false
   report_app_mem_by_memory_service: false
  }
 }
CONFIG
进程内存使用跟踪

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

hiprofiler_cmd \
  -c - \
  -o /data/local/tmp/hiprofiler_data.htrace \
  -t 50 \
  -s \
  -k \
<<CONFIG
 request_id: 1
 session_config {
  buffers {
   pages: 16384
  }
  result_file: "/data/local/tmp/hiprofiler_data.htrace"
  sample_duration: 50000
 }
 plugin_configs {
  plugin_name: "nativehook"
  sample_interval: 5000
  config_data {
   save_file: false
   filter_size: 4096
   smb_pages: 16384
   max_stack_depth: 10
   process_name: "com.ohos.mms"
   malloc_free_matching_interval: 1000
   malloc_free_matching_cnt: 1000
   string_compressed: true
   fp_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 \
<<CONFIG
 request_id: 1
 session_config {
  buffers {
   pages: 1000
  }
  result_file: "/data/local/tmp/hiprofiler_data.htrace"
  sample_duration: 30000
 }
 plugin_configs {
  plugin_name: "ftrace-plugin"
  sample_interval: 1000
  config_data {
   hitrace_time: 10
   hitrace_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: 51200
   flush_interval_ms: 1000
   flush_threshold_kb: 4096
   parse_ksyms: true
   clock: "mono"
   trace_period_ms: 200
   debug_on: false
  }
 }
CONFIG
hiperf场景示例

运行如下命令:

hiprofiler_cmd \
  -c - \
  -o /data/local/tmp/hiprofiler_data.htrace \
  -t 50 \
  -s \
  -k \
<<CONFIG
 request_id: 1
 session_config {
  buffers {
   pages: 16384
  }
  result_file: "/data/local/tmp/hiprofiler_data.htrace"
  sample_duration: 50000
 }
 plugin_configs {
  plugin_name: "hiperf-plugin"
  sample_interval: 5000
  config_data {
   is_root: false
   outfile_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.niftyadmin.cn/n/5425487.html

相关文章

制作图片马:二次渲染(upload-labs第17关)

代码分析 $im imagecreatefromjpeg($target_path);在本关的代码中这个imagecreatefromjpeg();函数起到了将上传的图片打乱并重新组合。这就意味着在制作图片马的时候要将木马插入到图片没有被改变的部分。 gif gif图的特点是无损&#xff0c;我们可以对比上传前后图片的内容…

在VINS-FUSION上处理KITTI数据集(双目+GPS)

文章目录 VINS-fusion拉取镜像创建容器在vscode中运行代码下载Kitti数据集运行程序解算结果VINS-fusion VINS-Fusion 是一个开源的实时多传感器状态估计库,主要由香港科技大学的沈邵劼教授领导的研究团队开发。它是 VINS-Mono(单目视觉惯性系统)的扩展,支持多种传感器组合…

c语言之汉诺塔的实现

思路 汉诺塔问题就是有三个盘子&#xff0c;让我们把其中一个盘子上的东西全移到另一个盘子上&#xff0c;注意的是中途必须满足大东西必须在小东西下面。 这里&#xff0c;我们有A B C三个盘子&#xff0c;假如A上有一个珠子&#xff0c;那我们直接把这一个移到C上就可以&am…

【LeetCode】72. 编辑距离(中等)——代码随想录算法训练营Day55

题目链接&#xff1a;72. 编辑距离 题目描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;w…

C# TCP通信机制

TCP&#xff08;传输控制协议&#xff09;通信在C#中的应用场景非常广泛&#xff0c;特别是在网络编程和分布式系统中。以下是一些常见的应用场景以及TCP通信的优缺点&#xff1a; 应用场景&#xff1a; 客户端-服务器通信&#xff1a;在客户端-服务器架构中&#xff0c;TCP通…

java POI excel导出【List<Entity>,List<Map>,Array】

引用版本&#xff0c;内置poi版本为3.17 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version></dependency> 1.针对List<Entity>导出excel /**** <p>* Tit…

增强版实名认证接口-Java身份证实名认证接口代码-身份认证

数字化时代&#xff0c;信息安全如同金盾&#xff0c;而身份验证则是这面盾牌的核心环节。每一次登录的背后&#xff0c;都是您对隐私保护的渴望&#xff1b;每一次交易的信任&#xff0c;都源于对身份真实性的确认。现如今&#xff0c;随着网络平台的不断增多&#xff0c;实名…

十六、接口隔离原则、反射、依赖注入

接口隔离原则、反射、特性、依赖注入 接口隔离原则 客户端不应该依赖它不需要的接口&#xff1b;一个类对另一个类的依赖应该建立在最小的接口上。 五种原则当中的i 上一章中的接口&#xff0c;即契约。 契约就是在说两件事&#xff0c;甲方说自己不会多要&#xff0c;乙方会在…