深度剖析KVM年度核心技术突破Guest PEBS
什么是Guest PEBS
针对虚拟机中CPU硬件性能事件与软件代码匹配不够准确的问题,腾讯云技术团队经过深入研究和硬件探索,自主设计了Guest PEBS(精确事件采样技术) 特性在KVM上的虚拟化方案。这项技术的独到之处在于,让虚拟机上CPU运行数据从此由“黑盒”变成了“白盒”,云上开发者从此能够随时随地洞察CPU的运行状态和数据。
与常规性能事件计数器溢出中断相比,目标代码的事件指令滑动误差被最小化,同时通过直接将多个性能事件发生时的不同CPU状态批量写入虚拟机内存中,保证了在采集大量性能事件样本时没有即时中断,大幅减小了性能事件采样开销,实现了应用程序内代码级粒度的数据可采集、性能可分析、瓶颈可优化的技术升级。
性能事件精准采样技术实现过程
作为云上开发者,在日常的开发或者运维中,经常需要在安全隔离的虚拟化环境中, 对特定或全局软件负载进行性能数据的量化、瓶颈分析与优化。业界此类需求往往通过额外的软件逻辑定期记录运行状态,手动或自动推理出前后改动的相对性能差异,这依赖于操作系统或应用内预先设定的性能分析回调点,这种方法可以提供一部分性能数据,但是会牺牲一部分性能和准确性。
在基于硬件的性能分析中,开发者往往会借助性能监控单元 (PMU) 以及性能事件计数器 (PMC)。在计算机系统中的几乎每个计算硬件单元(比如 CPU、GPU、FPGA)都有PMU,每个 PMU 往往包含一组固定功能或可选择的性能事件计数器。性能事件计数器是一种基于硬件的性能监测机制,被许多硬件供应商所支持。硬件性能事件是预先定义的,比如 指令缓存缺失的数量(ICACHE.MISSES)或 分支指令数(branch-instructions)。用户可以选择其中的一小部分让执行软件的CPU顺手来计数硬件事件,在事件发生指定次数后,计数器会溢出。每个逻辑CPU都有自己的一组性能事件计数器。这样就可以在每个逻辑核上进行性能事件分析。
1、溢出中断与采样
使用性能计数器进行性能分析是基于中断的。我们初始化一些性能事件计数器并等待它溢出,当一个计数器溢出时,性能监控单元会触发性能监控中断。操作系统收到中断通知后,几乎在触发中断的事件发生时收集被分析的应用程序的信息,即样本。例如,指令缓存缺失的数量达到一定次数后触发了性能监控中断,并在每次调用中断时保存程序指令指针,就可以知道哪个程序、函数、指令导致大量的指令缓存缺失。记录的内容取决于硬件的能力与软件的选择,但所有样本中共有的关键信息是指令指针,即程序被中断时运行在哪里。
2 采样时的指令滑动
开发者已经注意到,基于中断的采样技术即使在现代处理器上也都会引入误差,即指令滑动(skid)。进一步说,存储在每个样本中的指令指针指明了程序被中断以处理性能监控中断的当前位置,但这不一定是性能事件计数器实际溢出是的执行位置,即采样周期结束时的位置。在发出性能监视中断和捕获指令指针之间存在延迟。指令滑动可以定义为"触发性能事件的指令"与"记录样本时的指令"之间的距离。
比如我们现在有一个对 “已确认指令” 事件进行采样的性能计数器溢出,由于在事件生成和溢出中断生成之间的微体系结构中存在延迟,有时难以当场生成接近导致它的性能事件的性能监控中断。因此,在生成中断时,CPU已经往前执行了许多指令在某些情况下,如果有分支,这两个点之间的距离可能是几十条指令或更多。当我们在中断服务程序中重建寄存器状态时,我们的数据有些不准确。性能分析是一件很难的事情,毫无疑问,特别是当开发者被采集到的性能分析样本误导时,它变得更加困难。 |