16 Star 30 Fork 298

OpenHarmony / developtools_profiler

Create your Gitee Account
Explore and code with more than 12 million developers,Free private repositories !:)
Sign up
Clone or Download
contribute
Sync branch
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README
Apache-2.0

性能调优组件

简介

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

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

架构图

目录

/developtools/profiler
├── device                       # 设备侧代码目录
│   ├── base                     # 基础功能代码
│   │   ├── include              # 基础功能的头文件代码目录
│   |   ├── src                  # 基础功能的源文件代码目录
│   |   └── test                 # 基础功能的测试代码目录
│   ├── cmds                     # 对外命令行模块的代码
│   |   ├── include              # 对外命令行模块的头文件代码目录
│   |   ├── src                  # 对外命令行模块的源文件代码目录
│   |   └── test                 # 对外命令行模块的测试代码目录  
│   └── plugins                  # 插件代码目录
│       ├── api                  # 插件模块对外提供的接口文件代码目录
│       |   ├── include          # 插件模块对外提供的接口头文件代码目录
│       |   └── src              # 插件模块对外提供的接口源文件代码目录
│       ├── memory_plugin        # 内存插件模块代码目录
│       |   ├── include          # 内存插件模块头文件代码目录
│       |   ├── src              # 内存插件模块源文件代码目录
│       |   └── test             # 内存插件模块测试代码目录
│       └── trace_plugin         # trace插件模块代码目录
│           ├── include          # trace插件模块头文件代码目录
│           ├── src              # trace插件模块源文件代码目录
│           └── test             # trace插件模块测试代码目录
├── host                         # 主机侧代码目录
│   └── ohosprofiler             # 主机侧调优模块代码目录
│       └── src                  # 主机侧调优模块源文件代码目录
├── protos                       # 项目中的proto格式文件的代码目录
│   └── innerkits                # 对内部子系统暴露的头文件存放目录
│       └── builtin              # JS应用框架对外暴露JS三方module API接口存放目录
├── trace_analyzer               # bytrace解析模块的代码目录
│   ├── include                  # bytrace解析模块的公共头文件存放目录
│   └── src                      # bytrace解析模块功能源文件存放目录
├── interfaces                   # 项目中接口的代码目录
│   ├── innerkits                # 模块间接口的代码目录
│   └── kits                     # 对外提供接口存放目录

说明

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

接口说明

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

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

表 1 PluginModuleCallbacks接口列表

接口名

类型

描述

PluginModuleCallbacks::onPluginSessionStart

int (*PluginSessionStartCallback)(const uint8_t* configData, uint32_t configSize);

  • 功能:

    插件会话开始接口,开始插件会话时会被调用,用来下发插件配置

  • 输入参数:

    configData:配置信息内存块起始地址

    configSize:配置信息内存块字节数

  • 返回值:

    0:成功

    -1:失败

PluginModuleCallbacks::onPluginReportResult

int (*PluginReportResultCallback)(uint8_t* bufferData, uint32_t bufferSize);

  • 功能:

    插件结果上报接口类型,当任务下发后,框架采集任务会周期性调用此接口请求回填数据

  • 输入参数:

    bufferData: 存放结果的内存缓冲区起始地址

    bufferSize: 存放结果的内存缓冲区的字节数

  • 返回值:

    大于0:已经填充的内存字节数

    等于0:没有填充任何内容

    小于0:失败

PluginModuleCallbacks::onPluginSessionStop

int (*PluginSessionStopCallback)();

  • 功能:

    采集会话结束接口

  • 返回值:

    0:成功

    -1:失败

PluginModuleCallbacks::onRegisterWriterStruct

int (*RegisterWriterStructCallback)(WriterStruct* writer);

  • 功能:

    采集框架注册写数据接口,当插件管理模块向插件注册此接口,插件可以主动调用write句柄,进行写入数据

  • 输入参数:

    writer 写者指针

  • 返回值:

    0:成功

    -1:失败

  • WriterStruct是上面onRegisterWriterStruct接口中的参数,主要实现写数据接口,将插件中采集的数据通过该接口进行写入。

表 2 WriterStruct接口列表

接口名

类型

描述

WriterStruct::write

long (*WriteFuncPtr)(WriterStruct* writer, const void* data, size_t size);

  • 功能:

    写接口,将插件中采集的数据通过writer进行写入

  • 输入参数:

    writer:写者指针

    data:数据缓冲区首字节指针

    size: 数据缓冲区的字节数

  • 返回值:

    0:成功

    -1:失败

WriterStruct::flush

bool (*FlushFuncPtr)(WriterStruct* writer);

  • 功能:

    触发数据上传接口

  • 输入参数:

    writer:写者指针

  • 返回值:

    true:成功

    false:失败

  • 下面是插件模块对外提供的总入口,主要包括表1中的插件模块回调函数以及插件名称、插件模块需要申请的内存大小。

表 3 PluginModuleStruct接口列表

接口名

类型

描述

PluginModuleStruct::callbacks

PluginModuleCallbacks*

功能:定义插件回调函数列表

PluginModuleStruct::name

C style string

功能:定义插件名称

PluginModuleStruct::resultBufferSizeHint

uint32_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

相关仓

研发工具链子系统

developtools_profiler

developtools_hdc

developtools_bytrace

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS

About

Performance profiler that provides an analytics tool for the memory, bytrace plug-in, and IDE, as well as plug-in capabilities | 性能调优模块,提供了实时内存、bytrace插件和ide侧的分析工具,并提供了插件化能力 expand collapse
Apache-2.0
Cancel

Releases

No release

Contributors

All

Activities

Load More
can not load any more
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/openharmony/developtools_profiler.git
git@gitee.com:openharmony/developtools_profiler.git
openharmony
developtools_profiler
developtools_profiler
master

Search

344bd9b3 5694891 D2dac590 5694891