虛擬化的算術題:4個CPU不再只是4個CPU
譯文虛擬化技術優勢眾多,其中最顯著的自然要數隨時為虛擬機添加CPU與內存的能力。想讓自己的虛擬環境瞬間性能爆表?只要為其分配更多內存容量,就能得到令人滿意的結果。對于系統管理員而言,這簡直是夢幻般的解決方案——面對運算量巨大的任務,我們不必再進行停機升級和煩人的斷線維護,也無需擔心重要資料因重新啟動而丟失,這在無形中消除了日常工作中的巨大麻煩。
然而,無論是動態方式還是其它類似方式,為虛擬機分配額外CPU與內存在某些情況下還是可能對服務器造成潛在危害。在方便之余,我們還必須正確認真設備的工作負載與操作系統運行狀態。
這一切都取決于大家平時所執行的工作負載類型、操作系統高度方案以及虛擬機中的虛擬CPU布局。虛擬CPU在資源分配方面有著得天獨厚的優勢,其便于上手且流程簡單的特性贏得無數喝彩與人氣。設定虛擬CPU數量然后導入新配置,虛擬機性能直接就會邁上新臺階。不過隨著物理CPU運算核心數量的不斷攀升以及NUMA的普及,以往簡單的選擇如今也開始復雜起來。現在,幾乎每款主流管理程序都提供多套虛擬CPU備選方案。
舉例來說,如果我們要為自己的虛擬機設置四個虛擬CPU,那么可行方案就有四個單核CPU、兩個雙核CPU和一個四核CPU三種。三者的運行機制差異很大,這些不同之處很可能會影響虛擬服務器中操作系統的資源調度機制,進而給管理工作帶來諸多問題。
虛擬機的魔力
由于缺乏快捷的硬性衡量標準,因此我們很難從上述方案中直接做出選擇。要做出適合業務需求的判斷,我們必須認真考量工作負載配置文件、資源調度機制以及操作系統或內核版本。早期版本的系統內核通常不太善于處理多核心CPU,因此在這類情況下我們最好選擇單核CPU選項。新內核及操作系統版本則更偏向于多核心CPU,擅長利用多計算單元進行復雜的任務處理。
除此之外,工作負載本身的性質同樣影響重大。單線程與多線程工作負載在處理具體實例時所采取的方式有所不同,也許在某些負載中細微到足以忽略不計的差別,卻可能在其它環境下引發難以估量的后續問題。
現代操作系統需要與NUMA緊密契合。在充分利用NUMA的優勢之下,內存訪問速度將得到顯著提高,進而大大加快處理器與內存密集型處理流程的運行周期。當CPU核心只與由其控制的內存交互時,由于無需跨越到其它CPU轄區內進行內存分配及調用,速度自然會大大加快。
這是一種基礎特性而且很容易理解,就像去街對面的商店肯定比跑到其它城鎮購物更快捷。然而當我們把管理程序塞入操作系統底層之后,CPU核心與內存分配之間的關系卻變得更為復雜且難以捉摸。
根據管理程序為虛擬服務器提交CPU的不同方式,操作系統可能會認為每個CPU擁有其獨立內存控制器或者四個核心共享一套內存控制器。在這種情況下,虛擬機管理程序會不斷查詢虛擬服務器的內存分配狀況,同時評估是否需要為當前處理虛擬機工作負載的CPU分配更多活動內存。當上述狀況同時出現時,虛擬機的整體性能可能會隨之大幅下降——事實上這種失速現象相當常見。
金玉良言
幸運的是如今我們已經找到了能夠確定當前工作負載類型的有效方法——測試,情況一測咱就有數了。首先建立多套虛擬服務器,并為其設定彼此不同的虛擬CPU布局,然后運行相對較簡單的日常工作負載。接下來在更深層面的調整中,我們可以在虛擬機管理程序級別進行NUMA分配,并測試不同情況下的具體運行效果,最終確定合適的參數分配方案。
舉例來說,VMware vSphere就擁有asnuma.vcpu.maxPerMachineNode 和 numa.vcpu.maxPerClient兩條調整參數,其作用在于允許我們調整可以駐留在單個NUMA節點中的最大虛擬CPU數量以及由管理程序作為整體控制的最大虛擬CPU數量。當然以上二者只是其中一部分,另有一些能夠在特殊情況下發揮巨大作用的其它參數。總而言之,大多數情況下我們只要進行少量調試與檢測工作,就能為日常工作負載找到最合適的性能解決方案。
這絕不算是什么新概念。早在18個月之前,我就已經在InfoWorld網站的虛擬化方案評析文章中提到過這種性能調整模式,并以紅帽企業級虛擬化產品為例展開過討論。不過那時候我只是把它當成大家容易忽視的知識要點來談,但今天我則把它作為實實在在的必要管理技能。在大家創建并調整自己的虛擬機時,請記住在虛擬CPU領域,同樣的數字“四”卻可能包含著完全不同的意義。花點時間做好測試工作,未來的執行流程可能因此變得更加順暢——這就是磨刀不誤砍柴工的道理。