深度剖析KVM年度核心技術(shù)突破Guest PEBS
【導(dǎo)語】在剛剛結(jié)束的全球虛擬化頂級技術(shù)峰會 KVM Forum 上,2022 年度全球企業(yè) KVM 開源貢獻榜正式發(fā)布。騰訊云連續(xù)六年入圍,并成為貢獻值最高的中國企業(yè)。其中,騰訊云自研的精確事件采樣技術(shù)的虛擬化方案,被評為 KVM 年度核心突破。本文將詳細(xì)介紹該技術(shù)背后的實現(xiàn)過程。
什么是Guest PEBS
針對虛擬機中CPU硬件性能事件與軟件代碼匹配不夠準(zhǔn)確的問題,騰訊云技術(shù)團隊經(jīng)過深入研究和硬件探索,自主設(shè)計了 Guest PEBS(精確事件采樣技術(shù)) 特性在 KVM 上的虛擬化方案。這項技術(shù)的獨到之處在于,讓虛擬機上 CPU 運行數(shù)據(jù)從此由“黑盒”變成了“白盒”,云上開發(fā)者從此能夠隨時隨地洞察 CPU 的運行狀態(tài)和數(shù)據(jù)。
與常規(guī)性能事件計數(shù)器溢出中斷相比,目標(biāo)代碼的事件指令滑動誤差被最小化,同時通過直接將多個性能事件發(fā)生時的不同 CPU 狀態(tài)批量寫入虛擬機內(nèi)存中,保證了在采集大量性能事件樣本時沒有即時中斷,大幅減小了性能事件采樣開銷,實現(xiàn)了應(yīng)用程序內(nèi)代碼級粒度的數(shù)據(jù)可采集、性能可分析、瓶頸可優(yōu)化的技術(shù)升級。
性能事件精準(zhǔn)采樣技術(shù)實現(xiàn)過程
作為云上開發(fā)者,在日常的開發(fā)或者運維中,經(jīng)常需要在安全隔離的虛擬化環(huán)境中, 對特定或全局軟件負(fù)載進行性能數(shù)據(jù)的量化、瓶頸分析與優(yōu)化。業(yè)界此類需求往往通過額外的軟件邏輯定期記錄運行狀態(tài),手動或自動推理出前后改動的相對性能差異,這依賴于操作系統(tǒng)或應(yīng)用內(nèi)預(yù)先設(shè)定的性能分析回調(diào)點,這種方法可以提供一部分性能數(shù)據(jù),但是會犧牲一部分性能和準(zhǔn)確性。
在基于硬件的性能分析中,開發(fā)者往往會借助性能監(jiān)控單元 (PMU) 以及性能事件計數(shù)器 (PMC)。在計算機系統(tǒng)中的幾乎每個計算硬件單元(比如 CPU、GPU、FPGA)都有 PMU,每個 PMU 往往包含一組固定功能或可選擇的性能事件計數(shù)器。性能事件計數(shù)器是一種基于硬件的性能監(jiān)測機制,被許多硬件供應(yīng)商所支持。硬件性能事件是預(yù)先定義的,比如 指令緩存缺失的數(shù)量(ICACHE.MISSES)或 分支指令數(shù)(branch-instructions)。用戶可以選擇其中的一小部分讓執(zhí)行軟件的 CPU 順手來計數(shù)硬件事件,在事件發(fā)生指定次數(shù)后,計數(shù)器會溢出。每個邏輯 CPU 都有自己的一組性能事件計數(shù)器。這樣就可以在每個邏輯核上進行性能事件分析。
使用性能計數(shù)器進行性能分析是基于中斷的。我們初始化一些性能事件計數(shù)器并等待它溢出,當(dāng)一個計數(shù)器溢出時,性能監(jiān)控單元會觸發(fā)性能監(jiān)控中斷。操作系統(tǒng)收到中斷通知后,幾乎在觸發(fā)中斷的事件發(fā)生時收集被分析的應(yīng)用程序的信息,即樣本。例如,指令緩存缺失的數(shù)量達到一定次數(shù)后觸發(fā)了性能監(jiān)控中斷,并在每次調(diào)用中斷時保存程序指令指針,就可以知道哪個程序、函數(shù)、指令導(dǎo)致大量的指令緩存缺失。記錄的內(nèi)容取決于硬件的能力與軟件的選擇,但所有樣本中共有的關(guān)鍵信息是指令指針,即程序被中斷時運行在哪里。
開發(fā)者已經(jīng)注意到,基于中斷的采樣技術(shù)即使在現(xiàn)代處理器上也都會引入誤差,即指令滑動(skid)。進一步說,存儲在每個樣本中的指令指針指明了程序被中斷以處理性能監(jiān)控中斷的當(dāng)前位置,但這不一定是性能事件計數(shù)器實際溢出是的執(zhí)行位置,即采樣周期結(jié)束時的位置。在發(fā)出性能監(jiān)視中斷和捕獲指令指針之間存在延遲。指令滑動可以定義為"觸發(fā)性能事件的指令"與"記錄樣本時的指令"之間的距離。
比如我們現(xiàn)在有一個對 “已確認(rèn)指令” 事件進行采樣的性能計數(shù)器溢出,由于在事件生成和溢出中斷生成之間的微體系結(jié)構(gòu)中存在延遲,有時難以當(dāng)場生成接近導(dǎo)致它的性能事件的性能監(jiān)控中斷。因此,在生成中斷時,CPU 已經(jīng)往前執(zhí)行了許多指令在某些情況下,如果有分支,這兩個點之間的距離可能是幾十條指令或更多。當(dāng)我們在中斷服務(wù)程序中重建寄存器狀態(tài)時,我們的數(shù)據(jù)有些不準(zhǔn)確。性能分析是一件很難的事情,毫無疑問,特別是當(dāng)開發(fā)者被采集到的性能分析樣本誤導(dǎo)時,它變得更加困難。
采樣時的指令滑動迫使開發(fā)者只能基于經(jīng)驗推斷實際上導(dǎo)致性能問題的程序指令。在現(xiàn)代處理器中,我們發(fā)現(xiàn)有一些機制專門用來解決這個問題, 在 Intel 平臺上是 Precise Event Based Sampling (PEBS)技術(shù),在 AMD 平臺上是Instruction Based Sampling (IBS) 技術(shù)。基于事件的精確采樣技術(shù)是英特爾對于普通性能事件計數(shù)器的擴展,處理器會將指令指針(連同其他信息)寫入由軟件指定的內(nèi)存緩沖,可以顯著緩解指令滑動問題,每個樣本都不會發(fā)出中斷,它的基本工作原理圖如下:
用戶選擇一組事件并指定每個計數(shù)器是啟用 PEBS,所以PEBS 計數(shù)器和普通計數(shù)器可以同時使用。CPU 使用為每個事件指定的計數(shù)器寄存器來計算指定事件的數(shù)量。并不是所有的性能事件都可以用 PEBS,每個微架構(gòu)都有不同的 PEBS 可使用的事件。
當(dāng)一個支持 PEBS 的硬件事件計數(shù)器溢出時,CPU 會觸發(fā)一個 PEBS 輔助(而不是調(diào)用中斷),執(zhí)行一個預(yù)先定義的微代碼。該微代碼將上下文信息(稱為 PEBS 記錄)保存到一個特定的內(nèi)存區(qū)域(PEBS 緩沖區(qū)),該緩沖區(qū)從 PEBS 基地址開始。它可以包含多條 PEBS 記錄,PEBS 緩沖區(qū)內(nèi)的尾部被稱為 PEBS 索引。
PEBS 記錄包含處理器的體系結(jié)構(gòu)狀態(tài)(通用寄存器、EIP 寄存器和 EFLAGS 寄存器的狀態(tài),目標(biāo)地址和延遲信息(如果當(dāng)前指令是加載),硬件交易(tx)中止 reason 標(biāo)志(如果事件與 tx 有關(guān)),以及硬件時間戳)。PEBS 記錄的格式在不同CPU上會不同。
只有PEBS 索引達到 PEBS 閾值時,才會觸發(fā)一個硬件性能監(jiān)控中斷,告訴操作系統(tǒng) PEBS 緩沖區(qū)幾乎滿了,請及時讀取以便進一步處理。通過使用基于硬件的微代碼保存上下文信息,PEBS 比普通的性能計數(shù)器有兩個優(yōu)勢:
-
減少開銷,PEBS 減少了中斷的次數(shù),操作系統(tǒng)僅在 PEBS 緩沖區(qū)填滿時才參與,即在大量樣本可用之前沒有中斷。例如,如果 PEBS 緩沖區(qū)在調(diào)用中斷前能包含 100 條 PEBS 記錄,那么與普通的性能計數(shù)器相比,中斷次數(shù)就減少到 1/100。
-
計數(shù)器寄存器溢出的時間和保存上下文信息的時間之間的差距比基于中斷的方法小得多,這使的與常規(guī)中斷流程保存的指令指針相比,指令滑動被最小化。
盡管英特爾方面認(rèn)為 PEBS 產(chǎn)生的開銷可以忽略不計,但我們發(fā)現(xiàn)每次 PEBS 產(chǎn)生樣本都會產(chǎn)生 200 納秒的 CPU 開銷,而且由于快速的PEBS記錄寫入,還會產(chǎn)生可預(yù)測的緩存污染。
在云上精準(zhǔn)采樣
上述的精準(zhǔn)采樣技術(shù)在裸金屬上被 Linux 內(nèi)核長期支持,但是這項技術(shù)在虛擬化軟件棧中一直是缺位的。內(nèi)核社區(qū)從2014年第一次嘗試開始,發(fā)現(xiàn)了諸多軟硬件技術(shù)難題需要解決。其中一個是,需要產(chǎn)生PEBS記錄的CPU硬件能區(qū)分PEBS緩沖區(qū)地址是物理機的虛擬內(nèi)存還是虛擬機的虛擬內(nèi)存,避免緩沖區(qū)污染甚至信息泄漏,這部分難題需要硬件改動,由硬件廠商主導(dǎo)修復(fù)。同樣在虛擬化軟件棧中,除了向虛擬機呈現(xiàn)PEBS設(shè)備模型的編程接口外,如何讓虛擬機動態(tài)申請并占用性能監(jiān)控硬件單元,在物理機上安全可控的讓虛擬機用戶獲得幾乎一樣的硬件性能事件探查能力,既要考慮到物理機上常駐的性能分析監(jiān)控服務(wù),又不能損害虛擬機用戶的性能分析采樣精度,都是一項項技術(shù)難題。
開源社區(qū)從來不缺少挑戰(zhàn)者,騰訊云的內(nèi)核開發(fā)者反復(fù)探索硬件廠商給出的PEBS修復(fù)方案,逐步摸清安全界限,積極搭建、重構(gòu)與重寫內(nèi)核性能分析服務(wù)的虛擬化軟件基礎(chǔ)框架,一步步實現(xiàn)性能監(jiān)控單元的各個特性,從Intel到AMD,逐步為開源KVM虛擬機使用PEBS精準(zhǔn)性能采樣技術(shù)鋪平技術(shù)道路,成功幫助云上的開發(fā)者準(zhǔn)確發(fā)現(xiàn)采樣的性能事件以及導(dǎo)致它的程序指令。
在騰訊云的IaaS計算實例上,開發(fā)者已經(jīng)可以通過開源的性能分析軟件訪問真實CPU的硬件性能反饋數(shù)據(jù) (比如內(nèi)存讀寫帶寬、緩存使用率、分支預(yù)測成功率、指令解析與執(zhí)行速度等),比如將數(shù)據(jù)包的 ID 存儲到一個很少使用的通用寄存器中,并用 PEBS 對寄存器的值進行性能事件采樣跟蹤,成功識別出基于 DPDK 簡單數(shù)據(jù)包轉(zhuǎn)發(fā)器時有意外延遲的數(shù)據(jù)包及其鏈路,解決了網(wǎng)絡(luò)延遲突發(fā)抖動分析難題。
包括Intel PEBS精準(zhǔn)采樣技術(shù)在內(nèi)的騰訊云性能分析技術(shù),可以進一步分析目標(biāo)程序在一段時間內(nèi)的運行狀態(tài)及其真實資源需求,逐步量化目標(biāo)軟件被目標(biāo)硬件實際執(zhí)行時的硬件占有率與使用率,相較于此前由軟件系統(tǒng)提供的軟件性能指標(biāo),騰訊云的硬件性能事件虛擬化技術(shù)運行開銷更低、性能數(shù)據(jù)更真實,此類技術(shù)已幫助云上開發(fā)者發(fā)現(xiàn)一個個性能瓶頸。
總結(jié)
Guest PEBS 技術(shù)方案的核心框架已經(jīng)被上游社區(qū)接收,并被其他廠商廣泛測試。作為另一塊騰訊云上分析應(yīng)用性能的底層軟件基石,該技術(shù)進一步加固了騰訊云性能分析服務(wù)的技術(shù)領(lǐng)導(dǎo)力。騰訊云客戶的業(yè)務(wù)開發(fā)者可基于真實量化的代碼級硬件性能數(shù)據(jù),深入了解自身業(yè)務(wù)的性能特征,追蹤業(yè)務(wù)升級的性能變化,實現(xiàn)局部執(zhí)行優(yōu)化、熱點延遲優(yōu)化、響應(yīng)長尾優(yōu)化、全局調(diào)度優(yōu)化,優(yōu)化業(yè)務(wù)總體執(zhí)行效率,降低業(yè)務(wù)總體計算成本。
值得一提的是,團隊同時向 io_uring 社區(qū)貢獻多個特性與優(yōu)化。通過單請求接受多次連接特性,提升短鏈接場景下的吞吐性能; 通過任務(wù)線程固定持久化,定向優(yōu)化 io_uring 的線程機制,減少鎖競爭開銷。目前,uringlet 等多項異步 IO 優(yōu)化技術(shù),處于社區(qū)審查迭代階段。
本文來自微信公眾號“CSDN”(ID:CSDNnews),作者:李萬鵬,36氪經(jīng)授權(quán)發(fā)布。