深度剖析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優化技術,處於社群審查迭代階段。