在win10主机上的VMware虚拟机里的centos7执行 perf list cache,显示空:
[work@control-plane ~]$ perf list cache
List of pre-defined events (to be used in -e):
[work@control-plane ~]$
原因是cpu cache的计数需要硬件支持,在虚拟机里是需要开启虚拟化cpu性能计数器。
以VMware为例,勾选“虚拟化cpu性能计数器”:
然后重新启动VMware里的centos7,结果提示:
VMware Workstation 不支持此主机上的虚拟化性能计数器。
模块“VPMC”启动失败。
未能启动虚拟机。
原因是之前安装了wsl,启用了windows的虚拟化平台,限制了VMware的虚拟化功能。
将“windows虚拟机监控程序平台”和“虚拟机平台”关闭,如图:
然后重启windows,现在VMware里的centos7可以正常启动了,登录进去再次执行 perf list cache:
[work@control-plane ~]$ perf list cache
List of pre-defined events (to be used in -e):
L1-dcache-load-misses [Hardware cache event]
L1-dcache-loads [Hardware cache event]
L1-dcache-stores [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
branch-load-misses [Hardware cache event]
branch-loads [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-loads [Hardware cache event]
dTLB-store-misses [Hardware cache event]
dTLB-stores [Hardware cache event]
iTLB-load-misses [Hardware cache event]
iTLB-loads [Hardware cache event]
[work@control-plane ~]$
成功了!
但是此时的wsl登录显示:
请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化。
有关信息,请访问 https://aka.ms/wsl2-install
[已退出进程,代码为 4294967295 (0xffffffff)]
现在可以使用Ctrl+D关闭此终端,或按 Enter 重新启动。
所以,我们需要在wsl和VMware中二选一,我个人选择了VMware,因为wsl访问挂载的windows本地文件并没有我预想的那样快,和VMware共享文件夹比没有优势,而且wsl启用cpu计数器也需要一顿繁杂的骚操作。
开始实际使用:
首先设置允许非root用户采集内核数据:
编辑 /etc/sysctl.conf 文件,增加行:
kernel.perf_event_paranoid = -1
然后执行 sudo sysctl -p 使设置生效。
然后测试命令如下:
[work@control-plane perf]$ perf stat -e instructions,cycles,cpu-clock,cpu-migrations,context-switches,page-faults,branches,branch-misses,cache-references,cache-misses -I 1000 -a -d -- ls
# time counts unit events
0.006115780 0 instructions # 0.00 insn per cycle
0.006115780 7,410,036 cycles # 0.710 GHz
0.006115780 10.44 msec cpu-clock # 0.010 CPUs utilized
0.006115780 1 cpu-migrations # 0.096 K/sec
0.006115780 6 context-switches # 0.575 K/sec
0.006115780 271 page-faults # 0.026 M/sec
0.006115780 479,701 branches # 45.937 M/sec
0.006115780 20,213 branch-misses # 4.21% of all branches
0.006115780 55,040 cache-references # 5.271 M/sec
0.006115780 52,931 cache-misses # 96.168 % of all cache refs
0.006115780 514,225 L1-dcache-loads # 49.243 M/sec
0.006115780 62,730 L1-dcache-load-misses # 12.20% of all L1-dcache hits
0.006115780
0.006115780
[work@control-plane perf]$
从结果看,instructions 和 LLC-loads 还没有数据,暂时无解。
instructions -- 机器指令数目,Instructions/Cycles(IPC:instruction per clock)每时钟周期执行的指令数,此值越大越好,说明程序充分利用了处理器的特性。
LLC-loads -- 最后一级缓冲(Last Level Cache),LLC的后面就是内存,最后一级缓存的不命中对性能的损害尤其严重。
==========================
VMware官方关于CPU 性能监控计数器的说明:
VMware Knowledge Base
---------------------------------------------
CPU 性能监控计数器 (PMC) 为软件提供了一种监控和衡量处理器性能的方法。这些计数器通常由诸如软件探查器等工具使用。从具有 ESX 5.1 及更高版本兼容性(硬件软件 9)的虚拟机开始,可以启用虚拟性能监控计数器 (vPMC) 功能以允许在虚拟机中运行的软件访问此性能信息,如在物理机中运行一样。
启用虚拟 CPU 性能监控计数器后,以下 MSR 会虚拟化并可用于客户机操作系统。
Intel CPU
AMD CPU
null
虚拟 PMC 的访问方式与基础物理 CPU 的 PMC 访问方式相同。有关详细信息,请参见《Intel 64 和 IA-32 体系结构软件开发人员手册》和《AMD BIOS 和内核开发人员指南 (BKDG)》。
可以通过 vSphere Web Client 启用虚拟 CPU 性能监控计数器。请参见 Enable Virtual CPU Performance Counters in the vSphere Web Client。
虚拟 PMC 可以与物理 CPU 的 PMC 一样对相同的处理器核心事件进行计数。但是,由于虚拟机的虚拟 CPU 可以取消调度一段时间,并且某些客户机指令可以由管理程序仿真,而不是直接由物理 CPU 停用,因此 PMC 无法直接传递到虚拟机。相反,通过管理程序访问 PMC。通过设置 .vmx 文件中的以下虚拟机配置选项,可以控制虚拟 PMC 事件计数行为:
选项 | 描述 |
vpmc.freezeMode=hybrid |
这是默认行为。instructions retired 和 branches retired 事件仅对客户机指令进行计数。当 CPU 执行管理程序指令时,这些事件不会增加。所有其他事件都会增加,无论物理 CPU 代表虚拟机执行客户机指令还是管理程序指令。当虚拟机未在物理 CPU 上调度时,其虚拟 PMC 始终停止增加。通过这种方式,涉及客户机指令的比率的衡量指标可用于计算在虚拟机上执行这些指令的成本。例如,每个周期的指令数 (IPC) 表示物理 CUP 用来执行虚拟机的每个周期停用的客户指令的平均数量。 |
vpmc.freezeMode=guest |
仅当直接在物理 CPU 上执行客户机指令时,所有事件才会增加。当管理程序代码正在执行时,不会增加任何事件。 |
vpmc.freezeMode=vcpu |
当物理 CPU 正在用于代表虚拟机执行客户机代码或管理程序代码时,所有事件都会增加。仅当虚拟机取消调度时,事件才会停止增加。 |
在某些情况下,性能监控计数器无法虚拟化。当主机已在使用物理 CPU 性能计数器用于其他用途(如以下情况)时会出现此情况:
一般而言,如果物理 CPU PMC 正在使用中,相应的虚拟 CPU PMC 可能会不起作用,并且不可供客户机使用。通过在虚拟机打开电源时检查非零事件选择 MSR 值,客户机操作系统软件检测到不可用的常规用途的 PMC。通过检查 IA32_FIXED_CTR_CTRL MSR 中相应的非零启用位,客户机软件检测到不可用的固定功能的 PMC。
如果主机正在使用以下固定功能的性能计数器,则可以仿真该虚拟 PMC:
仿真周期计数器时,仅当编程为在操作系统和用户模式下计数时,计数器才可正常运行。此外,仿真的核心周期计数器可以对引用周期而不是核心周期进行计数。
启用虚拟 PMC 功能时,还会在虚拟机在主机间迁移之前执行其他 CPU 兼容性检查。源和目标 CPU 的性能监控事件必须可兼容。源和目标 CPU 上的性能监控事件列表必须相同。一般而言,如果两个 CPU 属于同一微架构,则它们拥有可兼容的性能监控事件。有关每个 CPU 的性能监控事件列表,请参见《Intel 64 和 IA-32 体系结构软件开发人员手册》和《AMD BIOS 和内核开发人员指南 (BKDG)》。此外,要成功迁移虚拟机,源 CPU 上可用的所有计数器也必须在目标 CPU 上可用。
无法在使用 Enhanced vMotion Compatibility 的虚拟机中启用虚拟性能监控计数器。