From 67154e69782936cd641845c9335dac3c6197e1e6 Mon Sep 17 00:00:00 2001 From: Xie jiamei Date: Thu, 26 Jun 2025 15:27:43 +0800 Subject: [PATCH] doc: Update the document for hygon hpt Signed-off-by: Xie jiamei --- ...45\345\205\267\347\256\200\344\273\213.md" | 2664 +++++++++++------ ...37\350\203\275\347\256\200\344\273\213.md" | 166 - 2 files changed, 1682 insertions(+), 1148 deletions(-) delete mode 100644 "sig/Hygon Arch/content/8-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\346\211\213\345\206\214/1-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267TOPDOWN\350\257\246\347\273\206\345\212\237\350\203\275\347\256\200\344\273\213.md" diff --git "a/sig/Hygon Arch/content/8-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\346\211\213\345\206\214/0-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\347\256\200\344\273\213.md" "b/sig/Hygon Arch/content/8-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\346\211\213\345\206\214/0-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\347\256\200\344\273\213.md" index 9d27c4da..0018418e 100644 --- "a/sig/Hygon Arch/content/8-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\346\211\213\345\206\214/0-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\347\256\200\344\273\213.md" +++ "b/sig/Hygon Arch/content/8-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\346\211\213\345\206\214/0-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\347\256\200\344\273\213.md" @@ -1,158 +1,460 @@ # 简介 -hygon_tuner是一款专为Hygon服务器设计的性能分析工具,现阶段仅支持在Linux系统上运行。这款工具集成了多种功能,以便全面而深入地分析服务器的性能状况。 -官方发布的 hygon_tuner位于 gitee 的 hygon-devkit 仓库,地址:https://gitee.com/anolis/hygon-devkit.git。如果 `hpt` 文件夹中没有 `hygon_tuner`工具,可以使用 `install_hpt.sh` 脚本进行下载和安装,默认安装路径为`/opt/hygon`。 +hpt(Hygon Performance Tuner)是一款专为Hygon服务器设计的性能分析工具,现阶段仅支持在Linux系统上运行。这款工具集成了多种功能,以便全面而深入地分析服务器的性能状况。 +hpt主要包括以下功能: -`````` -git clone --depth 1 https://gitee.com/anolis/hygon-devkit.git -cd hygon-devkit/hpt -#当前支持3.0.0, 4.0.0, 4.1.0 -sudo ./install_hpt.sh 4.1.0 -`````` - -hygon_tuner主要包括以下功能: - -1. [hygon_pcm](#hygon_pcm)工具 - * [system](#system):全面采集系统的详细配置信息,涵盖BIOS、操作系统、CPU、内存、网卡以及磁盘等关键组件,为用户提供系统整体的概览。 - * [collect](#collect):采集CPU、L3 Cache和DF等组件的性能指标数据,帮助用户掌握硬件的运行状态。 -2. [hygon_sys](#hygon_sys)工具 - * [process](#process):收集各个进程对CPU、内存、存储IO等资源的消耗情况,包括使用率、饱和度、错误次数等关键指标,帮助用户识别资源瓶颈。 - * [network](#network):专注于收集网络信息,包括网卡的整体收发包统计、单队列收发包统计以及硬中断/软中断统计等,为用户分析网络性能提供有力支持。 - * [java](#java):针对Java进程,能够收集其CPU、内存等资源的使用率,并获取进程的类加载、热点代码等详细信息,助力Java应用性能调优。 - * [sched](#sched):通过收集系统内进程/线程的调度时延、CPU切换链路以及冷火焰图等数据,帮助用户准确识别性能瓶颈,优化系统调度策略。 +* [system](#system): 全面采集系统的详细配置信息,涵盖BIOS、操作系统、CPU、内存、网卡以及磁盘等关键组件。同时,测试并评估内存带宽与延迟、FLOP、IPC 等性能指标,为用户提供系统整体概览。 +* [collect](#collect):采集CPU、L3 Cache和DF等组件的性能指标数据,帮助用户掌握硬件的运行状态。 +* [process](#process):收集各个进程对CPU、内存、存储IO等资源的消耗情况,包括使用率、饱和度、错误次数等关键指标,帮助用户识别资源瓶颈。 +* [network](#network):专注于收集网络信息,包括网卡的整体收发包统计、单队列收发包统计以及硬中断/软中断统计等,为用户分析网络性能提供有力支持。 +* [java](#java):针对Java进程,能够收集其CPU、内存等资源的使用率,并获取进程的类加载、热点代码等详细信息,助力Java应用性能调优。 +* [sched](#sched):通过收集系统内进程/线程的调度时延、CPU切换链路以及冷火焰图等数据,帮助用户准确识别性能瓶颈,优化系统调度策略。 +* [hotspot](#hotspot):支持分析C/C++程序代码识别性能瓶颈,识别并展示占比高于0.5%的前20个热点函数及其调用栈信息,通过火焰图展示函数的调用关系。 +* [mem](#mem): 支持分析程序访存相关的性能指标,包括进程发生本DIE访存和跨DIE访存的次数、进程发生伪共享的情况,帮助开发者深入了解程序在运行时的内存访问行为。 +* [roofline](#roofline): roofline 模型是一种可视化性能分析方法,用于帮助开发者理解高性能计算程序的性能瓶颈。它将浮点运算能力与DRAM访问带宽结合,以图形的方式揭示程序是受计算能力限制,还是受内存带宽限制。 -通过整合这些功能,hygon_tuner为Hygon服务器用户提供了一个灵活的性能分析工具,助力用户更好地理解和优化服务器性能。 +通过整合这些功能,hpt为Hygon服务器用户提供了一个灵活的性能分析工具,助力用户更好地理解和优化服务器性能。 ## 支持的平台 -海光一号,二号,三号, 四号平台。 +海光1号,海光2号,C86-3G,C86-4G。 ## 目录结构 -hygon_tuner_tools工具包的目录及成员如下: -- set_env.sh: 配置命令行自动补全的脚本。 -- hygon_pcm/hygon_sys: 用户下发命令的接口。 -- bin/config目录: 用户自定义采集事件的输入文件示例。 +hpt 工具包的目录结构及组成如下,包含 `hpt` 命令行工具和` DF PMU API `开发库: `````` -hygon_tuner工具包 -+---hygon_tuner_tools -| +---bin -| | +---config -| | +---customized.xml -| +---hygon_pcm -| +---hygon_sys -| +---set_env.sh -+---README -+---TOPDOWN_DETAILS_README -+---ChangeLog +hpt/ +├── hpt # 下发命令的接口 +├── bash_completion.sh # 配置命令行自动补全的脚本 +├── get_all_configs.sh # 一键收集系统的详细配置信息的脚本 +├── get_all_collect_data.sh # 一键收集常用的PMU指标脚本 +├── get_all_software_data.sh # 一键收集常用的软件性能数据脚本 +├── configs/ # 自定义采集规则配置示例目录 +│ └── customized.xml # 自定义采集事件的输入配置文件模板(XML格式) +├── docs/ # 文档目录 +│ ├── README # 工具包使用说明文档 +│ └── ChangeLog # 版本迭代记录文档(按时间倒序排列更新内容) +└── libs/ # DF PMU API开发库及示例目录(支持C++集成开发) + ├── examples/ # 静态库使用示例代码 + │ ├── ccm_lat.cpp # ccm_lat示例 + │ ├── cm.cpp # cm示例 + │ ├── cs_lat.cpp # cs_lat示例 + │ ├── die_bw_v1.cpp # di/do示例(适用平台:海光1号、海光2号、C86-3G) + │ ├── die_bw_v2.cpp # di/do示例(适用平台:C86-4G平台) + │ ├── iom.cpp # iom示例 + │ └── iom_lat.cpp # iom_lat示例 + ├── include/ # 开发所需头文件 + │ ├── df_pmu_api.h # PMU接口头文件 + │ └── df_pmu_data_structs.h # 数据结构定义头文件 + ├── lib/ # 静态链接库文件 + │ └── libPCM.a # 静态库(Linux静态库格式) + ├── Makefile # 示例代码编译脚本(支持make命令构建) + └── README.html # 开发库API文档 `````` ## 环境配置 - - 执行source set_env.sh,配置命令自动补全。 - - 执行hygon_pcm或hygon_sys时,需要root权限。 + - 执行source bash_completion.sh,配置命令自动补全。 + - 执行hpt和一键收集脚本时,需要root权限。 + - 工具存放点目录路径不要有中文字符 -# 使用方法 +# 功能介绍 `````` -hygon_pcm [] [] [] -hygon_sys [] [] [] -`````` - -## hygon_pcm介绍 - +hpt [] [] [] -### Command -- system:采集系统的配置信息,包括BIOS、操作系统、CPU、内存、网卡和磁盘信息。 -- collect:采集CPU、L3和DF等组件的性能指标数据。 - -`````` -$# source set_env.sh -$# sudo ./hygon_pcm -h +$# source bash_completion.sh +$# sudo ./hpt -h -usage: hygon_pcm [-h] [-v] {system,collect} ... +usage: hpt [-h] [-v] + {system,collect,process,network,java,sched,hotspot,mem,roofline} ... positional arguments: - {system,collect} - system dump system info, including bios, memory, network etc. - collect collect performance data + {system,collect,process,network,java,sched,hotspot,mem} + system Collects detailed system information, including BIOS, + memory, network, and other key components. Estimates system + performance metrics such as memory bandwidth/latency, FLOP, + and IPC. + collect collect performance data + process collects information about the resources such as CPU, + memory, and storage I/O resources used by processes + network collect performance data of network devices + java collect performance data for Java programs + sched scheduling analysis + hotspot hotspot analysis + mem memory analysis + roofline roofline analysis optional arguments: - -h, --help show this help message and exit - -v view the version information. + -h, --help show this help message and exit + -v view the version information +`````` +## 常用指令示例 +### system +- 一键收集系统的配置信息,默认将输出信息存在sys_info目录下。 `````` +$# sudo ./get_all_configs.sh +`````` +### collect -### Options -#### system +- 一键收集某个进程运行过程中,系统的PMU指标,默认将输出信息存在collect_data目录下。 +`````` +$# sudo ./get_all_collect_data.sh -p $PID +`````` +- 收集系统的拓扑信息,查看服务器型号、cache size、各个node cpu列表和各个DIE cpu列表。 +*(注:node是逻辑层面的概念,表示NUMA架构中,一个包含CPU核心和内存的独立单元。DIE是物理芯片的一部分。)* +`````` +$# sudo ./hpt collect --topo-list +`````` +- 收集3s内,系统中所有CPU的 ipc,l1,l2,l3相关指标,并按照CPU DIE粒度展示 +`````` +$# sudo hpt collect -m ipc,l1,l2,l3 -d 3 -A die +`````` +- 收集系统中某个进程的ipc,l1,l2,l3相关指标,一直统计到进程结束 +`````` +$# sudo hpt collect -m ipc,l1,l2 -p $PID +`````` +- 收集某条命令执行过程中的ipc,l1,l2,l3,访存带宽相关指标,一直统计到命令执行结束 +`````` +$# sudo hpt collect -m ipc,l1,l2,l3,cm -cmd "$COMMAND" +`````` +- 收集系统中各个DIE的cpu访问内存的带宽,每秒采集一次,一共采集3次。将结果以csv的格式存在output文件中,用户可以用excel将csv文件打开,进一步做数据处理。 +`````` +$# sudo hpt collect -m cm -I 1 -count 3 -csv -o output +`````` +### process + - 收集某条命令执行过程,占用CPU资源、内存资源和系统调用执行情况,每隔1s收集一次,收集2次。 + `````` + $# sudo hpt process -cpu -mem -syscall -I 1 -count 2 -cmd "$COMMAND" + `````` + - 收集系统中某个进程执行过程,占用CPU资源、内存资源,IO资源和系统调用执行情况,每隔1s收集一次,收集2次。 + `````` + $# sudo hpt process -cpu -mem -io -syscall -I 1 -count 2 -p $PID + `````` +### sched +- 一键收集系统中某个进程的性能数据,默认存在software_data目录下 +`````` +$# sudo ./collect_software_data.sh +`````` +- 收集1s内系统中的调度时延信息,并以command维度展示 +`````` +$# sudo hpt sched -d 1 +`````` +- 收集1s内系统中某个进程的调度时延信息,并以线程维度展示 +`````` +$# sudo hpt sched -d 1 -p $PID -s 2 +`````` +- 收集1s内系统调度的冷火焰图 +`````` +$# sudo hpt sched -d 1 -flame +`````` +### hotspot +- 收集5s内CPU0-7,基于cycle、指令、访问cache、访问内存的热点函数信息。 +`````` +$# sudo hpt hotspot -e ·cycles,insn,mem-access,cache -d 5 -c 0-7 +`````` +- 收集某条命令执行过程中,用户态的热点函数信息。 +`````` +$# sudo hpt hotspot -cmd "$COMMAND" -u +`````` +- 收集1s内系统热点函数火焰图 +`````` +$# sudo hpt hotspot -d 1 -flame +`````` +### mem +- 收集5s内系统内进程的访存行为 +`````` +$# sudo ./hpt mem -d 5 +`````` +- 收集5s内系统内某个进程发生伪共享的访存行为 +`````` +$# sudo ./hpt mem -d 5 -c2c -p $PID +`````` +### roofline +- 执行第一轮survey分析,收集热点函数信息 +`````` +$# sudo ./hpt roofline -record survey -cmd "$COMMAND" -dir "$OUTPUT_DIR" +`````` +- 执行第二轮tripcounts分析,收集FLOPs信息。结合热点函数信息,得到计算强度等指标 +`````` +$# sudo ./hpt roofline -record tripcounts -cmd "$COMMAND" -dir "$OUTPUT_DIR" +`````` +- 生成roofline报告 +`````` +$# sudo ./hpt roofline -report -dir "$OUTPUT_DIR" +`````` +## 子功能介绍 +### system -##### 用户参数 +#### 用户参数 - - + + - - - + + - - - + + - - - + + - - + - - - + + + + + + + - - + - - + - - + + - - +
Option Description
-a显示简介。-h 展示help信息。 +
-b <0|1>收集bios信息。 -
· 指定为0表示关闭,指定为1表示开启,默认开启。 +
-diff <src_dir,target_dir>对比两个配置。
-l <0|1>收集第三方日志的详细信息,包括启动信息、中断信息和网络相关信息。 -
· 指定为0表示关闭,指定为1表示开启,默认关闭。 +
-src <src_dir>指定要评估的源代码路径。
-m <0|1>收集内存信息。 -
· 指定为0表示关闭,指定为1表示开启,默认开启。 +
-app <app_dir>指定要评估的应用路径。
-n <0|1>收集网卡信息。 -
· 指定为0表示关闭,指定为1表示开启,默认开启。 +
-o <out_dir>指定输出目录。
-o指定输出文件名称。 -
· 不指定的话,文件名称默认是system。
-ptest统计CPU访存带宽/延迟、FLOPS、IPC 信息。该功能通过程序运行进行评估,耗时较长,默认关闭。 +
-mem-bw评估CPU访存带宽。该功能耗时较长。 +
-os <0|1>收集操作系统信息。 -
· 指定为0表示关闭,指定为1表示开启,默认开启。 +
-mem-idle-lat评估CPU访存idle latency。
-p <0|1>收集处理器信息。 -
· 指定为0表示关闭,指定为1表示开启,默认开启。 +
-mem-loaded-lat评估CPU访存loaded latency。
-q不显示屏幕输出,直接收集所有默认开启的信息。-flop评估CPU的FLOPS。 +
-s <0|1>收集磁盘信息。 -
· 指定为0表示关闭,指定为1表示开启,默认开启。 +
-ipc评估CPU的IPC。
-##### system示例 -- 收集系统的配置信息,包括BIOS、CPU、内存、网卡、操作系统和磁盘信息。 +#### system示例 +本功能支持全面采集并对比系统配置信息,包括 BIOS、CPU、内存、网卡、操作系统、磁盘等关键组件。同时,测试并评估内存带宽与延迟、FLOP、IPC 等性能指标,为用户提供系统整体概览。 +##### 采集系统配置 +执行以下命令采集当前平台的系统配置信息,生成二进制原始数据文件,txt 和 html 格式报告。若没有`-o`指定输出目录,将在当前目录下自动创建一个以「序列号_主机名_日期」命名的文件夹。若无法获取有效的序列号,序列号部分将自动使用 `null` 代替。 +```bash +sudo ./hpt system +``` + +目录结构说明: +``` +null_mercury_20250529_114108 +|-- raw_data +| `-- out_config.data +| # 系统原始配置二进制数据(确保数据原始性与可追溯性) +`-- report + |-- null_mercury_20250529_114108_report.html + │ # 交互式 HTML 报告(支持章节跳转,适合可视化阅读 + |-- null_mercury_20250529_114108_report.txt + │ # 纯文本报告(便于快速浏览) + `-- sections + |-- section_11126068424927430839.html + |-- section_12615308721664438240.html + |-- section_18016304884340749991.html + |-- section_2828748034116412346.html + |-- section_5242092336910490505.html + # 报告中较长的内容分段存放的独立 HTML 文件,主报告中支持跳转查看 +``` +##### 对比配置 +执行以下命令对两个已采集的配置进行对比,并生成报告: +```bash +$# sudo ./hpt system -diff null_mercury_20250509_151556,null_jupiter_20250509_152312 +``` +执行完成后,目录结构示例如下: +``` +null_jupiter_20250509_152312 +├── raw_data +│ └── out_config.data +│ # 采集到的系统原始配置二进制数据 +└── report + ├── diff_null_mercury_20250509_151556_null_jupiter_20250509_152312_report.html + │ # 生成的 HTML 格式对比报告 + ├── diff_null_mercury_20250509_151556_null_jupiter_20250509_152312_report.txt + │ # 生成的 TXT 格式对比报告 + └── sections + ├── section_11126068424927430839.html + ├── section_12615308721664438240.html + ├── section_18016304884340749991.html + ├── section_2828748034116412346.html + ├── section_389947193454080491.html + ├── section_5242092336910490505.html + └── section_8147660637116899261.html + # 报告中较长的内容分段存放的独立 HTML 文件,主报告中支持跳转查看 +``` + +##### 收集访存带宽/延迟、FLOPS、IPC信息 + `````` -$# sudo ./hygon_pcm system +$# sudo ./hpt system -ptest + +Start to test memory bandwidth/latency, flop and ipc. It will takes a few minutes ... + + +===Memory Bandwidths=== +Bandwidths are in MB/sec (1 MB/sec = 1,000,000 Bytes/sec) + +Disable hardware prefetch +-------------------------------------------------- + +Using Read-only traffic type. +Numa node 0 1 2 3 + 0 35587.0 19858.4 20864.4 21296.2 + 1 19837.9 35916.9 20811.6 20918.0 + 2 20915.5 20928.5 34694.7 19843.2 + 3 21287.3 20920.7 19812.1 35863.3 + +Using Read:Write=1:1 traffic type. +Numa node 0 1 2 3 + 0 31644.6 25344.3 25297.9 25316.8 + 1 25332.8 31781.4 25293.4 25315.3 + 2 25297.0 25318.8 31633.1 25342.0 + 3 25311.0 25319.5 25332.0 31780.7 + +Using Read:Write=3:1 traffic type. +Numa node 0 1 2 3 + 0 33699.1 22938.7 23660.7 23944.1 + 1 22882.4 33796.2 23652.6 23946.3 + 2 23673.2 23722.7 33531.6 22898.0 + 3 23895.3 23943.2 22863.3 33783.6 + +===Memory Latency=== +Measuring idle latencies (in ns) +Numa node 0 1 2 3 + 0 80.2 140.8 139.5 137.5 + 1 140.6 79.5 139.3 136.4 + 2 139.9 140.0 80.2 140.6 + 3 135.9 135.8 140.3 79.4 + +Measuring loaded latencies +Using all the threads from each core if Hyper-threading is enabled +Using Read-only traffic type +Inject Latency Bandwidth +Delay (ns) MB/sec +========================== + 00000 142.81 140246.4 + 00002 155.51 138922.2 + 00008 131.52 137163.9 + 00015 132.04 139003.9 + 00050 107.49 94638.3 + 00100 105.63 78208.7 + 00200 98.31 56797.1 + 00300 97.41 44564.5 + 00400 96.46 37002.1 + 00500 98.49 31427.3 + 00700 96.09 24314.6 + 01000 95.30 18133.9 + 01300 94.33 14615.3 + 01700 94.19 11580.1 + 02500 86.11 8347.7 + 03500 96.07 6177.1 + 05000 85.87 4649.8 + 09000 94.66 2865.0 + 20000 90.25 1704.2 +-------------------------------------------------- +Enable hardware prefetch +Measuring flop ... + +===Flop Output For All Cores=== +Thread Pool Binding: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 +-------------------------------------------------------------- +| Instruction Set | Core Computation | Peak Performance | +| FMA | FMA(f32,f32,f32) | 636.48 GFLOPS | +| FMA | FMA(f64,f64,f64) | 317.54 GFLOPS | +| AVX | ADD(MUL(f32,f32),f32) | 628.8 GFLOPS | +| AVX | ADD(MUL(f64,f64),f64) | 316.57 GFLOPS | +| SSE | ADD(MUL(f32,f32),f32) | 626.12 GFLOPS | +| SSE2 | ADD(MUL(f64,f64),f64) | 310.02 GFLOPS | +-------------------------------------------------------------- + +===FLop Output For Single Cores=== +Thread Pool Binding: 0 +-------------------------------------------------------------- +| Instruction Set | Core Computation | Peak Performance | +| FMA | FMA(f32,f32,f32) | 23.463 GFLOPS | +| FMA | FMA(f64,f64,f64) | 11.772 GFLOPS | +| AVX | ADD(MUL(f32,f32),f32) | 23.298 GFLOPS | +| AVX | ADD(MUL(f64,f64),f64) | 11.681 GFLOPS | +| SSE | ADD(MUL(f32,f32),f32) | 23.425 GFLOPS | +| SSE2 | ADD(MUL(f64,f64),f64) | 11.662 GFLOPS | +-------------------------------------------------------------- +Measuring IPC ... + +===Insn Per Cycle For Single Core (0)=== +IPC: 2.33 +Measuring IPC ... + +===Insn Per Cycle For All Physical Cores (0-31)=== +IPC: 2.12 +Measuring IPC ... + +===Insn Per Cycle For All Logical Cores (0-63)=== +IPC: 0.88 `````` -运行目录下默认生成system文件,system文件中会按照模块展示收集的信息。 - -#### collect +其评估如下指标: + - 硬件预取关闭下的访存带宽 + - Read-only + - Read:Write = 1:1 + - Read:Write = 3:1 + - 硬件预取关闭下的访存延迟 + - idle latency:使用单core访问内存,适于衡量理想状态下的内存访问延迟,反映了L3缓存未命中后,直接访问主内存的基本延迟 + - loaded latency:在所有CPU核心上生成负载,同时进行内存访问,计算不同带宽负载下延迟的变化 + - 浮点运算性能FLOPS: + - 单core的FLOPS + - 所有core的FLOPS + - IPC (Instructions Per Cycle) + - 单core的IPC + - 所有逻辑core的IPC + - 所有物理core的IPC + +也支持按需测试特定项,例如仅测试`ipc`和`mem-idle-lat`: +``` +sudo ./hpt system -ipc -mem-idle-lat +Disable hardware prefetch +-------------------------------------------------- + +===Memory Latency=== +Measuring idle latencies (in ns) +Numa node 0 1 2 3 + 0 98.2 142.9 140.6 139.7 + 1 154.1 83.7 141.3 141.1 + 2 153.0 140.2 86.3 145.1 + 3 152.0 139.3 144.6 85.5 +-------------------------------------------------- +Enable hardware prefetch +Measuring IPC ... + +===Insn Per Cycle For Single Core (0)=== +IPC: 2.27 +Measuring IPC ... + +===Insn Per Cycle For All Physical Cores (0-31)=== +IPC: 2.09 +Measuring IPC ... + +===Insn Per Cycle For All Logical Cores (0-63)=== +IPC: 0.88 +``` + +### collect +#### 用户参数 @@ -160,37 +462,50 @@ $# sudo ./hygon_pcm system - - + - - + + + + + @@ -201,8 +516,8 @@ $# sudo ./hygon_pcm system
· 指定-cmd或-p时,不支持指定-a参数。 - - + @@ -213,14 +528,17 @@ $# sudo ./hygon_pcm system
· 不能与 -m参数一起使用。 - - + + + - - + @@ -232,1199 +550,1581 @@ $# sudo ./hygon_pcm system - - - - - - + - - - - -
Description
-m <metric> 输入需要采集的metric名称,默认ipc。包括: -
· ipc: 包括CPU利用率, IPC等信息 -
· topdown: Frontend_Bound/Bad_Speculation/Retired/Backend_Bound/Otherthread的占比信息(在SMT场景,同时收集多core的topdown数据,可能会出现负值) -
· topdown-details: Frontend_Bound/Bad_Speculation/Retired/Backend_Bound level 1/2/3的具体指标信息,各个参数的含义可以参考《TOPDOWN_DETAILS_README》文档 -
· fp: 包括浮点指令比例、执行的浮点指令数等指标 -
· l1: L1D, L1I cache 相关指标 -
· l2: L2D , L2I cache相关指标 -
· tlb: TLB相关指标 -
· l3: L3 cache相关公式 -
· di: 跨die访问相关指标 -
· do: 跨die访问相关指标 -
· cm: CPU访问内存的指标 -
· iom: IO访问内存的指标 -
· skt-in: 跨socket访存的带宽指标 -
· skt-out: 跨socket访存的带宽指标 -
· cs0-lat/cs1-lat/cs2-lat/cs3-lat/ccm0-lat/ccm1-lat/ccm2-lat/ccm3-lat/iom0-lat/iom1-lat/iom2-lat/iom3-lat/: 访存延时,配合-node使用 -
· sw-event: PMU软件事件,包括缺页、上下文切换、CPU迁移等指标 +
-m <metric,...> 指定待采集的metric,默认设置为'ipc'。 +
. 可以通过运行hpt collect --metric-list展示支持的所有metric。 +
. 每个metric在不同平台的支持情况,请参考附录A.1章 +
. 每个metric包含的指标具体含义,请参考附录A.2章 +
+
1. 软件指标: +
sw-event: PMU软件事件,包括缺页、上下文切换、CPU迁移等指标 +
+
2. CPU 指标: +
ipc: 包括CPU利用率, IPC等信息 +
fp: 包括浮点指令比例、执行的浮点指令数等指标 +
l1: L1D, L1I cache 相关指标 +
l2: L2D , L2I cache相关指标 +
tlb: TLB相关指标 +
topdown: Frontend_Bound/Bad_Speculation/Retired/Backend_Bound/Otherthread的占比信息(在SMT场景,同时收集多core的topdown数据,可能会出现负值) +
topdown-details: topdown level 1/2/3/4的细分指标信息.由于topdown-details使用的PMC事件较多,为了获得更准确的数据,建议将采集时间设置为10s以上。各个topdown-details指标具体含义,请参考附录A.3章 +
+
3. L3 metric: +
l3: L3 cache相关公式 +
+
4. DF metric: +
di: 跨die访问相关指标 +
do: 跨die访问相关指标 +
cm: cacheable访问内存的指标 +
iom: non-cacheable访问内存的指标 +
mem-bw: 访存带宽相关指标 +
cs0-lat/cs1-lat/cs2-lat/cs3-lat/ccm0-lat/ccm1-lat/ccm2-lat/ccm3-lat/iom0-lat/iom1-lat/iom2-lat/iom3-lat/: 访存延时,配合-die/-cdd/-iod使用

Note: -
· 受DF counter个数限制,每次只能收集一个DF metric指标。 -
· 每个metric在不同平台的支持情况,请参考"各metric在海光平台的兼容性"章节。 +
· 受DF counter个数限制,每次采集只能收集一个DF metric。
-c <core|ccx|node|skt=n> 指定统计某个core/ccx/node/socket的数据。 + --metric-list 展示hpt collect支持的所有metric类型
-c <core|ccx|die|skt=n> 指定统计某个core/ccx/die/socket的数据。

Note:
. n从0开始计数。
· 默认统计所有核的数据。
· 统计L3事件时,不支持指定-c core。 -
· 统计DF事件时,默认会统计整个系统的所有node,因此忽略-c的输入信息。 +
· 统计DF事件时,默认会统计整个系统的所有die,因此忽略-c的输入信息。
· 指定-cmd或-p时,不支持指定-c参数。
-A <sys|skt|node|ccx|core>配合-a/-c使用,指定数据展示的粒度。按照core/ccx/node/socket/system进行展示。 + -A <sys|skt|die|ccx|core>配合-a/-c使用,指定数据展示的粒度。按照core/ccx/die/socket/system进行展示。

Note:
· 指定-cmd或-p时,不支持指定-A参数。
-I指定采样间隔,单位ms,最小50ms。默认采集5次后停止,可以通过-count参数设置采样次数。 + -I <interval>指定采样间隔,单位s,最小0.05s。默认采集5次后停止,可以通过-count参数设置采样次数。

Note:
· 不能与 -d参数一起使用。建议在采集topdown-details功能时,将该参数设置到10000以上。 +
-count <N>和-I参数一起使用,用于指定打印的次数。
-d指定采样时间,单位ms,默认15s。 + -d <duration>指定采样时间,单位s,默认15s。

Note:
· 不能与 -I参数一起使用。
-csv 设置以csv格式输出,如果用户没有指定-o <filename>,则默认存储在当前路径下的data.csv文件中。
-q在输出信息中隐藏cpu拓扑信息。
-p <pid> 指定进程pid。

Note: +
· 不能与L3和DF相关的metric一起使用。
· 不能与 -cmd参数一起使用。
. 不能与-a/-c/-A参数一起使用。
-node指定统计访问某个numa节点内存时的时延。 + -die <die id>指定统计访问某个DIE节点内存时的时延。

Note:
· 只能和cs0-lat/ccm0-lat等时延类metric一起使用。和其他metric一起使用时将被忽略。
-count <N>和-I参数一起使用,用于指定打印的次数。
-cmd <command line>指定运行的程序。 + 统计指定命令运行时间内的性能数据。

Note:
. 不能与-a/-c/-A参数一起使用。
-##### metric 介绍 -###### 各metric在海光平台的兼容性 -'Y'代表该metric可以在此平台上使用,'N'表示该metric不可以在此平台上使用。 +#### collect示例 +- 收集3s内,CPU DIE 0的ipc, l1,l2,l3 cache的访问情况,并按ccx的粒度展示。 +`````` +$# sudo ./hpt collect -m ipc,l1,l2,l3 -c die=0 -A ccx -d 3 + `````` + - 每隔1s收集全系统的访存流量,收集2次,并按CPU DIE的粒度展示。 +`````` +$# sudo ./hpt collect -m mem-bw -a -I 1 -count 2 -A die +`````` + - 收集5s内,各个DIE CCX0和CCX1的CPU 访问DIE 1内存的时延 +`````` +$# sudo ./hpt collect -m ccm0-lat -die 1 -d 5 +$# sudo ./hpt collect -m ccm1-lat -die 1 -d 5 +`````` + - 收集hygonstress运行过程中的ipc和topdown。 +`````` +$# sudo ./hpt collect -m ipc,topdown -cmd "hygonstress_0.1.8 -m 4 -t 2" +`````` + - 采集5s内整个系统的topdown-details指标,并将数据存到log文件中 +`````` +$# sudo ./hpt collect -m topdown-details -d 5 -o log +`````` + +### process + + +#### 用户参数 - - - - - - + + - - - - - - + + - + + - + + - + + - + + - + + - + + - - - - - - + + - - - - - - + + - + + - - - - - + + +
PMU unitmetric海光一号海光二号海光三号海光四号OptionDescription
COREipcYYYY-I <interval>指定采样间隔,默认每隔1s采集一次数据,可以使用-count指定输出次数。 +

Note: +
· 默认收集系统所有进程的资源使用情况。
fp-count <count>指定采样次数,默认采集5次。使用时必须配合-I使用。
topdown-cpu 指定收集CPU利用率相关参数。如果不指定-cpu/-mem/-io/-switch,默认收集cpu资源信息。
topdown-details-mem 指定收集内存相关参数。
l1-io 指定收集存储IO相关参数。
l2-switch 指定收集上下文切换相关参数。
tlb-syscall 指定收集系统调用执行情况。 +

Note: +
· 只有指定pid或指定-cmd时可以使用。 +
· interval * count时间后,展示系统调用执行情况。 +
· 系统调用频繁的程序,使用-syscall会影响性能。
L3l3YYYY-p <pid1,pid2,pid3...> 指定收集系统调用执行情况。 +

Note: +
· 统计指定pid进程的CPU/内存/存储IO的资源使用情况。 +
· 若指定pid进程的运行时间小于interval,则无法收集到CPU/内存/存储IO的资源使用情况数据。 +
· 若指定pid进程的运行时间小于interval * count,则进程运行结束后,停止采样。
DFdiYYY仅支持海光749x产品-cmd <command> 统计指定命令进程的CPU/内存/存储IO的资源使用情况。 +

Note: +
·要求cmd是一个单进程应用,否则hpt只能统计到父进程的资源使用情况和syscall执行情况。 +
· 若cmd的运行时间小于interval,则无法收集到CPU/内存/存储IO的资源使用情况数据。 +
· 若cmd的运行时间小于interval * count,则cmd运行结束后,停止采样。
do-warmup <warmup_time>warmup_time时间后,再开始采集数据。单位s
skt-inNNNY-o <filename>指定输出文件名称,默认存储到当前路径下。
+ +#### 输出指标解释 + - + + + - - - - - + + + - + + - - - - - + + - + + - - - - - + + - - + + - - - - - + + - + + - - - - - + + - + + + + + + + + + + + + + + + + + + - - - - - + + + - - - - - + + - + + - + + - - - + + + + + + + +
skt-outOptionParameterDescription
cmYYYY-cpuUID任务的user id。
iomPID任务的process id。
cs0-latYYYY%usr任务在用户态执行时的CPU使用率(百分比)。
cs1-lat%system任务在内核态执行时的CPU使用率(百分比)。
cs2-latNNNY%guest任务在虚拟机中执行时的CPU使用率(百分比)。
cs3-lat仅支持海光748x产品%wait任务在处于等待状态时的CPU使用率(百分比)。
ccm0-lat YYYY%CPU任务的总CPU使用率(百分比)。
ccm1-latCPU任务所在的CPU id。
ccm2-latNNNYCommand任务名称。
ccm3-lat-memminflt/s每秒次缺页错误次数(minor page faults),这些缺页错误不需要从磁盘加载内存页。
majflt/s每秒主缺页错误次数(major page faults),这些缺页错误需要从磁盘加载内存页。
VSZVirtual Size, 任务的虚拟内存使用量,单位是kB。
RSSResident Set Size, 任务的长期内存使用量,单位是kB。
%MEM任务的内存使用率(百分比)。
iom0-latYYYY-iokB_rd/s任务每秒从磁盘读取的数据量,单位是kB。
iom1-latNNNYkB_wr/s任务每秒向磁盘写入的数据量,单位是kB。
iom2-latkB_ccwr/s任务每秒取消向磁盘写入的数据量,单位是kB。
iom3-latiodelayBlock I/O延迟,单位是时钟周期。
software-eventsw-event和OS版本相关,要求OS版本高于Linux 2.6-switchcswch/s任务每秒进行自愿上下文切换的次数。
nvcswch/s任务每秒进行非自愿上下文切换的次数。
-###### metric含义介绍 +#### process 示例 + + - 收集hygonstress程序执行过程中占用CPU资源、内存资源和系统调用执行情况,每隔1s收集一次,收集2次。 + `````` + $# sudo ./hpt process -cpu -mem -I 1 -syscall -count 2 -cmd "taskset -c 0 ./hygonstress_0.1 -m 4" + `````` + +### network +#### 用户参数 + - - - + + - - - + + - - + + +
metrictargetdescriptionOptionDescription
ipccpu-freq采集过程中cpu平均频率 -i <interface> 指定需要监控的网口名称。
retired-insnretired指令数-o <filename> 指定输出文件名称,默认存储到当前路径下。
+ +#### 输出指标解释 + - - + + - - + + - - + + - - - + + - - + + - - + + +
IPCInstructions Per Cycle (IPC),指的是平均每个CPU cycle完成指令数OptionDescription
branch-miss-ratio分支预测错误的跳转指令在retired跳转指令中的占比Receive/Transmit Total 网口收包总和。
branch-mpkibranch miss per kilo instructions.平均每一千条指令中分支预测错误的跳转指令数Receive/Transmit Type 将报文按照多播/广播/单播的统计划分。
fpMMX-ratioretired MMX指令在retired指令中的占比Receive/Transmit Packet/Bytes 具体队列的收发包统计。统计的时间窗口与具体的驱动和硬件实现相关,例如在driver加载/端口up后开始统计。
SSE-ratioretired SSE指令在retired指令中的占比 Hard Interrupt 自系统启动以来硬中断统计次数,例如281下的CPU24(7)代表CPU24上发生了7次和网络相关的硬中断,硬中断号为281。
x87-ratioretired x87指令在retired指令中的占比Soft Interrupt 自系统启动依赖的软中断统计次数,例如NET_TX下的CPU0(6)代表CPU0下发生了6次NET_TX软中断。
+ +#### network示例 +- 收集执行interface的详细信息。 +`````` +$# ./hpt network -i enp51s0f1 +`````` +执行完对应命令后会进入窗口模式,在窗口模式下,使用上下键翻页,右键刷新数据,q键退出。 +可以使用-o filepath将输出导入指定文件,此时不会进入窗口模式,文件写入后程序自动返回。 +输出展示如下: +`````` +Receive Total: + rx_bytes=10216554 +Transmit Total: + tx_bytes=13607793 +Receive Type: + rx_broadcast=20609 + rx_multicast=24688 +Transmit Type: + tx_broadcast=20610 + tx_multicast=64437 +Receive Packet: + rx_queue_0_packets=6755188 + rx_queue_1_packets=1489045 +Receive Bytes: + rx_queue_0_bytes=1077614389 + rx_queue_1_bytes=408728463 +Transmit Packet: + tx_queue_0_packets=1333137 + tx_queue_1_packets=5517637 +Transmit Bytes: + tx_queue_0_bytes=446564691 + tx_queue_1_bytes=5327179951 +Hard Interrupt: + 280: + 281: + CPU24(7) CPU29(945450) CPU30(250756) + 282: + CPU24(250756) CPU25(7) CPU28(945450) + 283: + CPU26(7) CPU27(1196206) +Soft Interrupt: + NET_TX: + CPU0(6) CPU1(8) CPU2(2) CPU5(2) CPU7(2) + NET_RX: + CPU0(265377) CPU1(306373) CPU2(287008) CPU3(319431) CPU4(524558) + CPU5(554005) CPU6(499649) CPU7(561335) CPU8(580138) CPU9(644429) + CPU10(226196) CPU11(148069) CPU12(77042) CPU13(239676) CPU14(92738) +`````` + +### java +#### 用户参数 + + - - + + - - - + + + + + + + + + + + + + + + +
fp-ratioretired 浮点指令在retired指令中的占比OptionDescription
topdownfrontend-bound由于前端没有提供足够的指令数引起的pipeline stall的占比-d <JAVA_HOME>指定JAVA_HOME的路径。 +

Note: +
如果不指定JAVA_HOME的话,会默认使用系统的JAVA_HOME。 +
-p <PID>统计指定进程的信息。
-c <COMMAND>指定要采集功能的命令,多个命令用;分隔开。 +

以下列举常用的cmd: +
· dashboard - 当前系统的实时数据面板,包含GC信息。 +
· jvm - 查看当前JVM的信息。 +
· thread - 查看当前JVM的线程堆栈信息。 +
· memory - 查看JVM的内存信息。 +
· profiler start - 开始采集应用热点。 +
· profiler stop - 结束采集应用热点,默认生成CPU的火焰图,必须与profiler start搭配使用。 +

Note: +
如果使用profiler start/profiler stop: +
1. 要求系统参数perf_event_paranoid<=2,可以通过"sysctl kernel.perf_event_paranoid=2"修改。 +
2. 如果采集时间太短,可能会没有数据,可适当拉长采集时间。 +
-s <SELECT>通过类名或JAR文件名选择目标进程。
+ +#### java示例 +- 查看指定进程的堆栈使用情况和内存使用信息。 +如果没有指定java_home路径的话,默认使用系统的java。 +`````` +$# sudo ./hpt java -p 88805 -c "thread;memory" +Arthas script version: 3.7.1 +[INFO] JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64 +Arthas home: ~/hygon-tuner/hygon_tuner_tools/bin/third_party/arthas +Calculating attach execution time... +Attaching to 88805 using version ~/hygon-tuner/hygon_tuner_tools/bin/third_party/arthas... + +real 0m9.385s +user 0m2.495s +sys 0m0.238s +Attach success. + ,---. ,------. ,--------.,--. ,--. ,---. ,---. + / O \ | .--. ''--. .--'| '--' | / O \ ' .-' +| .-. || '--'.' | | | .--. || .-. |`. `-. +| | | || |\ \ | | | | | || | | |.-' | +`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' + +wiki https://arthas.aliyun.com/doc +tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html +version 3.7.1 +main_class +pid 88805 +time 2024-05-21 17:11:55 + +[arthas@88805]$ thread | plaintext +Threads Total: 17, NEW: 0, RUNNABLE: 9, BLOCKED: 0, WAITING: 3, TIMED_WAITING: 5 +, TERMINATED: 0 +ID NAME GROUP PRIORI STATE %CPU DELTA_ TIME INTER DAEMON +41 arthas-command-exec system 5 RUNNAB 0.74 0.001 0:0.01 false true +1 main main 5 TIMED_ 0.2 0.000 0:0.09 false false +2 Reference Handler system 10 RUNNAB 0.0 0.000 0:0.00 false true +3 Finalizer system 8 WAITIN 0.0 0.000 0:0.00 false true +4 Signal Dispatcher system 9 RUNNAB 0.0 0.000 0:0.00 false true +26 Notification Thread system 9 RUNNAB 0.0 0.000 0:0.00 false true +28 Attach Listener system 9 RUNNAB 0.0 0.000 0:0.06 false true +30 arthas-timer system 9 WAITIN 0.0 0.000 0:0.00 false true +33 arthas-NettyHttpTel system 5 RUNNAB 0.0 0.000 0:0.04 false true +34 arthas-NettyWebsock system 5 RUNNAB 0.0 0.000 0:0.00 false true +35 arthas-NettyWebsock system 5 RUNNAB 0.0 0.000 0:0.00 false true +36 arthas-shell-server system 9 TIMED_ 0.0 0.000 0:0.00 false true +37 arthas-session-mana system 9 TIMED_ 0.0 0.000 0:0.00 false true +38 arthas-UserStat system 9 WAITIN 0.0 0.000 0:0.00 false true +40 arthas-NettyHttpTel system 5 RUNNAB 0.0 0.000 0:0.16 false true +27 Common-Cleaner Innocuous 8 TIMED_ 0.0 0.000 0:0.00 false true +32 Keep-Alive-Timer Innocuous 8 TIMED_ 0.0 0.000 0:0.00 false true + +[arthas@88805]$ memory | plaintext +Memory used total max usage +heap 95M 2080M 30688M 0.31% +g1_eden_space 80M 112M -1 71.43% +g1_old_gen 15M 1968M 30688M 0.05% +g1_survivor_space 0K 0K -1 0.00% +nonheap 28M 31M -1 90.79% +codeheap_'non-nmethods' 2M 2M 8M 27.57% +metaspace 18M 19M -1 98.42% +codeheap_'profiled_nmethods' 4M 4M 115M 3.72% +compressed_class_space 2M 2M 1024M 0.22% +codeheap_'non-profiled_nmethods' 626K 2496K 118592K 0.53% +mapped 0K 0K - 0.00% +direct 4M 4M - 100.00% +mapped - 'non-volatile memory' 0K 0K - 0.00% +[arthas@88805]$ +$ +`````` +- 如果没有指定java pid,屏幕会给出选择指定哪个java进程,需要输入对应编号。 +如果没有指定要采集的功能,可以在进入交互后再输入命令。 +`````` +$# sudo ./hpt java +Arthas script version: 3.7.1 +[INFO] JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64 +Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. +* [1]: 123060 -- process information unavailable + [2]: 25932 ./math-game.jar + [3]: 123053 -- process information unavailable +2 +Arthas home: ~/hygon-tuner/hygon_tuner_tools/bin/third_party/arthas +Calculating attach execution time... +Attaching to 25932 using version ~/hygon-tuner/hygon_tuner_tools/bin/third_party/arthas... + +real 0m1.546s +user 0m0.514s +sys 0m0.058s +Attach success. +telnet connecting to arthas server... current timestamp is 1716295750 +Trying 127.0.0.1... +Connected to 127.0.0.1. +Escape character is '^]'. + ,---. ,------. ,--------.,--. ,--. ,---. ,---. + / O \ | .--. ''--. .--'| '--' | / O \ ' .-' +| .-. || '--'.' | | | .--. || .-. |`. `-. +| | | || |\ \ | | | | | || | | |.-' | +`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' + +wiki https://arthas.aliyun.com/doc +tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html +version 3.7.1 +main_class +pid 25932 +time 2024-05-21 20:49:10 + +[arthas@25932]$ memory +Memory used total max usage +heap 79M 2080M 30688M 0.26% +g1_eden_space 64M 112M -1 57.14% +g1_old_gen 15M 1968M 30688M 0.05% +g1_survivor_space 0K 0K -1 0.00% +nonheap 26M 31M -1 84.61% +codeheap_'non-nmethods' 1M 4M 8M 14.46% +metaspace 18M 18M -1 99.07% +codeheap_'profiled_nmethods' 4M 4M 115M 3.67% +compressed_class_space 2M 2M 1024M 0.22% +codeheap_'non-profiled_nmethods' 629K 2496K 118592K 0.53% +mapped 0K 0K - 0.00% +direct 4M 4M - 100.00% +mapped - 'non-volatile memory' 0K 0K - 0.00% +[arthas@25932]$ stop +Resetting all enhanced classes ... +Affect(class count: 0 , method count: 0) cost in 29 ms, listenerId: 0 +Arthas Server is going to shutdown... +[arthas@25932]$ session (6b824c1c-4c54-4163-b2f0-cc5544359e24) is closed because server is going to shutdown. +Connection closed by foreign host. +`````` + +### sched + + +#### 使用约束 +- 要求内核版本高于4.7 +- 要求内核config:CONFIG_SCHEDSTATS=y + +#### 用户参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionDescription
-latency 统计全系统所有进程或指定进程的调度时延数据。
-flame 绘制系统冷火焰图(off-cpu火焰图),输出svg文件,默认输出文件名是offcpu.svg。 +

Note: +
· -flame与-p不能同时使用。 +
· -flame与-cmd不能同时使用。
-d <duration>收集指定时间内,系统的调度信息,单位s,默认15s。
-s <show>指定latency数据展示的方式,默认-s 0,表示按command粒度展示数据,-s 1表示按pid粒度展示数据,-s 2表示按tid粒度展示数据。
-p <pid>hpt收集指定pid对应的进程的调度信息,可以指定多个进程,进程pid之间用逗号分开。 +

Note: +
· -p与-cmd不能同时使用。 +
· -p与-flame不能同时使用。 +
-warmup <warmup_time>warmup_time时间后,再开始采集数据,单位s。
-cmd <command> 统计指定命令运行时间内,全系统所有进程/线程的调度信息。 +

Note: +
· -cmd与-p不能同时使用。 +
· -cmd与-flame不能同时使用。 +
-o <filename>将收集到的进程latency解析结果或冷火焰图存储到当前路径下的filename文件中,冷火焰图的命名为<filename>.svg。
+ +#### 输出信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescription
pid/tid 展示对应的进程ID/线程ID。
command 展示对应的进程/线程名称。
on-cpu 展示对应的进程/线程在CPU上运行的总时长,单位ms。
wait 展示对应的进程/线程因为等待某些资源(例如锁、信号量、I/O操作),而没有被调度到CPU上的时间,单位ms。
blocked 展示对应的进程/线程处于阻塞状态的时长,单位ms。
sleep 展示对应的进程/线程处于休眠状态的时长,单位ms。
switch 展示对应的进程/线程发生调度的总次数。
delay 展示对应的进程/线程总调度时延,单位ms。
avg-delay 展示对应的进程/线程平均调度时延,单位ms。
cpu-migration 展示对应的进程/线程发生CPU切换的次数。
die-migration 展示对应的进程/线程在die间切换的次数。
+ +#### sched 示例 + +- 收集1s内系统中的调度时延信息 +`````` +$# sudo ./hpt sched -d 1 +`````` + + - 收集hygonstress执行过程中,系统中进程调度时延信息,并按线程展示。 +`````` +$# sudo ./hpt sched -cmd "taskset -c 0-4 hygonstress_0.1.8 -m 4 -t 1" -s 2 +`````` + - 收集1s内指定进程调度时延信息,并按pid展示。 +`````` +$# sudo ./hpt sched -d 1 -p 495017 -s 1 +`````` + - 绘制1s内,系统的off-cpu火焰图。 + `````` +$# sudo ./hpt sched -d 1 -flame +$# ls +bin hpt offcpu.svg set_env.sh +`````` + +### hotspot + + +#### 用户参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - - - + + - - + + - - + + +
OptionDescription
-u 本次采样只收集用户态进程的热点函数。 +

Note: +
· 默认收集内核态和用户态进程的热点函数。
-k 本次采样只收集内核态进程的热点函数。 +

Note: +
· 默认收集内核态和用户态进程的热点函数。
-f <frequency> 设置采样频率,默认每秒采集4000次。 +
-c <core> 设置采样的CPU list,支持同时采集多个CPU。默认采集整个系统的全部CPU。 +

Note: +
· -c与-cmd / -p / -t 参数不能同时使用。 +
-a 设置采集整个系统的热点函数,默认配置为-a。
-g 收集采样的调用栈。
-e <event name> 设置采样的事件。支持的event list如下: +
·cycles:基于cycles事件采样,收集程序中的热点函数 +
·cycles:p:基于IBS精准采样,收集程序中的热点函数 +
·insn:基于retired instruction事件采样 +
·insn:p:基于IBS精准采样,收集程序中retired instruction事件采样 +
·mem-access:分析远近端访存的热点函数 +
·cache: 基于icache/dcache access和icache/dcache miss的热点函数 +

Note: +
· 默认采集cycles事件。
bad-speculation由于分支预测错误引起的pipeline stall的占比-flame 绘制系统火焰图(on-cpu火焰图),输出svg文件,默认输出文件名是oncpu.svg。 +

Note: +
· -flame必须与-g同时使用。
retiredretired upos占比-d <duration>收集指定时间内,系统的热点函数信息,单位s,默认15s。
backend-bound后端引起的pipeline stall的占比-p <pid>收集指定pid对应的进程的热点函数信息,只能指定单个进程。 +

Note: +
· -p与-cmd / -t / -c参数不能同时使用。 +
other-thread由于逻辑核资源竞争引起的pipeline stall的占比-t <tid>收集指定tid对应的线程的热点函数信息,只能指定单个线程。 +

Note: +
· -t与-cmd / -p/ -c参数不能同时使用。 +
l1l1-icache-accessL1 Icache access次数-warmup <warmup_time>warmup_time时间后,再开始采集数据,单位s。
l1-icache-miss-ratioL1 Icache miss率-cmd <command> 统计指定命令运行时间内,全系统所有进程/线程的热点信息。 +

Note: +
· -cmd与-c / -p / -t参数不能同时使用。 +
l1-icache-mpkiL1 Icache miss per kilo instructions.平均每一千条指令中L1 Icache miss次数 -o <filename>将收集到的热点函数信息或火焰图存储到当前路径下的filename文件中,火焰图的命名为<filename>.svg。
+ +#### hotspot 示例 + - 收集1s内CPU2,CPU3,CPU4,CPU7的热点函数信息。 +`````` +$# sudo ./hpt hotspot -d 1 -c 2-4,7 +`````` + + - 收集运行hygonstress过程中的热点函数信息。 +`````` +$# sudo ./hpt hotspot -cmd "taskset -c 1 hygonstress_0.1.8 -m 4 -t 2" +`````` + + - 收集运行hygonstress过程中基于cache的热点函数信息 +`````` +$# sudo ./hpt hotspot -cmd "taskset -c 1 hygonstress_0.1.8 -m 4 -t 2" -e cache +`````` + +### mem + + +#### 用户参数 + - - + + - - + + - - + + - - + + - - + + - - - + + - - + + - - + + - - + + - - + + +
l1-icache-bwL1 Icache 访问带宽OptionDescription
l1-dcache-accessL1 Dcache access次数-l 展示系统的内存配置信息,包括系统上可用的NUMA节点数、各NUMA间的距离、各个NUMA节点的总内存大小、各个NUMA节点的可用内存大小。 +

Note: +
· 参数-l优先级最高,当与其他参数混用时,会忽略其他参数,仅展示系统的内存配置信息。 +
l1-dcache-miss-ratioL1 Dcache miss率-p <pid>收集指定pid对应进程的访存信息,只能指定单个进程。 +

Note: +
· -p与-cmd不能同时使用。 +
l1-dcache-mpkiL1 Dcache miss per kilo instructions.平均每一千条指令中L1 Dcache miss次数 -v 展示每个进程中,各DIE CPU的访存情况。
l1-dcache-bwL1 Dcache 访问带宽-vv 分析指定进程中访问内存行为的细节信息,如:各DIE CPU访问具体各DIE 内存的次数。

Note: +
· -vv必须与-p同时使用。 +
· -vv只能在开IBS的平台使用。 +
l2l2-icache-accessL2 Icache access次数-c2c 分析指定进程中发生伪共享的细节信息。 +

Note: +
· -c2c必须与-p同时使用。 +
· -c2c只能在开IBS的平台使用。 +
l2-icache-miss-ratioL2 Icache miss率-n <num>设置hpt mem最多展示num个进程的访存情况,默认值为20。
l2-icache-mpkiL2 Icache miss per kilo instructions.平均每一千条指令中L2 Icache miss次数 -d <duration>收集指定时间内进程的访存信息,单位s,默认15s。
l2-icache-bwL2 Icache 访问带宽-cmd <command> 统计指定命令运行时间内,全系统所有进程的访存信息。 +

Note: +
· -cmd与-p参数不能同时使用。 +
l2-dcache-accessL2 Dcache access次数-o <filename>将收集到的访存信息存储到当前路径下的filename文件中。
+ +#### 输出指标解释 + - - + + + - - + + + - - + + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
l2-dcache-miss-ratioL2 Dcache miss率OptionParameterDescription
l2-dcache-mpkiL2 Dcache miss per kilo instructions.平均每一千条指令中L2 Dcache miss次数 -vRMA(K)进程发生跨DIE访存的次数,单位是K。
l2-dcache-bwL2 Dcache 访问带宽LMA(K)进程发生本DIE访存的次数,单位是K。
tlbl1-itlb-miss-ratioL1 ITLB miss率RMA/LMA进程发生跨DIE访存次数和本节点访存次数的比例。
l2-itlb-miss-ratioL2 ITLB miss率-vvmemory access采样过程中收集到的进程发生访存的次数。
remote access采样过程中收集到的进程发生跨DIE访存的次数。
进程访存信息矩阵矩阵的行描述进程访问的地址所在的DIE,列描述进程运行所在的DIE。
-c2ccacheline addr发生伪共享访问的cacheline地址。
cacheline offset发生伪共享访问的地址在cacheline中的偏移。
load & store本次采样过程中,CPU 读写内存的次数。
load hitm本次采样过程中,CPU 访问处于Modified状态的cacheline的次数。
+ +#### mem 示例 + - 展示系统的内存配置信息。 +`````` +$# sudo ./hpt mem -l + +Node Memory(MB): + Node0 Node1 Node2 Node3 Node4 Node5 Node6 Node7 +----- ------- ------- ------- ------- ------- ------- ------- ------- +Total 64323 64507 64507 64507 64459 64507 64507 64501 +Free 63855 63813 60788 64016 63169 62718 63550 61786 + +Node Distance: + Node0 Node1 Node2 Node3 Node4 Node5 Node6 Node7 +----- ------- ------- ------- ------- ------- ------- ------- ------- +Node0 10 16 16 16 28 28 22 28 +Node1 16 10 16 16 28 28 28 22 +Node2 16 16 10 16 22 28 28 28 +Node3 16 16 16 10 28 22 28 28 +Node4 28 28 22 28 10 16 16 16 +Node5 28 28 28 22 16 10 16 16 +Node6 22 28 28 28 16 16 10 16 +Node7 28 22 28 28 16 16 16 10 +`````` +- 运行背景业务numactl -C 0-7 -m 1 ./bw_mem -P 8 1024m rd,同时收集15s内系统中各个进程的访存信息。 +`````` +$# sudo ./hpt mem + +Start data collection... +Data collection completed + PID COMMAND RMA(K) LMA(K) RMA/LMA +------ --------------- -------- -------- --------- +643640 bw_mem 7.528 0.045 167.289 +643646 bw_mem 7.528 0.042 179.238 +643644 bw_mem 7.528 0.048 156.833 +643642 bw_mem 7.528 0.044 171.091 +643643 bw_mem 7.528 0.044 171.091 +643645 bw_mem 7.528 0.042 179.238 +643647 bw_mem 7.528 0.045 167.289 +643641 bw_mem 7.528 0.047 160.170 + 0 swapper 0.006 0.005 0.000 + 15 rcu_sched 0.003 0.001 0.000 +559422 kworker/65:0-ev 0.002 0.000 0.000 + 2595 irqbalance 0.002 0.000 0.000 +640783 tokio-runtime-w 0.002 0.000 0.000 +643746 perf 0.002 0.002 0.000 + 801 kcompactd3 0.001 0.000 0.000 + 1553 usb-storage 0.001 0.000 0.000 +642669 kworker/u263:0- 0.001 0.000 0.000 +433066 kworker/81:1-mm 0.001 0.000 0.000 +640386 kworker/25:0-ev 0.001 0.000 0.000 +642813 kworker/u261:1- 0.001 0.000 0.000 +`````` + - 运行背景业务numactl -C 0-7 -m 1 ./bw_mem -P 8 1024m rd,同时收集15s内系统中各个进程的访存信息,包括进程中各个DIE CPU的访存情况。 +`````` +$# sudo ./hpt mem -v + +Start data collection... +Data collection completed +PID COMMAND DIE RMA(K) LMA(K) RMA/LMA +------ --------------- ------ -------- -------- --------- +643929 bw_mem 0 7.534 0.042 179.381 + 1 0.000 0.000 0.000 + 2 0.000 0.000 0.000 + 3 0.000 0.000 0.000 + 4 0.000 0.000 0.000 + 5 0.000 0.000 0.000 + 6 0.000 0.000 0.000 + 7 0.000 0.000 0.000 +643925 bw_mem 0 7.532 0.047 160.255 + 1 0.000 0.000 0.000 + 2 0.000 0.000 0.000 + 3 0.000 0.000 0.000 + 4 0.000 0.000 0.000 + 5 0.000 0.000 0.000 + 6 0.000 0.000 0.000 + 7 0.000 0.000 0.000 +643923 bw_mem 0 7.528 0.047 160.170 + 1 0.000 0.000 0.000 + 2 0.000 0.000 0.000 + 3 0.000 0.000 0.000 + 4 0.000 0.000 0.000 + 5 0.000 0.000 0.000 + 6 0.000 0.000 0.000 + 7 0.000 0.000 0.000 +643927 bw_mem 0 7.528 0.051 147.608 + 1 0.000 0.000 0.000 + 2 0.000 0.000 0.000 + 3 0.000 0.000 0.000 + 4 0.000 0.000 0.000 + 5 0.000 0.000 0.000 + 6 0.000 0.000 0.000 + 7 0.000 0.000 0.000 +`````` + - 展示2s内指定进程的发生伪共享的情况。 +`````` +$# sudo ./hpt mem -d 2 -c2c -p 114030 + +Start data collection... +Data collection completed + cacheline addr cacheline offset load & store load load hitm store function dso +---------------- ------------------ -------------- ------ ----------- ------- -------------------- ---------- + 0x601040 0x8 2487 0 0 2487 thread_function+0x2c test-c2c + 0x601040 0x8 1280 1280 2 0 thread_function+0x23 test-c2c + 0x601040 0xc 4776 4776 7 0 thread_function+0x34 test-c2c + 0x601040 0xc 2334 0 0 2334 thread_function+0x3d test-c2c +`````` + +### roofline + + +roofline功能适用于Fortan,C,C++,OPenMP场景。 + +#### 用户参数 + - - + + - - + + - - - + + - - + + - - + + - - - + + - - - + + - - - + + - - - + + +
l1-dtlb-miss-ratioL1 DTLB miss率OptionDescription
l2-dtlb-miss-ratioL1 DTLB miss率-record <mode>选择数据采样模式,支持两种采集模式:survey(热点分析)或 tripcounts(详细分析)。 +

Note: +
. 做roofline分析时,需要先进行survey分析,再进行tripcounts分析,最后绘制roofline图。 +
. 进行survey分析时,生成的数据默认存放在当前路径下的roofline_<主机名>_<date>目录中。 +
·进行tripcounts分析时,必须通过-dir参数指定survey模式的输出目录,提供热点函数等信息。 +
l3l3-cache-accessL3 cache access次数-report绘制roofline图(执行完采样后使用)。 +

Note: +
· 绘制roofline图时,必须通过-dir参数指定采集数据的存放目录。 +
l3-cache-missL3 cache miss次数 -dir <project_dir>指定采集的数据存放目录。默认格式为:roofline_<主机名>_<date>。
l3-cache-miss-ratioL3 cache miss率-freq <frequency>指定CPU的主频(GHz),如2.6表示 2.6GHz,用于计算理论GFLOPs峰值性能。默认为CPU基础频率。
didie in bandwidth每个Die的内存被跨Die访问的带宽-stream <stream>输入STREAM测试的带宽值(GB/s),用于确定 Roofline 图中的带宽限制线。默认为系统的理论DRAM带宽值。
dodie out bandwidth每个Die的CPU或IO跨Die访问其他节点内存的带宽-d <duration>指定survey分析运行时长,单位为秒(s)。适用于运行时间较长的程序控制采样窗口。 +

Note: +
· -d与tripcounts同时使用时,-d参数会被忽略。 +
skt-insocket in bandwidth统计内存被跨socket访问的带宽-func_list <function_names>输入用户关注的函数列表,多个函数名使用逗号分隔。例如:-func_list "foo,bar,baz"。
skt-outsocket out bandwidth统计访问跨socket内存的带宽-cmd <command> 指定被采集应用的完整运行命令。例如:-cmd "./testcase arg1 arg2"。
+ +#### roofline图解读 + +roofline图是一个以对数坐标系绘制的二维图,通常包括以下部分: +- X 轴:计算强度(Arithmetic Intensity)单位为 FLOP/Byte,表示每访问1字节DRAM数据,对应进行的浮点计算次数。 +- Y 轴:性能(Performance)单位为 GFLOPs,表示程序的实际浮点运算速率。 +- 斜线(带宽上限):斜率为系统DRAM 带宽,。 +- 水平线(计算能力上限):表示系统的峰值计算能力(理论最大GFLOPs),是系统每秒钟所最多能完成的浮点运算数。 +- 数据点:表示函数在实际运行时的性能表现。鼠标悬停在数据点上方可以看到函数的详细信息。详细信息如下: +  - DRAM Arithmetic Intensity: 平均DRAM计算强度。每访问1字节DRAM数据,对应进行的浮点计算次数。 +  - Performance: 函数的实际浮点运算速率。 +  - Function Time: 函数的实际执行时间。 +  - Time Ratio: 函数占总执行时间的比例。 +  - SSE Ratio: 函数中SSE指令占函数中所有指令的比例。 +  - AVX2 Ratio: 函数中AVX2指令占函数中所有指令的比例。 +  - AVX512 Ratio: 函数中AVX512指令占函数中所有指令的比例。 + + +#### 信息解读 +分析数据点在图中的位置所代表的含义。 + - - - + + - + + - + + - - - + + + +
cmCS_RDBLK每个Die的内存被cacheable 读操作访问的带宽图中位置含义
CS_VICBLKFULL - 每个Die的内存被cacheable 写操作访问的带宽靠近斜线函数受内存带宽限制。可以考虑提高数据重用,改善缓存命中率,减小DRAM访存带宽
TOTAL-BW - 每个Die的内存被cacheable访问的总带宽靠近水平线程序已接近理论峰值,优化空间有限,可关注矢量化、流水线调度。
iomCS_RDSZCPU读non-cacheable属性内存,或CPU读IO设备地址空间的次数远低于屋顶程序存在较大性能优化空间。
+ +#### roofline示例 +##### survey分析 +执行以下命令进行第一轮survey分析,收集程序的热点函数等信息,生成二进制原始数据文件。若没有`-dir`指定输出目录,将在当前目录下自动创建一个以roofline__命名的文件夹。 +```bash +sudo ./hpt roofline -record survey -cmd "$COMMAND" +``` +生成的目录结构说明: +``` +roofline_20250605 +`-- raw_data + |-- system_info.data + | # 保存系统的DRAM带宽、算力峰值等信息 + `-- hotspot_survey.data + # 保存survey分析中查询到的热点函数等信息 +``` +##### tripcounts分析 +执行以下命令进行第二轮tripcounts分析,收集热点函数对应的算力信息,生成二进制原始数据文件。 +```bash +sudo ./hpt roofline -record tripcounts -cmd "$COMMAND" -dir roofline_20250605 +``` +生成的目录结构说明: +``` +roofline_20250605 +`-- raw_data + |-- system_info.data + | # 保存系统的DRAM带宽、算力峰值等信息 + |-- hotspot_survey.data + | # 保存survey分析中查询到的热点函数等信息 + `-- hotspot_tripcounts.data + # 保存tripcounts分析中查询到的热点函数算力信息 +``` +##### 绘制roofline图 +执行以下命令,绘制roofline图。 +```bash +sudo ./hpt roofline -report -dir roofline_20250605 +``` +生成的目录结构说明: +``` +roofline_20250605 +|-- raw_data +| |-- system_info.data +| | # 保存系统的DRAM带宽、算力峰值等信息 +| |-- hotspot_survey.data +| | # 保存survey分析中查询到的热点函数等信息 +| `-- hotspot_tripcounts.data +| # 保存tripcounts分析中查询到的热点函数算力信息 +`-- report + `-- roofline.svg + # 绘制的roofline图 +``` + +# 附录 +## A. metric相关介绍 +### A.1 metrics在各平台的兼容情况 +* 'Y'代表该metric可以在此平台上使用,'N'表示该metric不可以在此平台上使用。 + + + + + + + + - - + + + + + + - - + - - + - - - + - - + - - + - - + - - - + + + + + + - - + + + + + + - - + - - - + + + + + - - + - - + + + + + - - - + - - + + + + + - - + + - - + + + + + -
PMU unitmetric海光1号海光2号C86-3GC86-4G
CS_WRSZCPU写non-cacheable属性内存,或CPU写IO设备地址空间的次数COREipcYYYY
TOTAL_BW_MAXCPU访问non-cacheable内存或CPU访问IO设备地址空间的最大带宽fp
TOTAL_BW_MINCPU访问non-cacheable内存或CPU访问IO设备地址空间的最小带宽topdown
cs0-lat/cs1-lat/cs2-lat/cs3-latAVG CACHEABLE LATENCY指定node上的CPU(-node参数指定) cacheable访问各个node内存的平均时延, 单位nstopdown-details
AVG NON-CACHEABLE LATENCY指定node上的CPU(-node参数指定) non-cacheable访问各个node内存的平均时延, 单位nsl1
CYCLES指定node上的CPU(-node参数指定) cacheable或non-cacheable访问各个node内存的所有请求的总时延,单位cyclel2
COUNTS指定node上的CPU(-node参数指定) cacheable或non-cacheable访问各个node内存的总请求数tlb
ccm0-lat/ccm1-lat/ ccm2-lat/ccm3-latAVG CACHEABLE LATENCY各个node上的CPU cacheable访问指定node内存(-node参数指定)的平均时延, 单位nsL3l3YYYY
CYCLES各个node上的CPU cacheable访问指定node内存(-node参数指定)的所有请求的总时延,单位cycleDFdiYYY748x系列只能收集跨socket间带宽,无法收集socket内跨die带宽
COUNTS各个node上的CPU cacheable访问指定node内存(-node参数指定)的总请求数do
iom0-lat/iom1-lat/ iom2-lat/iom3-latAVG NON-CACHEABLE LATENCY各个node上的IO设备 non-cacheable访问指定node内存(-node参数指定)的平均时延, 单位nscmYYYY
CYCLES各个node上的IO设备 non-cacheable访问指定node内存(-node参数指定)的所有请求的总时延,单位cycleiom
COUNTS各个node上的IO设备 non-cacheable访问指定node内存(-node参数指定)的总请求数cs0-latYYYY
sw-eventalignment-faults统计内存不对齐访问发生的次数cs1-lat
page-faults统计缺页错误发生的次数cs2-latNNNY
context-switches统计进程上下文切换发生的次数cs3-lat部分支持
除749x系列外的其他C86-4G平台均支持
cpu-migrations统计进程在CPU间迁移发生的次数ccm0-lat YYYY
- -##### collect示例 -- 收集3s内,node 0的ipc, l1,l2,l3 cache的访问情况,并按ccx的粒度展示。 -`````` -$# sudo ./hygon_pcm collect -m ipc,l1,l2,l3 -c node=0 -d 3000 -A ccx - -Vendor ID: HygonGenuine -Cpu Model: 0x1800 -L1 Data Cache Size: 32K -L1 Instruction Cache Size: 64K -L2 Cache Size per instance: 512K -L3 Cache Size per instance: 8192K -logical cpus num: 64 -thread per core: 2 -threads_per_ccx: 8 -threads_per_node: 16 -threads_per_socket: 64 -nodes num: 4 -socket num: 1 - - Time Level l3-instances l3-cache-access l3-cache-miss-ratio(%) ------- ------------------ -------------- ----------------- ------------------------ - 3.04 cache-S0-D0-L3-ID0 1 817 M 95.19 - 3.03 cache-S0-D0-L3-ID4 1 811 M 94.44 - - Time Level logical-cpus cpu-freq(GHz) retired-insn IPC branch-miss-ratio(%) ------- ------------------ -------------- --------------- -------------- ----- ---------------------- - 3.27 cache-S0-D0-L3-ID0 8 1.76 7556 M 0.16 0.14 - 3.24 cache-S0-D0-L3-ID4 8 1.86 8319 M 0.17 0.32 - - Time Level logical-cpus l1-icache-access l1-icache-miss-ratio(%) l1-icache-bw(B/s) l1-dcache-access l1-dcache-miss-ratio(%) l1-dcache-bw(B/s) ------- ------------------ -------------- ------------------ ------------------------- -------------------------- ------------------ ------------------------- -------------------------- - 3.27 cache-S0-D0-L3-ID0 8 93 M 10.91 114 K 3842 M 53.92 9409 K - 3.24 cache-S0-D0-L3-ID4 8 255 M 16.49 315 K 4241 M 51.44 10 M - - Time Level logical-cpus l2-icache-access l2-icache-miss-ratio(%) l2-icache-bw(B/s) l2-dcache-access l2-dcache-miss-ratio(%) l2-dcache-bw(B/s) ------- ------------------ -------------- ------------------ ------------------------- -------------------------- ------------------ ------------------------- -------------------------- - 3.27 cache-S0-D0-L3-ID0 8 9864 K 59.96 12 K 363 M 40.72 889 K - 3.24 cache-S0-D0-L3-ID4 8 40 M 16.78 50 K 389 M 41.34 960 K - `````` - - - 每隔1s收集全系统的ipc,l3,跨die流量,收集2次,并按socket的粒度展示。 -`````` -$# sudo ./hygon_pcm collect -m ipc,cm -a -I 1000 -count 1 -A skt -q - - CORE-MEM:data translated from core(local and remote) through cache to memory - - CORE-MEM-> | CS0_RDBLK | CS1_RDBLK |CS0_VICBLKFULL|CS1_VICBLKFULL| TOTAL-BW | ---------------------------------------------------------------------------------------------------------------- - DIE0 17 GB/s 17 GB/s 14 MB/s 13 MB/s 35 GB/s - DIE1 18 GB/s 18 GB/s 12 MB/s 12 MB/s 36 GB/s - DIE2 18 GB/s 18 GB/s 8030 KB/s 8028 KB/s 36 GB/s - DIE3 15 GB/s 15 GB/s 14 MB/s 14 MB/s 31 GB/s ---------------------------------------------------------------------------------------------------------------- - SKT0 69 GB/s 69 GB/s 49 MB/s 49 MB/s 139 GB/s ---------------------------------------------------------------------------------------------------------------- - SYS 69 GB/s 69 GB/s 49 MB/s 49 MB/s 139 GB/s ---------------------------------------------------------------------------------------------------------------- - - Time Level logical-cpus cpu-freq(GHz) retired-insn IPC branch-miss-ratio(%) ------- --------- -------------- --------------- -------------- ----- ---------------------- - 1.00 socket-S0 64 2.07 20 G 0.14 0.10 -`````` - - - 收集lmbench运行过程中的ipc和topdown。 -`````` -$# sudo ./hygon_pcm collect -m ipc,topdown -cmd "taskset -c 0-2 hygonstress_0.1.8 -m 4 -t 2" -q - - OnCpuTime cpu-freq(GHz) retired-insn IPC branch-miss-ratio(%) ------------ --------------- -------------- ----- ---------------------- - 127.92 0.15 11 G 0.65 0.50 - - OnCpuTime retired(%) bad-speculation(%) frontend-bound(%) backend-bound(%) other-thread(%) ------------ ------------ -------------------- ------------------- ------------------ ----------------- - 127.92 20.21 0.61 16.99 61.98 0.20 - - -Command Output => -[2024-06-12 20:51:33] Start: Memory Read Test, core_num=3 test_size=51200KB -Start stress thread(0) on cpu(0) -Start stress thread(1) on cpu(1) -Start stress thread(2) on cpu(2) -[2024-06-12 20:51:34] Speed: 30.95 GB/s -[2024-06-12 20:51:35] Speed: 32.11 GB/s -`````` - -## hygon_sys介绍 - -### Command -- process: 收集进程对CPU、内存、存储IO等资源的消耗情况,获得对应的使用率、饱和度、错误次数等指标。 -- network: 收集网络信息,包括网卡的整体收发包统计,单队列收发包统计,硬中断/软中断统计等指标。 -- java: 收集java进程的CPU、内存等资源的使用率,获取进程的类加载、热点等信息。 -- sched: 收集系统内进程/线程的调度时延、CPU切换链路、冷火焰图,以此识别性能瓶颈。 - -`````` -$# source set_env.sh -$# sudo ./hygon_sys -h -usage: hygon_sys [-h] [-v] {process,network,java,sched} ... - -positional arguments: - {process,network,java,sched} - process collects information about the resources such as the - CPU, memory, and storage I/O resources used by - processes - network collect network interface performance data. - java collect java process performance data. - sched scheduling analysis. - -optional arguments: - -h, --help show this help message and exit - -v view the version information. -`````` - -### Options -#### process - - -##### 用户参数 - - - + - - + + + + + + + + - - + + + + + - - + + + + + - - + - - + - - + + + +
OptionDescriptionccm1-lat
-I <interval>指定采样间隔,默认每隔1s采集一次数据,可以使用-count指定输出次数。 -

Note: -
· 默认收集系统所有进程的资源使用情况。
ccm2-latNNNY
ccm3-lat
-count <count>指定采样次数,默认采集5次。使用时必须配合-I使用。iom0-latYYYY
-cpu 指定收集CPU利用率相关参数。如果不指定-cpu/-mem/-io/-switch,默认收集cpu资源信息。iom1-latNNNY
-mem 指定收集内存相关参数。iom2-lat
-io 指定收集存储IO相关参数。iom3-lat
-switch 指定收集上下文切换相关参数。software-eventsw-event和OS版本相关,要求OS版本高于Linux 2.6
+ +### A.2 metrics指标含义介绍 + + + + + - - + + + - - + + - - + + - - + + - - + + -
metricstargetdescription
-syscall 指定收集系统调用执行情况。 -

Note: -
· 只有指定pid或指定-cmd时可以使用。 -
· interval * count时间后,展示系统调用执行情况。 -
· 系统调用频繁的程序,使用-syscall会影响性能。
ipccpu-freq采集过程中cpu平均频率 
-p <pid1,pid2,pid3...> 指定收集系统调用执行情况。 -

Note: -
· 统计指定pid进程的CPU/内存/存储IO的资源使用情况。 -
· 若指定pid进程的运行时间小于interval,则无法收集到CPU/内存/存储IO的资源使用情况数据。 -
· 若指定pid进程的运行时间小于interval * count,则进程运行结束后,停止采样。
retired-insnretired指令数
-cmd <command> 统计指定命令进程的CPU/内存/存储IO的资源使用情况。 -

Note: -
·要求cmd是一个单进程应用,否则hygon_tuner只能统计到父进程的资源使用情况和syscall执行情况。 -
· 若cmd的运行时间小于interval,则无法收集到CPU/内存/存储IO的资源使用情况数据。 -
· 若cmd的运行时间小于interval * count,则cmd运行结束后,停止采样。
IPCInstructions Per Cycle (IPC),指的是平均每个CPU cycle完成指令数
-warmup <warmup_time>warmup_time时间后,再开始采集数据。单位sbranch-miss-ratio分支预测错误的跳转指令在retired跳转指令中的占比
-o <filename>将结果存储到当前路径下的file中。branch-mpkibranch miss per kilo instructions.平均每一千条指令中分支预测错误的跳转指令数
- -##### 输出指标解释 - - - - + + + - - - + + - - + + - - + + - - + + + - - + + - - + + - - + + - - + + - - + + - - - + + + - - + + + - - + + - - + + - - + + - - - + + - - + + - - + + - - + + + - - - + + - - + + -
OptionParameterDescriptionfpMMX-ratioretired MMX指令在retired指令中的占比
-cpuUID任务的user id。SSE-ratioretired SSE指令在retired指令中的占比
PID任务的process id。x87-ratioretired x87指令在retired指令中的占比
%usr任务在用户态执行时的CPU使用率(百分比)。fp-ratioretired 浮点指令在retired指令中的占比
%system任务在内核态执行时的CPU使用率(百分比)。topdownfrontend-bound由于前端没有提供足够的指令数引起的pipeline stall的占比
%guest任务在虚拟机中执行时的CPU使用率(百分比)。bad-speculation由于分支预测错误引起的pipeline stall的占比
%wait任务在处于等待状态时的CPU使用率(百分比)。retiredretired upos占比
%CPU任务的总CPU使用率(百分比)。backend-bound后端引起的pipeline stall的占比
CPU任务所在的CPU id。other-thread由于逻辑核资源竞争引起的pipeline stall的占比
Command任务名称。topdown-details参考附录A.3 topdown-details指标含义介绍
-memminflt/s每秒次缺页错误次数(minor page faults),这些缺页错误不需要从磁盘加载内存页。l1l1-icache-accessL1 Icache access次数
majflt/s每秒主缺页错误次数(major page faults),这些缺页错误需要从磁盘加载内存页。
l1-icache-miss-ratioL1 Icache miss率
VSZVirtual Size, 任务的虚拟内存使用量,单位是kB。l1-icache-mpkiL1 Icache miss per kilo instructions.平均每一千条指令中L1 Icache miss次数
RSSResident Set Size, 任务的长期内存使用量,单位是kB。l1-icache-bwL1 Icache 访问带宽
%MEM任务的内存使用率(百分比)。l1-dcache-accessL1 Dcache access次数
-iokB_rd/s任务每秒从磁盘读取的数据量,单位是kB。l1-dcache-miss-ratioL1 Dcache miss率
kB_wr/s任务每秒向磁盘写入的数据量,单位是kB。l1-dcache-mpkiL1 Dcache miss per kilo instructions.平均每一千条指令中L1 Dcache miss次数
kB_ccwr/s任务每秒取消向磁盘写入的数据量,单位是kB。l1-dcache-bwL1 Dcache 访问带宽
iodelayBlock I/O延迟,单位是时钟周期。l2l2-icache-accessL2 Icache access次数
-switchcswch/s任务每秒进行自愿上下文切换的次数。l2-icache-miss-ratioL2 Icache miss率
nvcswch/s任务每秒进行非自愿上下文切换的次数。l2-icache-mpkiL2 Icache miss per kilo instructions.平均每一千条指令中L2 Icache miss次数
- -##### process 示例 - - - 收集系统中进程占用CPU资源和内存资源的情况,每隔1s收集一次,收集1次。 - `````` - $# sudo ./hygon_sys process -cpu -mem -I 1 -count 1 - - Time UID PID %usr %system %guest %wait %CPU CPU Command --------- ----- ----- ------ --------- -------- ------- ------ ----- --------------- -17:25:29 1024 66911 1.0% 0.0% 0.0% 0.0% 1.0% 51 node -17:25:29 1011 80768 0.0% 2.9% 0.0% 0.0% 2.9% 13 htop -17:25:29 0 82596 1.0% 1.9% 0.0% 0.0% 2.9% 0 pidstat -17:25:29 0 98689 83.8% 15.2% 0.0% 0.0% 99.0% 24 hygon_sys - -Time UID PID minflt/s majflt/s VSZ RSS %MEM Command --------- ----- ------ ---------- ---------- ------- ------ ------ ---------- -17:25:29 1024 66911 0.95 0.00 960.6M 101.5M 0.0% node -17:25:29 0 82596 1210.48 0.00 12.2M 9.5M 0.0% pidstat -17:25:29 1009 118696 1.90 0.00 1.2G 211.3M 0.1% node -17:25:29 1009 120633 0.95 0.00 985.8M 139.5M 0.1% node -17:25:29 1009 120792 0.95 0.00 770.0M 61.2M 0.0% node -17:25:29 1016 123583 6.67 0.00 973.4M 113.1M 0.0% node -17:25:29 1016 123647 0.95 0.00 778.6M 64.0M 0.0% node -17:25:29 1016 123757 3.81 0.00 1.0G 175.3M 0.1% node -17:25:29 1016 124090 5.71 0.00 1023.2M 153.9M 0.1% node -17:25:29 1000 128096 132.38 0.00 12.6M 3.3M 0.0% bash - `````` - - - 收集指定进程占用CPU资源情况和系统调用执行情况,每隔1s收集一次,收集1次。 - `````` - $# sudo ./hygon_sys process -cpu -syscall -p 93300 -I 1 -count 1 - -Time UID PID %usr %system %guest %wait %CPU CPU Command --------- ----- ----- ------ --------- -------- ------- ------ ----- --------- -17:30:30 1009 93300 49.5% 0.0% 0.0% 50.5% 49.5% 1 bw_mem - -Syscall Log=> - -% time seconds usecs/call calls errors syscall ------- ----------- ----------- --------- --------- ---------------- - 0.00 0.000000 0 1 rt_sigaction - 0.00 0.000000 0 2 getrusage - 0.00 0.000000 0 1 getppid ------- ----------- ----------- --------- --------- ---------------- -100.00 0.000000 4 total - `````` - -#### network -##### 用户参数 - - - - + + - - + + - - + + -
OptionDescriptionl2-icache-bwL2 Icache 访问带宽
-i <interface> 指定需要监控的网口名称。l2-dcache-accessL2 Dcache access次数
-o <filename> 将结果存储到当前路径下的file中。l2-dcache-miss-ratioL2 Dcache miss率
- -##### 输出指标解释 - - - + + - - + + - - + + - - + + - - + + - - + + + -
OptionDescriptionl2-dcache-mpkiL2 Dcache miss per kilo instructions.平均每一千条指令中L2 Dcache miss次数
Receive/Transmit Total 网口收包总和l2-dcache-bwL2 Dcache 访问带宽
Receive/Transmit Type 将报文按照多播/广播/单播的统计划分。l2-prefetchL2硬件预取引入的access次数
Receive/Transmit Packet/Bytes 具体队列的收发包统计。统计的时间窗口与具体的驱动和硬件实现相关,例如在driver加载/端口up后开始统计。l2-prefetch-miss-ratioL2 硬件预取 miss率
Hard Interrupt 自系统启动以来硬中断统计次数,例如281下的CPU24(7)代表CPU24上发生了7次和网络相关的硬中断,硬中断号为281。l2-prefetch-mpkiL2 prefetch miss per kilo instructions.平均每一千条指令中L2 prefetch miss次数
Soft Interrupt 自系统启动依赖的软中断统计次数,例如NET_TX下的CPU0(6)代表CPU0下发生了6次NET_TX软中断。tlbl1-itlb-miss-ratioL1 ITLB miss率
- -##### network示例 -- 收集执行interface的详细信息。 -`````` -$# ./hygon_sys network -i enp51s0f1 -`````` -执行完对应命令后会进入窗口模式,在窗口模式下,使用上下键翻页,右键刷新数据,q键退出。 -可以使用-o filepath将输出导入指定文件,此时不会进入窗口模式,文件写入后程序自动返回。 -输出展示如下: -`````` -Receive Total: - rx_bytes=10216554 -Transmit Total: - tx_bytes=13607793 -Receive Type: - rx_broadcast=20609 - rx_multicast=24688 -Transmit Type: - tx_broadcast=20610 - tx_multicast=64437 -Receive Packet: - rx_queue_0_packets=6755188 - rx_queue_1_packets=1489045 -Receive Bytes: - rx_queue_0_bytes=1077614389 - rx_queue_1_bytes=408728463 -Transmit Packet: - tx_queue_0_packets=1333137 - tx_queue_1_packets=5517637 -Transmit Bytes: - tx_queue_0_bytes=446564691 - tx_queue_1_bytes=5327179951 -Hard Interrupt: - 280: - 281: - CPU24(7) CPU29(945450) CPU30(250756) - 282: - CPU24(250756) CPU25(7) CPU28(945450) - 283: - CPU26(7) CPU27(1196206) -Soft Interrupt: - NET_TX: - CPU0(6) CPU1(8) CPU2(2) CPU5(2) CPU7(2) - NET_RX: - CPU0(265377) CPU1(306373) CPU2(287008) CPU3(319431) CPU4(524558) - CPU5(554005) CPU6(499649) CPU7(561335) CPU8(580138) CPU9(644429) - CPU10(226196) CPU11(148069) CPU12(77042) CPU13(239676) CPU14(92738) -`````` - - -#### java -##### 用户参数 - - - - + + - - + + - - + + - - + + + - - + + -
OptionDescriptionl2-itlb-miss-ratioL2 ITLB miss率
-d <JAVA_HOME>指定JAVA_HOME的路径。 -

Note: -
如果不指定JAVA_HOME的话,会默认使用系统的JAVA_HOME。 -
l1-dtlb-miss-ratioL1 DTLB miss率
-p <PID>统计指定进程的信息。l2-dtlb-miss-ratioL1 DTLB miss率
-c <COMMAND>指定要采集功能的命令,多个命令用;分隔开。 -

以下列举常用的cmd: -
· dashboard - 当前系统的实时数据面板,包含GC信息。 -
· jvm - 查看当前JVM的信息。 -
· thread - 查看当前JVM的线程堆栈信息。 -
· memory - 查看JVM的内存信息。 -
· profiler start - 开始采集应用热点。 -
· profiler stop - 结束采集应用热点,默认生成CPU的火焰图,必须与profiler start搭配使用。 -

Note: -
如果使用profiler start/profiler stop的话: -
1. 要求系统参数perf_event_paranoid<=2,可以通过"sysctl kernel.perf_event_paranoid=2"修改。 -
2. 如果采集时间太短,可能会没有数据,可适当拉长采集时间。 -
l3l3-cache-accessL3 cache access次数
-s <SELECT>通过类名或JAR文件名选择目标进程。l3-cache-missL3 cache miss次数
- -##### java示例 -- 查看指定进程的堆栈使用情况和内存使用信息。 -如果没有指定java_home路径的话,默认使用系统的java。 -`````` -$# sudo ./hygon_sys java -p 88805 -c "thread;memory" -Arthas script version: 3.7.1 -[INFO] JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64 -Arthas home: ~/hygon-tuner/hygon_tuner_tools/bin/third_party/arthas -Calculating attach execution time... -Attaching to 88805 using version ~/hygon-tuner/hygon_tuner_tools/bin/third_party/arthas... - -real 0m9.385s -user 0m2.495s -sys 0m0.238s -Attach success. - ,---. ,------. ,--------.,--. ,--. ,---. ,---. - / O \ | .--. ''--. .--'| '--' | / O \ ' .-' -| .-. || '--'.' | | | .--. || .-. |`. `-. -| | | || |\ \ | | | | | || | | |.-' | -`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' - -wiki https://arthas.aliyun.com/doc -tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html -version 3.7.1 -main_class -pid 88805 -time 2024-05-21 17:11:55 - -[arthas@88805]$ thread | plaintext -Threads Total: 17, NEW: 0, RUNNABLE: 9, BLOCKED: 0, WAITING: 3, TIMED_WAITING: 5 -, TERMINATED: 0 -ID NAME GROUP PRIORI STATE %CPU DELTA_ TIME INTER DAEMON -41 arthas-command-exec system 5 RUNNAB 0.74 0.001 0:0.01 false true -1 main main 5 TIMED_ 0.2 0.000 0:0.09 false false -2 Reference Handler system 10 RUNNAB 0.0 0.000 0:0.00 false true -3 Finalizer system 8 WAITIN 0.0 0.000 0:0.00 false true -4 Signal Dispatcher system 9 RUNNAB 0.0 0.000 0:0.00 false true -26 Notification Thread system 9 RUNNAB 0.0 0.000 0:0.00 false true -28 Attach Listener system 9 RUNNAB 0.0 0.000 0:0.06 false true -30 arthas-timer system 9 WAITIN 0.0 0.000 0:0.00 false true -33 arthas-NettyHttpTel system 5 RUNNAB 0.0 0.000 0:0.04 false true -34 arthas-NettyWebsock system 5 RUNNAB 0.0 0.000 0:0.00 false true -35 arthas-NettyWebsock system 5 RUNNAB 0.0 0.000 0:0.00 false true -36 arthas-shell-server system 9 TIMED_ 0.0 0.000 0:0.00 false true -37 arthas-session-mana system 9 TIMED_ 0.0 0.000 0:0.00 false true -38 arthas-UserStat system 9 WAITIN 0.0 0.000 0:0.00 false true -40 arthas-NettyHttpTel system 5 RUNNAB 0.0 0.000 0:0.16 false true -27 Common-Cleaner Innocuous 8 TIMED_ 0.0 0.000 0:0.00 false true -32 Keep-Alive-Timer Innocuous 8 TIMED_ 0.0 0.000 0:0.00 false true - -[arthas@88805]$ memory | plaintext -Memory used total max usage -heap 95M 2080M 30688M 0.31% -g1_eden_space 80M 112M -1 71.43% -g1_old_gen 15M 1968M 30688M 0.05% -g1_survivor_space 0K 0K -1 0.00% -nonheap 28M 31M -1 90.79% -codeheap_'non-nmethods' 2M 2M 8M 27.57% -metaspace 18M 19M -1 98.42% -codeheap_'profiled_nmethods' 4M 4M 115M 3.72% -compressed_class_space 2M 2M 1024M 0.22% -codeheap_'non-profiled_nmethods' 626K 2496K 118592K 0.53% -mapped 0K 0K - 0.00% -direct 4M 4M - 100.00% -mapped - 'non-volatile memory' 0K 0K - 0.00% -[arthas@88805]$ -$ -`````` -- 如果没有指定java pid,屏幕会给出选择指定哪个java进程,需要输入对应编号。 -如果没有指定要采集的功能,可以在进入交互后再输入命令。 -`````` -$# sudo ./hygon_sys java -Arthas script version: 3.7.1 -[INFO] JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64 -Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. -* [1]: 123060 -- process information unavailable - [2]: 25932 ./math-game.jar - [3]: 123053 -- process information unavailable -2 -Arthas home: ~/hygon-tuner/hygon_tuner_tools/bin/third_party/arthas -Calculating attach execution time... -Attaching to 25932 using version ~/hygon-tuner/hygon_tuner_tools/bin/third_party/arthas... - -real 0m1.546s -user 0m0.514s -sys 0m0.058s -Attach success. -telnet connecting to arthas server... current timestamp is 1716295750 -Trying 127.0.0.1... -Connected to 127.0.0.1. -Escape character is '^]'. - ,---. ,------. ,--------.,--. ,--. ,---. ,---. - / O \ | .--. ''--. .--'| '--' | / O \ ' .-' -| .-. || '--'.' | | | .--. || .-. |`. `-. -| | | || |\ \ | | | | | || | | |.-' | -`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' - -wiki https://arthas.aliyun.com/doc -tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html -version 3.7.1 -main_class -pid 25932 -time 2024-05-21 20:49:10 - -[arthas@25932]$ memory -Memory used total max usage -heap 79M 2080M 30688M 0.26% -g1_eden_space 64M 112M -1 57.14% -g1_old_gen 15M 1968M 30688M 0.05% -g1_survivor_space 0K 0K -1 0.00% -nonheap 26M 31M -1 84.61% -codeheap_'non-nmethods' 1M 4M 8M 14.46% -metaspace 18M 18M -1 99.07% -codeheap_'profiled_nmethods' 4M 4M 115M 3.67% -compressed_class_space 2M 2M 1024M 0.22% -codeheap_'non-profiled_nmethods' 629K 2496K 118592K 0.53% -mapped 0K 0K - 0.00% -direct 4M 4M - 100.00% -mapped - 'non-volatile memory' 0K 0K - 0.00% -[arthas@25932]$ stop -Resetting all enhanced classes ... -Affect(class count: 0 , method count: 0) cost in 29 ms, listenerId: 0 -Arthas Server is going to shutdown... -[arthas@25932]$ session (6b824c1c-4c54-4163-b2f0-cc5544359e24) is closed because server is going to shutdown. -Connection closed by foreign host. -`````` - -#### sched - - -##### 使用约束 -- 要求内核版本高于4.7 -- 要求内核config:CONFIG_SCHEDSTATS=y - -##### 用户参数 - - - + + - - + + + - - + + + - - + + + - - + + - - + + - - + + + + + + + + + + - - + + + -
OptionDescriptionl3-cache-miss-ratioL3 cache miss率
-latency 统计全系统所有进程或指定进程的调度时延数据。 didie in bandwidth每个Die的内存被跨Die访问的带宽,C86-4G平台上还会收集内存被跨socket访问的带宽
-flame 绘制系统冷火焰图(off-cpu火焰图),输出svg文件,默认输出文件名是offcpu.svg。 -

Note: -
· -flame与-p不能同时使用。 -
· -flame与-cmd不能同时使用。
dodie out bandwidth每个Die的CPU或IO跨Die访问其他节点内存的带宽,C86-4G平台上还会收集跨socket访存的带宽
-d <duration>收集指定时间内,系统的调度信息,单位s,默认15s。cmCS_RD每个内存通道收到的cacheable读请求数(rdblk请求)
-p <pid>hygon_tuner收集指定pid对应的进程的调度信息,可以指定多个进程,进程pid之间用逗号分开。 -

Note: -
· -p与-cmd不能同时使用。 -
· -p与-flame不能同时使用。 -
CS_WR每个内存通道收到的cacheable写请求数(vicblockfull请求)
-warmup <warmup_time>warmup_time时间后,再开始采集数据,单位s。TOTAL_BW每个Die的内存被cacheable访问的总带宽
-cmd <command> 统计指定命令运行时间内,全系统所有进程/线程的调度信息。 -

Note: -
· -cmd与-p不能同时使用。 -
· -cmd与-flame不能同时使用。 +
iomCS_Rd每个内存通道收到的non-cacheable读请求数
CS_Wr每个内存通道收到的non-cacheable写请求数
TOTAL_BW_MIN/TOTAL_BW_AX每个Die的内存被non-cacheable访问的最小/最大总带宽。由于每次non-cacheable读写的数据可能是32Byte,也可能是64Byte,因此计算出带宽可能的最大值/最小值用于估算带宽
-o <filename>将收集到的进程latency解析结果或冷火焰图存储到当前路径下的filename文件中,冷火焰图的命名为filename.svg。mem-bwread-requests读每个Die的内存的请求数
- -##### 输出信息 - - - + - - + - - + - - + + + - - + + - - + + - - + + - - + + + - - + + - - + + - - + + + - - + + - - + + -
ParameterDescriptionwrite-requests + 写每个Die的内存的请求数
pid/tid 展示对应的进程ID/线程ID。 min-mem-access-bw + 每个Die的内存被访问的最小带宽。部分读请求每次读的数据可能是32Byte,也可能是64Byte,因此只给出访存带宽的最大最小值。(相当于cm统计的cacheable带宽和iom统计的non-cacheable带宽之和)
command 展示对应的进程/线程名称。 max-mem-access-bw + 每个Die的内存被访问的最大带宽。部分读请求每次读的数据可能是32Byte,也可能是64Byte,因此只给出访存带宽的最大最小值。(相当于cm统计的cacheable带宽和iom统计的non-cacheable带宽之和)
on-cpu 展示对应的进程/线程在CPU上运行的总时长,单位ms。 cs0-lat/cs1-lat/cs2-lat/cs3-latavg-cacheable-latency指定DIE上的CPU(-die参数指定) cacheable访问各个DIE内存的平均时延, 单位ns
off-cpu 展示对应的进程/线程不在CPU上运行的总时长,单位ms。 avg-non-cacheable-latency指定DIE上的CPU(-die参数指定) non-cacheable访问各个DIE内存的平均时延, 单位ns
max off-cpu 展示对应的进程/线程不在CPU上运行的最大一次时长,单位ms。 total-rdblk-latency/total-rdsized-latency指定DIE上的CPU(-die参数指定) cacheable或non-cacheable访问各个DIE内存的所有请求的总时延,单位cycle
switch 展示对应的进程/线程发生调度的总次数。 total-rdblk-requests/total-rdsized-requests指定DIE上的CPU(-die参数指定) cacheable或non-cacheable访问各个DIE内存的总请求数
delay 展示对应的进程/线程总调度时延,单位ms。 ccm0-lat/ccm1-lat/ ccm2-lat/ccm3-latavg-cacheable-latency各个DIE上的CPU cacheable访问指定DIE内存(-die参数指定)的平均时延, 单位ns
max delay 展示对应的进程/线程最大一次调度时延,单位ms。 total-latency各个DIE上的CPU cacheable访问指定DIE内存(-die参数指定)的所有请求的总时延,单位cycle
avg-delay 展示对应的进程/线程平均调度时延,单位ms。 total-requests各个DIE上的CPU cacheable访问指定DIE内存(-die参数指定)的总请求数
migration 展示对应的进程/线程发生CPU切换的次数。 iom0-lat/iom1-lat/ iom2-lat/iom3-latavg-non-cacheable-latency各个DIE上的IO设备 non-cacheable访问指定DIE内存(-die参数指定)的平均时延, 单位ns
cpu-map 展示对应的进程/线程在CPU之间切换的链路。 total-rdsized-latency各个DIE上的IO设备 non-cacheable访问指定DIE内存(-die参数指定)的所有请求的总时延,单位cycle
numa-map 展示对应的进程/线程在NUMA之间切换的链路。 total-rdsized-requests各个DIE上的IO设备 non-cacheable访问指定DIE内存(-die参数指定)的总请求数
- -##### sched 示例 - - - 收集1s内系统中进程调度时延信息。 -`````` -$# sudo ./hygon_sys sched -d 1 - -Select -latency mode by default -pid/tid command on-cpu off-cpu max off-cpu switch delay max delay avg-delay migration cpu-map numa-map -------------- --------------- -------- --------- ------------- -------- ------- ----------- ----------- ----------- --------------- ---------- -80768/80768 htop 39.93 0.02 0.01 2 0.01 0.01 0.00 0 10 1 -124090/124090 node 3.61 786.86 361.38 34 0.28 0.03 0.01 1 51->17 2 -29572/46566 head 2.09 0.00 0.00 1 0.00 0.00 0.00 0 -43454/43454 node 1.42 1000.52 200.22 19 0.34 0.18 0.02 2 54->51->20 2 -32079/32079 node 1.35 698.68 470.48 7 0.06 0.01 0.01 0 52 2 -29572/46568 df 1.30 0.09 0.05 3 0.02 0.01 0.01 0 9 1 -29572/29572 bash 1.18 6.67 2.20 6 0.38 0.16 0.06 5 6->11->57->0->1 0->1->3- - 1->56 >0->1->3 -118696/118696 node 1.14 1000.21 838.87 13 0.11 0.02 0.01 0 51 2 -74907/74907 node 0.84 834.18 200.22 15 0.10 0.01 0.01 0 52 2 -123583/123583 node 0.77 921.94 742.76 14 0.09 0.01 0.01 0 24 3 -...... -`````` - - - 收集hygonstress执行过程中,系统中进程调度时延信息。 -`````` -$# sudo ./hygon_sys sched -cmd "taskset -c 0,1 hygonstress_0.1.8 -m 4 -t 1" - -Select -latency mode by default -pid/tid command on-cpu off-cpu max off-cpu switch delay max delay avg-delay migration cpu-map numa-map -------------- --------------- -------- --------- ------------- -------- ------- ----------- ----------- ----------- --------------- ---------- -45221/45224 hygonstress_0.1 1019.73 1.94 1.90 5 0.04 0.02 0.01 0 1 0 -45221/45223 hygonstress_0.1 1005.41 2.43 1.92 7 0.11 0.07 0.02 1 1->0 0 -43005/43005 htop 24.67 0.02 0.01 2 0.01 0.01 0.00 0 5 0 -42055/45236 bash 0.86 0.02 0.02 1 0.02 0.02 0.02 0 45 1 -...... -`````` - - 收集1s内指定进程的调度时延信息。 -`````` -$# sudo ./hygon_sys.py sched -d 1 -p 53481,53487 + + sw-event + alignment-faults + 统计内存不对齐访问发生的次数 + + + page-faults + 统计缺页错误发生的次数 + + + context-switches + 统计进程上下文切换发生的次数 + + + cpu-migrations + 统计进程在CPU间迁移发生的次数 + + -Select -latency mode by default -sudo ./hygon_sys.py sched -d 1 -p 69962,69963 -Select -latency mode by default -pid/tid command on-cpu off-cpu max off-cpu switch delay max delay avg-delay migration cpu-map numa-map ------------ --------- -------- --------- ------------- -------- ------- ----------- ----------- ----------- --------------- ---------- -69962/69962 bw_mem 884.41 160.02 16.01 13 0 0 0.00 5 1->0->1->0->1-> 0 - 0 -69963/69963 bw_mem 657.62 400.23 64.00 27 0 0 0.00 5 0->1->0->1->0-> 0 - 1 +### A.3 topdown-details指标含义介绍 `````` - - 绘制1s内,系统的off-cpu火焰图。 - `````` -$# sudo ./hygon_sys sched -d 1 -flame -$# ls -bin hygon_pcm hygon_sys offcpu.svg set_env.sh +topdown-details +| ++---Retire Bound: Retire的uops数量占所有pipeline的占比。 +| +---Microcode: 由Microcode生成的uops数量的占比。(这里比较特殊,Microcode/Non-Microcode,FP/Non-FP是对retire bound第二级的两种不同看法,并不是划分) +| +---Non-Microcode: 正常的uops数量的占比。 +| | +---Conditional Branch: 条件跳转指令数量的占比。 +| | | +---Fused Branch: 被Fused的Branch占比,例如cmp jmp的合并。 +| | | +---Non-Fused Branch: 正常的条件Branch占比。 +| | +---UnConditional Branch: 非条件跳转指令数量的占比。 +| | | +---Far Control Transfer: call,jump,return,IRET,syscall,sysret,exception,interrupts指令的占比。 +| | | +---Near Return: RET指令的占比。 +| | | +---Other: 其他指令的占比。 +| | +---Multiply: 乘法指令数量的占比。 +| | +---Divide: 除法指令数量的占比。 +| | +---Other: 其他指令数量的占比。 +| +---FP: 进入浮点运算单元的uops数量的占比。 +| | +---x87 ops: 部分x87指令集的uops数量的占比。 +| | +---SSE ops(common ops): 常用SSE指令集的uops数量的占比。 +| | | +---SSE packed ops(common ops): 常用的SSE非标量uops数量的占比。 +| | | +---SSE scalar ops(common ops): 常用的SSE标量uops数量的占比。 +| | +---other: 其他指令集的数量的占比。 +| | +---x87 Instruction: x87指令数量的占比。 +| | +---MMX Instruction: MMX指令数量的占比。 +| | +---SSE/AVX Instruction: SSE/AVX指令数量的占比。 +| | | +---SSE/AVX 128b Instruction: 128bit SSE/AVX指令数量的占比。 +| | | +---SSE/AVX 256b Instruction: 256bit SSE/AVX指令数量的占比。 +| +---Non-FP: 未进入浮点运算单元的uops数量的占比。 ++---Frontend Bound: 代表CPU前端(dispatch之前)没有产生足够的bubble,这些bubble与填满pipeline的uops数量的比例。 +| +---Decoder: 代表Decoder没有收到足够多的指令而产生的bubble占比。 +| | +---Decoupling Queue(DQ): 由于BP模块的某些原因导致Decoupling Queue为空而bubble的占比。 +| | | +---Branch Predictor(BP): Branch Predictor产生的bubble占比,原因可能是预测错误次数太多,或者Redirect/Retire期间内部更新BP信息时产生的stall比例。 +| | | +---ITLB: 由于ITLB miss产生的bubble占比。 +| | +---ICache: 由于ICache的utag miss,cache miss,conclict等原因产生的bubble比例。其下的子项带有For Reference,表示仅仅做一个参考,并不按照topdown框架track uops +| | | +---L1 ICache Miss(For Reference): L1 ICache Miss的比率。 +| | | +---IC MAB Latency(For Reference): IC MAB数据返回需要等待的cycle数。 +| | | | +---Delay Fill Request(For Reference): Delay Fill Request的占比。 +| | | | +---L2 ICache Miss(For Reference): L2 ICache Miss的比率。 +| | | | +---MIB Fill Delay(For Reference): MIB数据返回需要等待的cycle数。 +| | | +---IC BP Miss(For Reference): MAB上因为BP miss被刷掉的请求的占比。 +| +---Ops Cache(OC): 由于OC的原因没有产生足够多的uops而产生的bubble占比。 +| | +---Fetch Stall: 由于OC Fetch Stall产生的bubble占比,例如flush token,oc的build和fetch的冲突等等。 +| | +---Cache Occupy: 指令对OC cache的利用率不足产生的bubble占比。 +| | | +---Microcode: OC Cache中Microcode的占用率。 +| | | +---Microcode: OC Cache中非Microcode的占用率。 +| +---OC/IC switch: 从IC到OC切换时,需要清空IC Pipeline而产生bubble占比。 ++---BadSpeculation: 由于分支预测错误产生的bubble占比。 +| +---Frontend Flush: 由前端redirect事件产生的badspeculation。 +| +---Backend Flush: 由后端redirect事件产生的badspeculation。 ++---Backend Bound: 代表CPU后端的原因导致dispatch上的uops没有被即使处理而产生的bubble占比。 +| +---Memory Bound: 表示由于load/store导致uops没有被及时处理而产生的bubble占比。 +| | +---Memory Bandwidth: 表示由于受带宽影产生的bubble占比,例如单位时间内load/store指令数量太多。 +| | +---Memory Latency: 表示由于受延迟影响产生的bubble占比,是指之前发射的load/store没有及时的返回结果,最终导致load/store port被填满。 +| | | +---L1 Latency: 表示load/store指令在L1 pipeline里产生的bubble占比。 +| | | +---L2 Latency: 表示load/store指令在L2 pipeline里产生的bubble占比。 +| | | +---L3 Latency: 表示load/store指令在L3 pipeline里产生的bubble占比。 +| +---Core Bound: 表示由于其他原因导致uops没有被及时处理产生的bubble占比,例如计算单元ALU,地址单元AGSQ等等。 +| | +---Core Statistic Bound: 表示由于受静态执行单元数量的限制而导致的堵塞产生的bubble占比,例如单位时间内使用ALU指令数量太多导致的堵塞。 +| | +---Core Dynamic Bound: 表示由于对应的执行单元数量已满而导致的堵塞产生的bubble占比,例如所有的ALU都已被使用。下面是各原因次数的占比: +| | | +---Arithmetic Logic Unit(ALU): 执行单元已满。 +| | | +---ALU Scheduling Queue: 执行单元的调度队列已满。 +| | | +---Address Generation Scheduling Queue: 数据地址生成单元的调度队列已满。 +| | | +---Retire: retire单元已满。 +| | | +---Physical Register Files: 寄存器已满。 +| | | +---Branch Queue: 保留分支信息的单元已满。 +| | | +---Float Point: FP对应的执行单元已满。 `````` diff --git "a/sig/Hygon Arch/content/8-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\346\211\213\345\206\214/1-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267TOPDOWN\350\257\246\347\273\206\345\212\237\350\203\275\347\256\200\344\273\213.md" "b/sig/Hygon Arch/content/8-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\346\211\213\345\206\214/1-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267TOPDOWN\350\257\246\347\273\206\345\212\237\350\203\275\347\256\200\344\273\213.md" deleted file mode 100644 index 0eaec67f..00000000 --- "a/sig/Hygon Arch/content/8-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267\346\211\213\345\206\214/1-\346\265\267\345\205\211\346\200\247\350\203\275\345\267\245\345\205\267TOPDOWN\350\257\246\347\273\206\345\212\237\350\203\275\347\256\200\344\273\213.md" +++ /dev/null @@ -1,166 +0,0 @@ ---- -html: - toc: true ---- -# 文档介绍 -本文档用于介绍hygon_pcm topdown-details细化功能的使用方法,以及各项细化指标的全称、含义等信息。 - -# 使用方法 -## 环境配置 - - 执行source set_env.sh,配置环境变量 - - 非root用户使用hygon_pcm时,需要获取root权限,执行sudo ./hygon_pcm - -## 使用命令 -- 采集5s内整个系统的topdown细化指标 -`````` -sudo ./hygon_pcm collect -m topdown-details -d 5000 -`````` -- 每隔1s采集一次CPU10的topdown细化指标,采集5次 -`````` -sudo ./hygon_pcm collect -m topdown-details -c core=10 -I 1000 -count 5 -`````` -- 采集test用例执行过程中的topdown细化指标 -`````` -sudo ./hygon_pcm collect -m topdown-details -cmd "./test" -`````` - -## 注意事项 -- 由于topdown-details使用的PMC事件较多,为了准确性,建议采集更多的数据,例如对应collect功能命令行,将-I指定的采样间隔参数设置到10000以上。 - -# 结果分析 -下面是Retire Bound,Frontend Bound,Badspeculation和Backend Bound的结果示例 - -`````` -Metric Value ------------------------------------ ---------- -Retire Bound 6.51% - Microcode 18.22% - Non-Microcode 81.78% - Conditional Branch(Instruction) 6.40% - Fused Branch 71.34% - Non-Fused Branch 28.66% - Un-Conditional Branch(Instruction) 2.01% - Far Control Transfers 1.50% - Near Return 42.45% - Other 56.05% - Multiply(Instruction) 0.04% - Divide(Instruction) 0.00% - Other(Instruction) 56.05% - FP 3.60% - x87 ops 0.00% - SSE ops 0.00% - Other ops 100.00% - Non-FP 96.40% - - -Frontend Bound 13.64% - Decoder 57.22% - Decoupling Queue 63.41% - Branch Predictor 44.02% - ITLB 55.98% - ICache 36.59% - L1 ICache Miss(For Reference) 0.99% - IC MAB Latency(For Reference) 22.98 - Delay Fill Request(For Reference) 0.58% - L2 ICache Miss(For Reference) 16.98% - MIB Fill Delay(For Reference) 63.70 - IC BP Miss(For Reference) 2.01% - Ops Cache 42.56% - Fetch Stall 0.00% - Cache Occupy 100.00% - Microcode 0.00% - Non-Microcode 100.00% - IC/OC Switch 0.22% - - -Bad Speculation 0.31% - Frontend Flush 0.00% - Backend Flush 100.00% - - -Backend Bound: 79.55% - Memory Bound 27.59% - Memory Width 35.58% - Memory Latency 64.42% - L1 Latency 22.62% - L2 Latency 77.38% - L3 Latency 0.00% - Core Bound 72.41% - Core Statistic 40.55% - Core Dynamic 59.45% - Arithmetic Logic Unit(ALU) 92.85% - ALU Scheduling Queue 8.03% - Address Generation Scheduling Queue 1.57% - Retire 4.86% - Physical Register Files 1.69% - Branch Queue 0.04% - Float Point 0.00% -`````` - -以Backend Bound为例: - -- 从左边纵向metric名称开始,一级Backend Bound顶格显示,二级Memory/Core Bound增加一个tab宽度,三级例如Memory Width/Latency增加两个tab宽度,四级bound增加三个tab宽度。 - -- 右侧显示的Value为每个Bound相对于此层级所占百分比,例如Retire Bound代表Retire Bound所占一级Bound的百分比,又例如Memory Width 35.58%和Memory Latency 64.42%表示Memory Bound下的三级Bound所占的百分比。由于受到PMC事件定义的限制,下级产生的bubble数量并不能准确反应上级bubble/stall的次数,因此采用这种方法粗略地观察下级pipeline发生的问题对上级pipeline造成的影响。 - -# 事件/Metric含义 -`````` -topdown-details -| -+---Frontend Bound: 代表CPU前端(dispatch之前)没有产生足够的uops。 -| +---Decoder:代表Decoder没有收到足够多的指令。 -| | +---Decoupling Queue(DQ):由于BP模块的某些原因导致Decoupling Queue为空。 -| | | +---Branch Predictor(BP):Branch Predictor产生的bubble,原因可能是预测错误次数太多,或者Redirect/Retire期间内部更新BP信息时产生的堵塞。 -| | | +---ITLB:由于ITLB miss产生的bubble。 -| | +---ICache:由于ICache的utag miss,cache miss,conclict等原因产生的bubble。其下的子项带有For Reference,表示仅仅做一个参考,并不按照topdown框架track uops -| | | +---L1 ICache Miss(For Reference):L1 ICache Miss的比率。 -| | | +---IC MAB Latency(For Reference):IC MAB数据返回需要等待的cycle数。 -| | | | +---Delay Fill Request(For Reference):Delay Fill Request的占比。 -| | | | +---L2 ICache Miss(For Reference):L2 ICache Miss的比率。 -| | | | +---MIB Fill Delay(For Reference):MIB数据返回需要等待的cycle数。 -| | | +---IC BP Miss(For Reference):MAB上因为BP miss别刷掉的请求的占比。 -| +---Ops Cache(OC):由于OC的原因没有产生足够多的uops。 -| | +---Fetch Stall:产生了OC Fetch Stall,例如flush token,oc的build和fetch的冲突等等。 -| | +---Cache Occupy:指令对OC cache的利用率。 -| | +---Microcode: OC Cache中Microcode的占用率。 -| | +---Microcode: OC Cache中非Microcode的占用率。 -| +---OC/IC switch:从IC到OC切换时,需要清空IC Pipeline产生的bubble。 -+---Backend Bound:代表CPU后端的原因导致dispatch上的uops没有被即使处理。 -| +---Memory Bound:表示由于load/store导致uops没有被及时处理。 -| | +---Memory Bandwidth:表示由于受带宽影导致的问题,例如单位时间内load/store指令数量太多。 -| | +---Memory Latency:表示由于受延迟影响导致的问题,是指之前发射的load/store没有及时的返回结果,最终导致load/store port被填满。 -| | +---L1 Latency:表示load/store指令经过L1 pipeline时产生的bubble。 -| | +---L2 Latency:表示load/store指令经过L2 pipeline时产生的bubble。 -| | +---L3 Latency:表示load/store指令经过L3 pipeline时产生的bubble。 -| +---Core Bound:表示由于其他原因导致uops没有被及时处理,例如计算单元ALU,地址单元AGSQ等等。 -| +---Core Statistic Bound:表示由于受静态执行单元数量的限制而导致的堵塞,例如单位时间内使用ALU指令数量太多导致的堵塞。 -| +---Core Dynamic Bound:表示由于对应的执行单元数量已满而导致的堵塞,例如所有的ALU都已被使用。 -| +---Arithmetic Logic Unit(ALU):执行单元已满。 -| +---ALU Scheduling Queue:执行单元的调度队列已满。 -| +---Address Generation Scheduling Queue:数据地址生成单元的调度队列已满。 -| +---Retire:retire单元已满。 -| +---Physical Register Files:寄存器已满。 -| +---Branch Queue:保留分支信息的单元已满。 -| +---Float Point:FP对应的执行单元已满。 -+---BadSpeculation:由于分支预测错误导致的uops浪费。 -| +---Frontend Flush:由前端redirect事件产生的badspeculation(这块目前不准确)。 -| +---Backend Flush:由后端redirect事件产生的badspeculation。 -+---Retire Bound:Retire的uops数量。 - +---Microcode:由Microcode生成的uops数量。(这里比较特殊,Microcode/Non-Microcode,FP/Non-FP是对retire bound第二级的两种不同看法,并不是划分) - +---Non-Microcode:正常的uops数量。 - | +---Conditional Branch:条件跳转指令数量。 - | | +---Fused Branch:被Fused的Branch,例如cmp jmp的合并。 - | | +---Non-Fused Branch:正常的条件Branch。 - | +---UnConditional Branch:非条件跳转指令数量。 - | | +---Far Control Transfer:call,jump,return,IRET,syscall,sysret,exception,interrupts指令 - | | +---Near Return:RET指令 - | | +---Other:其他指令。 - | +---Multiply:乘法指令数量。 - | +---Divide:除法指令数量。 - | +---Other:其他指令数量。 - +---FP:进入浮点运算单元的uops数量。 - | +---x87 ops:部分x87指令集的uops数量。 - | +---SSE ops:部分SSE指令集的uops数量。 - | +---other:其他指令集的数量。 - +---Non-FP:未进入浮点运算单元的uops数量。 -`````` -- Gitee