OpenHarmony子系统开发 - 调测工具(二)

OpenHarmony子系统开发 - 调测工具(二)


三、hiperf使用指导

hiperf是为开发人员提供性能采样分析的工具,基于内核perf机制进行的用户态能力的扩展,可以对指定的程序或者整个系统进行性能采样。

hiperf支持的命令有:list、stat、record、report等,可以通过hiperf -h进行查看。

下面对hiperf的常用命令进行详细说明:

list 命令

参数说明

列出设备上支持的所有perf事件名称,事件名称用于 stat 和 record命令的 -e 和 -g 参数。

复制代码
Usage: hiperf list [event type]
参数 功能说明
hw 列出支持的 hardware 事件(PMU支持)
sw 列出支持的 software 事件
tp 列出支持 tracepotint 事件
cache 列出支持的 cache 事件(PMU支持)
raw 列出支持的原始PMU事件

使用示例

下面列出了设备支持的hardware事件,并且会提示哪些事件此设备不支持。

复制代码
hiperf list hw
event not support hw-stalled-cycles-backend
event not support hw-stalled-cycles-frontend
event not support hw-ref-cpu-cycles

Supported events for hardware:
        hw-cpu-cycles
        hw-instructions
        hw-cache-references
        hw-cache-misses
        hw-branch-instructions
        hw-branch-misses
        hw-bus-cycles

stat 命令

参数说明

监听指定目标程序,周期性打印性能计数器的值。

复制代码
Usage: hiperf stat [options]
       Collect performance counter information.
参数 功能说明
-a 采集监听整个系统的所有线程和默认的性能计数器的值。
-c 指定cpu id,可以是0,1,2用逗号分隔。
-d <sec> 指定监听的时间,单位为秒。
-i <ms> 指定监听事件的间隔打印时间,单位毫秒。
-e 指定监听的事件,可以通过list命令查看支持的所有事件,其中event:u 或者 :k 表示限制事件为用户空间或者内核空间。
-g 指定需要在同一组监听的事件,同一组事件会被放入同一个PMU监听。
--no-inherit 不监听目标线程/进程启动的子线程。
-p 指定需要监听的进程pid。
-t 指定需要监听的线程tid。
--verbose 显示详细的报告内容,包括一些原始的时间数据等等。

使用示例

下面是通过 stat 监听整个系统3秒的示例:

复制代码
hiperf stat -d 3 -a
this is root mode, perfEventParanoid assume as -1
Start Profiling...
Timeout exit (total 3009 ms)
                count                           name | comment                          | coverage
               132523         hw-branch-instructions | 15.750 M/sec                     | (100%)
                62554               hw-branch-misses | 47.202372% miss rate             | (100%)
              6994768                  hw-cpu-cycles | 0.832068 GHz                     | (100%)
              1237627                hw-instructions | 5.651758 cycles per instruction  | (100%)
                  248            sw-context-switches | 29.959 K/sec                     | (100%)
                    0                 sw-page-faults | 0.000 /sec                       | (100%)
              9402580                  sw-task-clock | 0.002758 cpus used               | (100%)

字段说明

字段名 含义
count 表示事件发生的次数。
name 事件的名称,在 list 命令中可以看到所有支持的命令,hw 和 sw 的前缀分别代表是hardware事件还是software事件。
comment 一些经过计算的方便用户阅读的值。例如 CPU 的相对主频,千位进制换算等等。
coverage 该事件在PMU中的 enable 百分比,受限于PMU数量,每次装载的PMU监听事件是有限的。

record 命令

参数说明

采样指定目标程序,并且将采样数据保存到指定的文件中(默认为perf.data)

复制代码
Usage: hiperf record [options]
       Collect performance sampling information.
参数 功能说明
-a 对整个系统的所有进程和线程进行采样。
--exclude-hiperf 不采样hiperf自身进程。
-c 指定采样的cpu id。
--cpu-limit <percent> 限定采样过程占用的CPU最大百分比。
-d <sec> 指定采样时长,单位秒。
-f <freq> 设置采样事件的触发频率,默认为4000。 说明:该频率越高cpu负载会越高,但是数据采样会越多。
--period <num> 设置采样事件触发周期,以次数为单位,即发生指定的次数后采样一次。
-e 指定监听的事件,可以通过list命令查看支持的所有事件,其中event:u 或者 :k 可以表示限制事件为用户空间或者内核空间。
-g 指定需要在同一组监听的事件,同一组事件会被放入同一个PMU监听。
--no-inherit 不监听目标线程或者进程启动的子线程。
-p 指定需要监听的进程。
-t 指定需要监听的线程。
--offcpu 监听CPU调度事件,它等价于 --period 1 -e sched:sched_switch 事件。
-j <branch_filter1 >[,branch_filter2]... 监听分支预测事件。分支预测就是指令存在多个if else判定的情况下,CPU去预测下一步即将执行哪一条指令。
-s / --call-stack <fp | dwarf[,size]> 设置用户栈的回栈方式,支持fp和dwarf两种方式。dwarf 后面可以指定采样的用户堆栈大小,默认是 65528。
--delay-unwind 延迟回栈,等到采样结束再进行回栈。
--disable-unwind 不进行回栈,用户的寄存器和堆栈数据会保存在perf.data中,供离线回栈使用。
--disable-callstack-expend 默认会对回栈的调用栈信息进行合并扩展,此选项会关闭该功能。
--clockid <clock type> 设置采样数据的时钟源,支持monotonic、boottime、realtime等。
--symbol-dir <dir> 指定符号表路径,如果指定了回栈时会优先使用该路径下的符号表。
-m <mmap pages> 指定缓存的大小,默认值为1024,以页为单位。参数需要为2的幂,范围为 [2 - 1024]。 说明:该值越高,事件丢失率会越低,但是内存占用会增大。
--app <package name> 指定采样的目标应用的包名,默认超时等待时间为10秒。
--data-limit <SIZE[K|M|G]> 指定采样结果的最大容量,支持K/M/G(B)为单位,默认无大小限制。
-o <output file name> 指定采样数据结果文件名,默认为/data/local/tmp/perf.data。
-z 启动压缩模式,在保存到文件的时候,会用gzip进行压缩。
--verbose 采样的时候显示更详细的日志信息。

使用示例

  • 对全系统所有进程采样3秒,并且显示详细的日志信息

    复制代码
    hiperf record -d 3 -a --verbose
  • 指定使用fp方式进行回栈

    复制代码
    hiperf record -s fp -d 3 -a
  • 指定使用dwarf方式进行回栈

    复制代码
    hiperf record -s dwarf -d 3 -a
  • 指定采样offcpu事件

    复制代码
    hiperf record --offcpu -s dwarf -d 3 -a
  • 指定延迟回栈

    复制代码
    hiperf record -d 3 -s dwarf --delay-unwind -a
  • 禁止回栈,此时会保存堆栈数据到perf.data文件

    复制代码
    hiperf record -d 3 -s dwarf --disable-unwind -a
  • 指定追踪的包名,如果指定的包名对应的进程不存在则会延时等待10秒,超时后进程退出

    复制代码
    hiperf record -d 3 -s dwarf --app com.ohos.launch
  • 指定对采样结果数据进行压缩保存

    复制代码
    hiperf record -z -s dwarf -d 3  -a

report 命令

参数说明

此命令主要用于展示record中抓取的采样数据

复制代码
Usage: hiperf report [option]     
       Report sampling information from perf.data.
参数 功能说明
--symbol-dir <dir> 指定符号表路径。
--limit-percent <number> 指定展示结果的最低百分比(低于的不显示)。
-s / --call-stack 指定该选项后结果数据中会包含详细的调用栈信息。
--call-stack-limit-percent <number> 调用栈的百分比最小值(低于的不显示)。
--proto 将输入的 perf.data 文件转换为 proto 格式,默认文件名为 perf.proto。
--json 将输入的 perf.data 文件转换为 json 格式,默认文件名为 perf.json。
--branch 按分支预测的结果地址来展示报告,而不是调用栈的IP地址。
--<keys > <keyname1 >[,keyname2][,...] 按给出的关键字来过滤展示报告,keys支持:comms、pids、tids等 例如 --comms hiperf,hilog 表示仅显示进程/线程名称为 hiperf或者hilog的记录条目。
--sort <key1 >[,key2][,...] 按照给出的关键字来排序和显示,支持:pid、tid、comm等,可以指定多个关键字。
-i <filename> 指定输入的采样数据(默认为perf.data)。
-o <filename> 指定输出的报告文件名。

使用示例

  • 输出采样数据的报告,默认读取perf.data文件

    复制代码
    hiperf report

    输出结果举例:

    复制代码
    Heating count    comm            pid  tid  dso                                func
     5.68%  15073949 hiperf_example_ 1085 1091 /system/lib/ld-musl-arm.so.1       malloc
     2.57%   6834119 hiperf_example_ 1085 1091 [kernel.kallsyms]                  vector_swi
     2.27%   6013910 hiperf_example_ 1085 1087 /system/lib/ld-musl-arm.so.1       malloc
     2.19%   5805738 hiperf_example_ 1085 1091 /system/lib/ld-musl-arm.so.1       vfprintf
     2.09%   5543362 hiperf_example_ 1085 1091 [kernel.kallsyms]                  ktime_get_ts64
    report done
  • 输出采集数据的调用栈报告

    复制代码
    hiperf report -s
  • 指定符号表路径

    复制代码
    hiperf report -s --symbol-dir /data/local/tmp
  • 指定结果过滤的关键字,指定后会只显示包含该关键字的信息。比如过滤libutils.z.so则命令如下:

    复制代码
    hiperf report --dsos libuitls.z.so
  • 指定按照特定的关键字进行排序展示,比如按照dso进行排序:

    复制代码
    hiperf report --sort dso

四、HiDumper概述

功能简介

HiDumper是OpenHarmony为开发、测试人员、IDE工具提供的系统信息获取工具,帮助开发者分析、定位问题。本章节内容适用于标准系统。

源码目录说明

复制代码
/base/hiviewdfx/hidumper
├── frameworks           # 框架代码
│   ├── native           # 导出功能核心代码
│   │  │── include       # 头文件目录
│   │  │── src           # 源文件目录
│   │      │── common    # 通用功能代码
│   │      │── executor  # 导出过程执行器代码
│   │      │── factory   # 跟进导出项生成导出执行器
│   │      │── manager   # 导出管理核心代码
│   │      │── util      # 工具类源代码
│── sa_profile           # Hidumper sa属性文件
│── services             # Hidumper服务源码
│   │── native           # 服务C++源码
│   │── zidl             # 通讯功能源码目录
│   │   │── include      # 通讯功能头文件
│   │   │── src          # 通讯功能源代码
├── test                 # 测试用例目录
│   ├── unittest         # 单元测试代码
│   ├── moduletest       # 模块级别测试代码

HiDumper使用指导

命令参数说明

表1 HiDumper命令参数说明

选项 描述
-h 查看帮助信息。
-t [timeout] 超时时间,单位:秒。默认值是30s。如果设置为0表示无超时限定。
-lc 查看系统信息簇列表。
-ls 查看系统元能力列表。
-c 导出系统簇信息。
-c [base system] 以base或system标签区分的系统簇信息导出。
-s 导出全部系统元能力信息。
-s [SA0 SA1] 导出SA0、SA1等元能力id对应的元能力信息。
-s [SA] -a ['-h'] 以-h为参数导出SA指定的系统元能力信息。
-e 导出Faultlog模块生成的崩溃日志。
--net [pid] 导出网络信息。如果指定了进程的pid,则只获取该进程的网络流量使用信息。
--storage [pid] 导出存储信息。如果指定了进程的pid,则只获取该进程的io信息。
-p 导出进程列表及全部进程信息。
-p [pid] 导出指定进程号的进程全部信息。
--cpuusage [pid] 导出CPU使用信息。如果指定pid则导出该进程的CPU使用信息。
--cpufreq 导出实际的CPU频率。
--mem [pid] 导出内存使用信息。如果指定pid则导出该进程的内存使用信息。
--zip 将导出信息压缩到固定文件夹下。

使用实例

HiDumper可以为开发者导出系统当前基本信息,通过这些基本信息可以定位分析问题。给子服务和元能力传递复杂参数时,参数需要加双引号。

具体步骤如下:

  1. 进入设备命令行,输入 hidumper -h 获取基本信息介绍,功能语法介绍。

    复制代码
    hidumper -h
  2. 输入 hidumper -lc 获取系统信息分类列表。

    复制代码
    hidumper -lc
  3. 输入 hidumper -c 获取系统base、system等所有分类信息。

    复制代码
    hidumper -c
  4. 输入 hidumper -c [base | system] 按 base 或 system 分类获取系统簇信息。

    复制代码
    hidumper -c base
    hidumper -c system
  5. 输入 hidumper -ls 命令获取系统中元能力列表。

    复制代码
    hidumper -ls
  6. 输入 hidumper -s 命令获取系统全部元能力信息。

    复制代码
    hidumper -s
  7. 运行 hidumper -s 3301 -a "-h" 命令获取id为3301的元能力的帮助。

    复制代码
    hidumper -s 3301 -a "-h"
  8. 运行 hidumper -s 3008命令获取id为3008的元能力的全部信息。

    复制代码
    hidumper -s 3008
  9. 运行 hidumper -e 命令获取Faultlog模块生成的崩溃历史信息。

    复制代码
    hidumper -e
  10. 运行 hidumper --net [pid] 命令获取网络信息;如果指定了进程的pid,则只获取该进程的网络流量使用信息。

    复制代码
    hidumper --net
    hidumper --net 1024
  11. 运行 hidumper --storage [pid] 命令获取存储相关信息;如果指定了进程的pid,则只获取该进程的io信息。

    复制代码
    hidumper --storage
    hidumper --storage 1024
  12. 运行 hidumper -p 命令获取进程信息,包括进程、线程的列表和信息。

    复制代码
    hidumper -p
  13. 运行 hidumper -p 1024 命令获取pid为1024的进程信息。

    复制代码
    hidumper -p 1024
  14. 运行 hidumper --cpuusage [pid] 命令获取CPU的使用信息。如果指定了进程的pid,则只获取该进程的CPU使用信息。

    复制代码
    hidumper --cpuusage
    hidumper --cpuusage 1024
  15. 运行 hidumper --cpufreq 命令获取每一个CPU核实际运行的频率。

    复制代码
    hidumper --cpufreq
  16. 运行 hidumper --mem [pid] 命令获取全部的内存使用信息。如果指定进程的pid,只获取该进程的内存使用情况。

    复制代码
    hidumper --mem [pid]

    当携带pid参数时输出结果中第一列标题的详细说明如下:

    名称 描述
    GL GPU内存
    Graph 图形内存
    ark ts heap ArkTS堆的内存占用
    guard 保护段所占内存
    native heap 堆内存
    AnonPage other 其它没有被映射到文件的页所占内存
    stack 栈内存
    .hap 应用程序所占内存
    .db 进程加载的.db数据文件所占内存
    .so 进程加载的.so动态库所占内存
    .ttf 进程加载的.ttf字体文件所占内存
    dev 进程加载的以/dev开头的文件所占内存
    FilePage other 其它有被映射到文件的页所占内存
  17. 运行 hidumper --zip 命令压缩信息数据到/data/dumper目录下。

    复制代码
    hidumper --zip
  18. 运行 hidumper -t timeout 命令设置超时时间,单位:秒。默认值是30s。如果设置为0表示无超时限制。

    复制代码
    hidumper -t [timeout]
  19. 运行 hidumper --mem-smaps pid [-v] 命令获取指定进程内存信息的详细使用情况。

    复制代码
    hidumper --mem-smaps pid [-v]

相关推荐
itwangyang52011 分钟前
AIDD-人工智能药物设计-大语言模型在医学领域的革命性应用
人工智能·语言模型·自然语言处理
热心网友俣先生26 分钟前
2025年泰迪杯数据挖掘竞赛B题论文首发+问题一二三四代码分享
人工智能·数据挖掘
LitchiCheng39 分钟前
MuJoCo 机械臂关节路径规划+轨迹优化+末端轨迹可视化(附代码)
人工智能·深度学习·机器人
前端小菜鸡zhc39 分钟前
大模型之提示词工程
人工智能
别说我什么都不会1 小时前
【仓颉三方库】 网络组件——httpclient4cj
harmonyos
zy_destiny1 小时前
【非机动车检测】用YOLOv8实现非机动车及驾驶人佩戴安全帽检测
人工智能·python·算法·yolo·机器学习·安全帽·非机动车
that's boy1 小时前
字节跳动开源 LangManus:不止是 Manus 平替,更是下一代 AI 自动化引擎
运维·人工智能·gpt·自动化·midjourney·gpt-4o·deepseek
stormsha1 小时前
使用Python进行AI图像生成:从GAN到风格迁移的完整指南
人工智能·python·生成对抗网络
量子位1 小时前
字节视频基础大模型发布!单 GPU 就可生成 1080P,蒋路领衔 Seed 视频团队曝光
人工智能·llm