This document proposes techniques for profiling the performance of virtual machines (VMs) and their guests. It discusses three levels of profiling: (1) native profiling of individual applications, (2) guest-wide profiling of applications within a VM, and (3) system-wide profiling of both VMs and their guests. The authors describe challenges in profiling at each level and present solutions including using hardware performance counters, interrupt delivery methods, and VM multiplexing. Prototypes are implemented for KVM and QEMU hypervisors. Evaluation shows profiling overhead is low at 0.04-0.94% and results are accurate compared to native profiling.