Guest PMU

From KVM

Guest PMU (Performance Monitoring Unit) currently exists in the form of an out-of-tree patchset.

See the KVM Forum 2011 presentation about the state as of August 2011.

Current status

Version 2 Architectural PMU on Intel and AMD hosts is implemented and works.


Guest visible features

  • Implement Version 3 Architectural PMU
  • PEBS - Preceise Event Based Sampling - allows examining program state (problematic)
  • BTS - Branch Trace Store - allows tracing program execution accurately (problematic)


  • Do not pin perf_events. Schedule them as a group and scale PM counter value.


  • Let a guest control MSR_CORE_PERF_GLOBAL_CTRL if there is no guest monitoring event on a host.
  • Update the perf_event subsystem to make use of the PERF_GLOBAL_ENABLE MSR to speed up context switching, on both guest and host
  • Check whether perf_event does unnecessary RMW operations on MSRs, which are significantly slow in a guest
  • Add a paravirt batch MSR read/write facility, update perf to use it when available
  • Change perf to use an ordinary interrupt instead of NMI when profiling only user space, or only a guest (reduces work in NMI context)


  • NMI watchdog on a host reduces amount of performance counters available to a gust, but guest will not know this and if it will try to use all performance counters one of them will fail. It is better to disable NMI watchdog on a host.

Git repositories

Putting it all together

Compile kernel and QEMU from repositories above. Reboot into the new kernel. Make sure that nmi watchdog is disabled on a host. Run QEMU with "-cpu host". Run perf inside a guest.