导语:在刚刚结束的全球虚拟化顶级技能峰会 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) 技能。根据事情的准确采样技能是英特尔关于一般功用事情计数器的扩展,处理器会将指令指针(连同其他信息)写入由软件指定的内存缓冲,能够显著缓解指令滑动问题,每个样本都不会宣布中止,它的根本工作原理图如下:

深度剖析KVM年度核心技术突破Guest PEBS

用户挑选一组事情并指定每个计数器是启用 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优化技能,处于社区检查迭代阶段。