【问题标题】:how does KVM virtualize performance counter (PMC)?KVM 如何虚拟化性能计数器 (PMC)?
【发布时间】:2017-04-14 05:53:52
【问题描述】:

我在 Intel 平台上使用 KVM-QEMU。 我想知道 PMC/PMU 是如何在 KVM 中虚拟化的?

我对vPMC的理解如下。

由于 PMU 是共享物理资源,因此管理程序应在 VMExit/VMEnter 期间上下文保存/恢复 PMC 配置和计数器。

但在我的测试中,我感到困惑。

 (In my host Linux, the MSR of IA32_PERF_FIXed_CTRL is set to 0xb0)

首先,在启动的虚拟机中,

'wrmsr IA32_PERF_FIXed_CTRL 0x0b',在VM中启用FIXed_CTR0。 然后在VMExit记录了IA32_PERF_FIXed_CTRL的MSR,发现FIXed_CTR0没有开启。

我认为这是因为当VMExit发生时,它已经在主机上下文中,所以IA32_PERF_FIXed_CTRL的MSR是主机之一,而不是主机。

但问题是,VM 的 MSR 保存在主机中的哪个位置,以及在 VMEnter 期间何时何地将 VM 的 MSR 恢复到 CPU ???

希望我的问题很清楚。

谢谢,

【问题讨论】:

    标签: virtual-machine kvm


    【解决方案1】:

    KVM 实现了一个虚拟 PMU,它利用 Linux 的 perf 子系统进行核心 PMU 操作。它不会将主机 PMU 直接暴露给来宾。

    当您执行wrmsr IA32_PERF_FIXed_CTRL 0x0b 时,您不会写入硬件 MSR(特定于模型的寄存器),KVM 会捕获 MSR 写入并更新其虚拟 PMU 的表示。在x86.c 中寻找kvm_set_msr_common(),这最终会在pmu_intel.c 中调用intel_pmu_set_msr(),这会产生真正的魔力。另请查看struct kvm_pmu(),它是 KVM 对 PMU 的表示。

    不需要像典型的 VMCS 字段那样恢复 MSR,因为 KVM 将客户特定的 PMU 设置保存在每个 vCPU 的 struct kvm_pmu() (struct kvm_vcpu) 中。

    【讨论】:

    • 感谢Bandan的回复,让我对vPMU有了更深入的了解。正如你所说的KVM陷阱对PMU的控制MSR的访问,那么计数器MSR呢?我的意思是当客人在非root模式下运行时,计数器如何在精确模式下工作?例如,如果 guest 尝试计算“退休指令”,则需要读取 MSR 0x309 (FIXed_CTR_0),KVM 是如何模拟“退休指令”的?谢谢,
    • KVM 不“模拟” PMC。它只是向来宾公开一个虚拟 PMC。 PMC 子系统代表来宾使用 perf 执行任务。例如,检查 pmc_read_counter() 以及它如何利用 perf 核心函数 perf_event_read_value() 代表来宾读取计数器。对于如何使用 perf 内核的相关关系,请考虑一个用户进程,例如 perf 命令,它连接到内核 perf 函数以利用 PMC。
    • 多亏Bandan的回答,我离最终目标更近了。正如您所说,PMC 硬件不会暴露给 VM,所有 PMC 访问都被主机性能捕获和模拟。我的理解(可能是错的,请纠正我)是主机和来宾相互运行,所以如果来宾正在运行,则主机中的性能不应该运行。如果是真的,VMExit 到主机时一定发生了神奇的。更具体地说,我想弄清楚主机中的性能如何计算来宾中的“指令运行”。 (我将添加 printk 来尝试找出魔法)。我为你的答案投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多