国产精一区二区_午夜视频99_免费白白视频_中文字幕一区免费

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

CSDN
+ 關注
2022-09-21 17:57
991次閱讀

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

【導語】在剛剛結束的全球虛擬化頂級技術峰會 KVM Forum 上,2022 年度全球企業 KVM 開源貢獻榜正式發布。騰訊云連續六年入圍,并成為貢獻值最高的中國企業。其中,騰訊云自研的精確事件采樣技術的虛擬化方案,被評為 KVM 年度核心突破。本文將詳細介紹該技術背后的實現過程。

作者 | 騰訊云專家工程師 李萬鵬        責編 | 張紅月
出品 | CSDN(ID:CSDNnews)

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

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

什么是Guest PEBS

針對虛擬機中CPU硬件性能事件與軟件代碼匹配不夠準確的問題,騰訊云技術團隊經過深入研究和硬件探索,自主設計了 Guest PEBS(精確事件采樣技術) 特性在 KVM 上的虛擬化方案。這項技術的獨到之處在于,讓虛擬機上 CPU 運行數據從此由“黑盒”變成了“白盒”,云上開發者從此能夠隨時隨地洞察 CPU 的運行狀態和數據。

與常規性能事件計數器溢出中斷相比,目標代碼的事件指令滑動誤差被最小化,同時通過直接將多個性能事件發生時的不同 CPU 狀態批量寫入虛擬機內存中,保證了在采集大量性能事件樣本時沒有即時中斷,大幅減小了性能事件采樣開銷,實現了應用程序內代碼級粒度的數據可采集、性能可分析、瓶頸可優化的技術升級。

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

性能事件精準采樣技術實現過程

作為云上開發者,在日常的開發或者運維中,經常需要在安全隔離的虛擬化環境中, 對特定或全局軟件負載進行性能數據的量化、瓶頸分析與優化。業界此類需求往往通過額外的軟件邏輯定期記錄運行狀態,手動或自動推理出前后改動的相對性能差異,這依賴于操作系統或應用內預先設定的性能分析回調點,這種方法可以提供一部分性能數據,但是會犧牲一部分性能和準確性。

在基于硬件的性能分析中,開發者往往會借助性能監控單元 (PMU) 以及性能事件計數器 (PMC)。在計算機系統中的幾乎每個計算硬件單元(比如 CPU、GPU、FPGA)都有 PMU,每個 PMU 往往包含一組固定功能或可選擇的性能事件計數器。性能事件計數器是一種基于硬件的性能監測機制,被許多硬件供應商所支持。硬件性能事件是預先定義的,比如 指令緩存缺失的數量(ICACHE.MISSES)或 分支指令數(branch-instructions)。用戶可以選擇其中的一小部分讓執行軟件的 CPU 順手來計數硬件事件,在事件發生指定次數后,計數器會溢出。每個邏輯 CPU 都有自己的一組性能事件計數器。這樣就可以在每個邏輯核上進行性能事件分析。

使用性能計數器進行性能分析是基于中斷的。我們初始化一些性能事件計數器并等待它溢出,當一個計數器溢出時,性能監控單元會觸發性能監控中斷。操作系統收到中斷通知后,幾乎在觸發中斷的事件發生時收集被分析的應用程序的信息,即樣本。例如,指令緩存缺失的數量達到一定次數后觸發了性能監控中斷,并在每次調用中斷時保存程序指令指針,就可以知道哪個程序、函數、指令導致大量的指令緩存缺失。記錄的內容取決于硬件的能力與軟件的選擇,但所有樣本中共有的關鍵信息是指令指針,即程序被中斷時運行在哪里。

開發者已經注意到,基于中斷的采樣技術即使在現代處理器上也都會引入誤差,即指令滑動(skid)。進一步說,存儲在每個樣本中的指令指針指明了程序被中斷以處理性能監控中斷的當前位置,但這不一定是性能事件計數器實際溢出是的執行位置,即采樣周期結束時的位置。在發出性能監視中斷和捕獲指令指針之間存在延遲。指令滑動可以定義為"觸發性能事件的指令"與"記錄樣本時的指令"之間的距離。

比如我們現在有一個對 “已確認指令” 事件進行采樣的性能計數器溢出,由于在事件生成和溢出中斷生成之間的微體系結構中存在延遲,有時難以當場生成接近導致它的性能事件的性能監控中斷。因此,在生成中斷時,CPU 已經往前執行了許多指令在某些情況下,如果有分支,這兩個點之間的距離可能是幾十條指令或更多。當我們在中斷服務程序中重建寄存器狀態時,我們的數據有些不準確。性能分析是一件很難的事情,毫無疑問,特別是當開發者被采集到的性能分析樣本誤導時,它變得更加困難。

采樣時的指令滑動迫使開發者只能基于經驗推斷實際上導致性能問題的程序指令。在現代處理器中,我們發現有一些機制專門用來解決這個問題, 在 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記錄寫入,還會產生可預測的緩存污染。

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

在云上精準采樣

上述的精準采樣技術在裸金屬上被 Linux 內核長期支持,但是這項技術在虛擬化軟件棧中一直是缺位的。內核社區從2014年第一次嘗試開始,發現了諸多軟硬件技術難題需要解決。其中一個是,需要產生PEBS記錄的CPU硬件能區分PEBS緩沖區地址是物理機的虛擬內存還是虛擬機的虛擬內存,避免緩沖區污染甚至信息泄漏,這部分難題需要硬件改動,由硬件廠商主導修復。同樣在虛擬化軟件棧中,除了向虛擬機呈現PEBS設備模型的編程接口外,如何讓虛擬機動態申請并占用性能監控硬件單元,在物理機上安全可控的讓虛擬機用戶獲得幾乎一樣的硬件性能事件探查能力,既要考慮到物理機上常駐的性能分析監控服務,又不能損害虛擬機用戶的性能分析采樣精度,都是一項項技術難題。

開源社區從來不缺少挑戰者,騰訊云的內核開發者反復探索硬件廠商給出的PEBS修復方案,逐步摸清安全界限,積極搭建、重構與重寫內核性能分析服務的虛擬化軟件基礎框架,一步步實現性能監控單元的各個特性,從Intel到AMD,逐步為開源KVM虛擬機使用PEBS精準性能采樣技術鋪平技術道路,成功幫助云上的開發者準確發現采樣的性能事件以及導致它的程序指令。

在騰訊云的IaaS計算實例上,開發者已經可以通過開源的性能分析軟件訪問真實CPU的硬件性能反饋數據 (比如內存讀寫帶寬、緩存使用率、分支預測成功率、指令解析與執行速度等),比如將數據包的 ID 存儲到一個很少使用的通用寄存器中,并用 PEBS 對寄存器的值進行性能事件采樣跟蹤,成功識別出基于 DPDK 簡單數據包轉發器時有意外延遲的數據包及其鏈路,解決了網絡延遲突發抖動分析難題。

包括Intel PEBS精準采樣技術在內的騰訊云性能分析技術,可以進一步分析目標程序在一段時間內的運行狀態及其真實資源需求,逐步量化目標軟件被目標硬件實際執行時的硬件占有率與使用率,相較于此前由軟件系統提供的軟件性能指標,騰訊云的硬件性能事件虛擬化技術運行開銷更低、性能數據更真實,此類技術已幫助云上開發者發現一個個性能瓶頸。

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

總結

Guest PEBS 技術方案的核心框架已經被上游社區接收,并被其他廠商廣泛測試。作為另一塊騰訊云上分析應用性能的底層軟件基石,該技術進一步加固了騰訊云性能分析服務的技術領導力。騰訊云客戶的業務開發者可基于真實量化的代碼級硬件性能數據,深入了解自身業務的性能特征,追蹤業務升級的性能變化,實現局部執行優化、熱點延遲優化、響應長尾優化、全局調度優化,優化業務總體執行效率,降低業務總體計算成本。

值得一提的是,團隊同時向 io_uring 社區貢獻多個特性與優化。通過單請求接受多次連接特性,提升短鏈接場景下的吞吐性能; 通過任務線程固定持久化,定向優化 io_uring 的線程機制,減少鎖競爭開銷。目前,uringlet 等多項異步 IO 優化技術,處于社區審查迭代階段。

本文來自微信公眾號“CSDN”(ID:CSDNnews),作者:李萬鵬,36氪經授權發布。

資深作者CSDN
0
消息通知
咨詢入駐
商務合作