乐趣区

关于硬件:深度剖析KVM年度核心技术突破Guest-PEBS

导语:在刚刚完结的寰球虚拟化顶级技术峰会 KVM Forum 上,2022 年度寰球企业 KVM 开源奉献榜正式公布。腾讯云间断六年入围,并成为奉献值最高的中国企业。其中,腾讯云自研的准确事件采样技术的虚拟化计划,被评为 KVM 年度外围冲破。本文将具体介绍该技术背地的实现过程。

什么是 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 曾经往前执行了许多指令在某些状况下,如果有分支,这两个点之间的间隔可能是几十条指令或更多。当咱们在中断服务程序中重建寄存器状态时,咱们的数据有些不精确。性能剖析是一件很难的事件,毫无疑问,特地是当开发者被采集到的性能剖析样本误导时,它变得更加艰难。

3 性能事件精准采样

采样时的指令滑动迫使开发者只能基于教训推断实际上导致性能问题的程序指令。在古代处理器中,咱们发现有一些机制专门用来解决这个问题, 在 Intel 平台上是 Precise Event Based Sampling (PEBS) 技术,在 AMD 平台上是 Instruction Based Sampling (IBS) 技术。基于事件的准确采样技术是英特尔对于一般性能事件计数器的扩大,处理器会将指令指针(连同其余信息)写入由软件指定的内存缓冲,能够显著缓解指令滑动问题,每个样本都不会收回中断,它的根本工作原理图如下:

用户抉择一组事件并指定每个计数器是启用 PEBS,所以 PEBS 计数器和一般计数器能够同时应用。CPU 应用为每个事件指定的计数器寄存器来计算指定事件的数量。并不是所有的性能事件都能够用 PEBS,每个微架构都有不同的 PEBS 可应用的事件。

当一个反对 PEBS 的硬件事件计数器溢出时,CPU 会触发一个 PEBS 辅助(而不是调用中断),执行一个事后定义的微代码。该微代码将上下文信息(称为 PEBS 记录)保留到一个特定的内存区域(PEBS 缓冲区),该缓冲区从 PEBS 基地址开始。它能够蕴含多条 PEBS 记录,PEBS 缓冲区内的尾部被称为 PEBS 索引。

PEBS 记录蕴含处理器的体系结构状态(通用寄存器、EIP 寄存器和 EFLAGS 寄存器的状态,指标地址和提早信息(如果以后指令是加载),硬件交易(tx)停止 reason 标记(如果事件与 tx 无关),以及硬件工夫戳)。PEBS 记录的格局在不同 CPU 上会不同。

只有 PEBS 索引达到 PEBS 阈值时,才会触发一个硬件性能监控中断,通知操作系统 PEBS 缓冲区简直满了,请及时读取以便进一步解决。通过应用基于硬件的微代码保留上下文信息,PEBS 比一般的性能计数器有两个劣势:

  • 缩小开销,PEBS 缩小了中断的次数,操作系统仅在 PEBS 缓冲区填满时才参加,即在大量样本可用之前没有中断。例如,如果 PEBS 缓冲区在调用中断前能蕴含 100 条 PEBS 记录,那么与一般的性能计数器相比,中断次数就缩小到 1/100。
  • 计数器寄存器溢出的工夫和保留上下文信息的工夫之间的差距比基于中断的办法小得多,这使的与惯例中断流程保留的指令指针相比,指令滑动被最小化。

只管英特尔方面认为 PEBS 产生的开销能够忽略不计,但咱们发现每次 PEBS 产生样本都会产生 200 纳秒的 CPU 开销,而且因为疾速的 PEBS 记录写入,还会产生可预测的缓存净化。

4 在云上精准采样

上述的精准采样技术在裸金属上被 Linux 内核长期反对,然而这项技术在虚拟化软件栈中始终是缺位的。内核社区从 2014 年第一次尝试开始,发现了诸多软硬件技术难题须要解决。其中一个是,须要产生 PEBS 记录的 CPU 硬件能辨别 PEBS 缓冲区地址是物理机的虚拟内存还是虚拟机的虚拟内存,防止缓冲区净化甚至信息透露,这部分难题须要硬件改变,由硬件厂商主导修复。同样在虚拟化软件栈中,除了向虚拟机出现 PEBS 设施模型的编程接口外,如何让虚拟机动静申请并占用性能监控硬件单元,在物理机上平安可控的让虚拟机用户取得简直一样的硬件性能事件探查能力,既要思考到物理机上常驻的性能剖析监控服务,又不能侵害虚拟机用户的性能剖析采样精度,都是一项项技术难题。

开源社区从来不短少挑战者,腾讯云的内核开发者重复摸索硬件厂商给出的 PEBS 修复计划,逐渐摸清平安界线,踊跃搭建、重构与重写内核性能剖析服务的虚拟化软件根底框架,一步步实现性能监控单元的各个个性,从 Intel 到 AMD,逐渐为开源 KVM 虚拟机应用 PEBS 精准性能采样技术铺平技术路线,胜利帮忙云上的开发者精确发现采样的性能事件以及导致它的程序指令。

在腾讯云的 IaaS 计算实例上,开发者曾经能够通过开源的性能剖析软件拜访实在 CPU 的硬件性能反馈数据 (比方内存读写带宽、缓存使用率、分支预测成功率、指令解析与执行速度等),比方将数据包的 ID 存储到一个很少应用的通用寄存器中,并用 PEBS 对寄存器的值进行性能事件采样跟踪,胜利辨认出基于 DPDK 简略数据包转发器时有意外提早的数据包及其链路,解决了网络提早突发抖动剖析难题。

包含 Intel PEBS 精准采样技术在内的腾讯云性能剖析技术,能够进一步剖析目标程序在一段时间内的运行状态及其实在资源需要,逐渐量化目标软件被指标硬件理论执行时的硬件占有率与使用率,相较于此前由软件系统提供的软件性能指标,腾讯云的硬件性能事件虚拟化技术运行开销更低、性能数据更实在,此类技术已帮忙云上开发者发现一个个性能瓶颈。

总结

Guest PEBS 技术计划的外围框架曾经被上游社区接管,并被其余厂商宽泛测试。作为另一块腾讯云上剖析利用性能的底层软件基石,该技术进一步加固了腾讯云性能剖析服务的技术领导力。腾讯云客户的业务开发者可基于实在量化的代码级硬件性能数据,深刻理解本身业务的性能特色,追踪业务降级的性能变动,实现部分执行优化、热点提早优化、响应长尾优化、全局调度优化,优化业务总体执行效率,升高业务总体计算成本。

值得一提的是,团队同时向 io_uring 社区奉献多个个性与优化。通过单申请承受屡次连贯个性,晋升短链接场景下的吞吐性能; 通过工作线程固定长久化,定向优化 io_uring 的线程机制,缩小锁竞争开销。目前,uringlet 等多项异步 IO 优化技术,处于社区审查迭代阶段。

退出移动版