本期焦點
越來越多用戶采用虛擬化、超融合以及云平臺環境來承載其核心業務,核心業務的高并發對性能的要求尤為嚴格,在VMware替換的熱潮下,原VMware用戶也更為關注新平臺在核心業務上的性能表現是否對標,或實現超越。深信服將通過系列解析,為大家從不同維度分享提升平臺性能的關鍵技術。
在當前用戶的核心業務系統中,訪存密集型應用越來越多,如金融行業的高頻交易系統、風險管理系統;醫療行業的電子健康記錄(EHR)系統、物流行業的倉庫管理系統等。這些系統對于訪存要求的提升,與其后端使用了很多如分布式緩存Redis、大數據處理引擎Spark,分析型數據庫HANA、AI引擎/模型等服務組件有很大關系。以Redis為例,其為內存型數據庫,內存訪問速度會直接影響其性能表現。
NUMA作為當前主流的服務器CPU架構,在NUMA架構下,如何提升訪存速度是虛擬化性能優化的重要課題之一。本文將詳細解析深信服在NUMA架構優化方面的技術,展示如何通過這些技術提升虛擬化平臺的性能,滿足用戶核心業務高并發運行的要求,以及在VMware替代過程中的性能需求。
NUMA架構背景
在早期的計算機系統中,通常只有一個處理器用于執行所有的計算任務。然而,隨著計算機應用的復雜性和需求的增加,單個處理器無法滿足高性能計算的要求,計算機系統逐漸向多核架構演進。
傳統的多核方案采用的是SMP (Symmetric Multi-Processing) 技術,即對稱多處理器結構。在SMP架構下,每個處理器的地位都是平等的,對內存的使用權限也相同。任何一個線程都可以分配到任何一個處理器上運行,在操作系統的支持下,可以達到非常好的負載均衡,讓整個系統的性能、吞吐量有較大提升。但是,由于多個核使用相同的總線訪問內存,隨著核數的增長,總線將成為瓶頸,制約系統的擴展性和性能。
NUMA架構可以很好地解決SMP架構的內存訪問瓶頸問題。在NUMA架構中,系統被劃分為多個節點,每個節點包含一個或多個處理器、本地內存和I/O設備。節點之間通過高速互連網絡進行通信,如HyperTransport (AMD) 或QuickPath Interconnect (Intel) 等,使處理器優先訪問本地內存,降低內存訪問延遲,提高了多處理器系統的性能。
在NUMA中有三種節點類型:
-
本地節點:對于某個節點中的所有CPU,此節點稱為本地節點。
-
鄰居節點:與本地節點相鄰的節點稱為鄰居節點。
-
遠端節點:非本地節點或鄰居節點的節點,稱為遠端節點。
CPU訪問不同類型節點內存的速度是不相同的,訪問本地節點的速度最快,訪問遠端節點的速度最慢,即訪問速度與節點的距離有關,距離越遠訪問速度越慢。
Christoph Lameter博士在《NUMA: An Overview》一文中指出:2013年,高端商用服務器有兩個NUMA節點,本地節點的隨機內存訪問時延為100ns左右,遠端節點的內存訪問時延需要增加50%。
NUMA引入挑戰
在linux系統中,線程作為CPU調度的基本單位,對應CPU運行隊列上的一個任務。內核會為每個任務選擇一個相對空閑的CPU,但CPU的負載是動態的,內核實現了CPU的Load Balance機制,會往相對空閑的CPU上遷移任務。也就是說,默認情況下,任務可能在不同的CPU之間遷移。
在NUMA架構下,任務可能從Node 1上的CPU遷移到Node 2上的CPU,任務訪問之前Node1上的內存數據,會造成跨節點CPU訪問。雖然linux內核提供了NUMA Balance機制,周期性的遷移任務或者內存數據到本地節點,盡可能地讓任務訪問本地節點的內存,但無法100%避免遠端內存的訪問。
在虛擬化場景下,一個虛擬機的vCPU對應操作系統上一個線程(如下圖),多個vCPU線程運行在不同NUMA節點上共享內存,或者vCPU線程在不同NUMA節點之間遷移,都會導致虛擬機跨NUMA節點訪問,內存訪問延遲增加。
業界NUMA調度技術機制
針對NUMA特性,業界主要有以下幾種常見方案:
方案1:vCPU綁定物理核
需要手動設置vCPU綁定,vm資源優先綁定在物理機的同一個NUMA Node上。
方案2:指定虛擬機綁定的NUMA節點數量
手動配置綁定的NUMA節點數,會將vCPU和內存平均分配到相應數量的NUMA節點上。
方案3:自適應分配NUMA節點
調度程序會為虛擬機自動分配NUMA節點,虛擬機的CPU會被限制在NUMA節點上運行,優先使用本地內存,提高內存局部性。虛擬機的vCPU個數可能超過NUMA節點核的數量,單個NUMA節點無法容納,會被分配到多個NUMA節點。為了提高內存局部性,支持將NUMA拓撲暴露給虛擬機,由虛擬機做最佳決策。同時在NUMA節點間遷移云主機,保證節點間的Load Balance。
從使用上看,方案1、2限制較多,使用上不是很方便,對VM的CPU數量有要求,并且靜態綁定可能導致NUMA節點間負載不均衡。因此,方案3比較常見。
深信服NUMA調度技術詳解
深信服超融合主要采用自適應的NUMA調度,自適應NUMA調度能夠做到NUMA之間的負載均衡,同時減少vCPU遠程內存訪問,提升整體的性能。
自適應的NUMA調度在不同類型應用中優化效果明顯,特別對于一些內存操作的中間件。我們在虛擬機中分別部署DM8(達夢數據庫)、Redis和memcache,分別在開啟和關閉NUMA調度的場景下執行基準測試。從測試數據看,開啟NUMA調度后,中間件性能明顯提升。
BenchmarkSQL是一個關系型數據庫的基準測試工具,通過對數據庫進行 TPC-C 標準測試,即模擬多種事務處理:新訂單、支付操作、訂單狀態查詢、發貨、庫存狀態查詢等,從而獲得最終的tpmC值。tmpC表示每分鐘可以處理多少個新訂單,值越大代表性能越好。通過BechmarkSQL V5.0來對達夢數據庫dm8運行基準測試。
下圖表示啟用NUMA調度對應用的相對性能改進,Y軸的100%表示關閉NUMA調度測出來的tmpC指標權重。
redis-benchmark是Redis官方提供的性能測試工具,我們通過redis-benchmark 對Redis V7.2.5進行壓測,在關閉/開啟NUMA調度場景下,分別測試SET/GET長度為1KB的value的QPS指標。QPS表示每秒的讀寫操作數。
測試命令及參數:
- redis-benchmark -t get -d 16 -c 100 -n 6000000 -r 60000000
- redis-benchmark -t set -d 16 -c 100 -n 6000000 -r 60000000
下圖表示啟用NUMA調度對應用的相對性能改進,Y軸的100%表示關閉NUMA調度測出來的QPS指標權重。
memaslap是Memcache自帶的性能測試工具,我們通過memaslap對Memcache V6.27壓測,在關閉/開啟NUMA調度場景下,分別測試value長度為1kb的TPS值。TPS表示每秒事務數。
測試命令及參數:
- memaslap -s 127.0.0.1:11211 -t 300s -T 8
下圖表示啟用NUMA調度對應用的相對性能改進,Y軸的100%表示關閉NUMA調度測出來的TPS指標權重。
從上面的測試數據看,對于訪存密集型應用優化效果比較明顯。以下為具體實現原理。
自適應分配NUMA節點
自適應地將虛擬機的vCPU進行劃分后調度到NUMA節點,減少虛擬機vCPU遠程內存訪問。如圖,自動為虛擬機選擇合適的NUMA節點,當虛擬機vCPU數量小于NUMA Node的核數時,則將調度到一個NUMA節點上。當虛擬機vCPU數量大于NUMA 節點的核數時,則將調度到多個NUMA Node上,同時會將vNUMA拓撲暴露給虛擬機,由虛擬機做出最佳決策。
為了保證NUMA節點的負載均衡,在放置虛擬機時,會考慮NUMA節點間的負載情況,選擇一個負載較低的節點。同時,在虛擬機運行過程中,結合NUMA節點負載,會對虛擬機在NUMA節點之間進行遷移。優先保障重要虛擬機所在NUMA節點負載更低,能夠避免CPU、內存帶寬以及Cache資源的相互搶占。
信創場景優化
信創服務器NUMA節點多,NUMA間的距離也不一致,NUMA節點的核數也相對較少。
針對信創服務器的NUMA特點,我們會識別NUMA節點之間的距離,優先將同一個虛擬機多個vNUMA放置到相近的pNUMA上。
為了進一步在信創場景下提高數據轉發性能,深信服為底層虛擬化設計開發NUMA親和性功能,即對虛擬機和數據轉發進程進行強關聯,調度到同一個NUMA節點上,使用本地內存訪問,提高數據轉發的性能。如圖,DP為數據轉發進程。
為了最大程度發揮NUMA的優勢,在存儲層面將一條完整IO上的vCPU、qemu、libnfs、aSAN等進程調度到同一個NUMA Node(如下圖),避免內存遠端數據訪問,并使用大頁內存機制提高訪存性能,降低數據處理過程中的開銷,提升IO流處理效率。
數據在從網卡緩存區傳輸到虛擬存儲的過程中,需要經過各自的CPU線程進行處理。而隨著網卡性能提升,單核CPU緩存轉存的效率成為瓶頸,且跨NUMA的遠端訪問也會降低效率。讓網卡可以被多個CPU進行處理,同時對其進行NUMA親和,既打破了緩存轉存的瓶頸,也可以降低傳輸延遲,更大程度地提升并發性能,提升虛擬機高深度大塊寫性能20%以上。
與業界方案的對比分析
- 行業支持情況:
- H廠商支持在頁面上配置虛擬機每個vCPU運行到哪個NUMA節點;S廠商不支持;VMware支持自適應NUMA調度。
深信服平臺自適應將虛擬機的vCPU進行劃分后放置到NUMA節點,減少虛擬機vCPU遠程內存訪問。相比頁面配置每個vCPU運行位置,深信服自適應NUMA調度能夠自動進行虛擬機vCPU的劃分和放置,并且在NUMA之間進行均衡,減少vCPU遠程內存訪問,提升整體的性能。
相比VMware,深信服通過創新研究院和云產品線的合作研究,深度結合我們自己的業務場景以及平臺服務情況,增加了存儲服務的NUMA調度、重要虛擬機識別、信創場景適配、虛擬機網絡親和等,提升調度效果。
總結
深信服的NUMA自適應調度基于各場景做了深度適配優化,進一步提升應用的內存訪問速度:
-
自適應將虛擬機的vCPU進行劃分后放置到NUMA節點,減少虛擬機vCPU遠程內存訪問。
-
在不同的NUMA節點之間進行遷移,保障NUMA節點之間負載均衡。
-
識別重要虛擬機,保障重要虛擬機所在NUMA節點負載更低,能夠避免CPU、內存帶寬以及Cache資源的相互搶占。
-
針對信創服務器多NUMA且NUMA間距離不一樣的場景,增加了識別NUMA節點之間的距離,優先將同一個虛擬機多個vNUMA放置到相近的pNUMA上。
-
支持虛擬機網絡親和選項,勾選后將虛擬機調度到和網絡數據面相同的NUMA節點,提高數據轉發的性能。
-
不僅對虛擬機進行NUMA調度,對存儲服務也會進行相應的NUMA調度。
UnixBench測試實例
UnixBench是一個廣泛使用的基準測試工具,用于評估類Unix系統(包括UNIX、BSD和Linux)的性能。它通過一系列測試來衡量系統的各種性能指標,如CPU、文件系統、內存和進程等。
測試環境說明:
測試結果:
在落地版本HCI 6.9.0中,我們能達到如下效果。在后續版本的優化中,我們仍持續保持該項技術效果的領先。
超融合啟用NUMA時,UnixBench測試結果如下:
同主機六臺虛擬機結果相較于S廠商高出20.2%,同主機八臺虛擬機得分相較于S廠商高出34.17%。
云話技術是深信服打造的一檔云技術內容專欄,將定期為大家推送云計算相關的技術解析、場景實踐等內容,為大家深度解析深信服在云計算領域的創新能力、技術動態、場景應用及前瞻分析等內容。