我們往往認為物理服務器是內存與CPU核心的集合,但虛擬化引發了沖突,因為有多個核工作在共享的內存空間內。如果虛擬化管理員沒有完全掌握NUMA節點的規模及其對大型虛擬機的影響,那么虛擬機運行時可能會導致性能問題。
Intel在CPU內處理內存
自Nehalem芯片起,Intel改變了其處理器微架構。Intel在CPU芯片內而不是由北橋芯片對內存進行管理。在該架構中,一個特別的雙內聯內存 模塊(DIMM)只會連接到一個CPU插槽。為使內存連接另一個CPU插槽,必須通過連接CPU插槽的互聯總線請求內存頁,然后遠程CPU插槽再訪問 DIMM并返回數據。
由于經過了其他總線,所以訪問遠程DIMM要比本地DIMM的速度慢,這導致了非統一內存訪問(NUMA)。一個插槽內的CPU核心與本地內存的組合稱為NUMA節點;物理服務器的BIOS在啟動時將該信息傳輸給ESXi服務器。
vSphere如何將虛擬機遷移到NUMA節點
讓我們舉個例子:一臺虛擬主機可能有4個插槽,每個插槽有6個核心、16內存插槽,內存大小為8GB。因此整臺主機有24個核心、128GB的內存。每個 NUMA節點將有六個CPU核心、32GB的內存。看起來運行配置了4個vCPU、40GB 內存或者配置了8個vCPU以及24GB內存的虛擬機應該不成問題,但是上述虛擬機配置給VMkernel出了難題而且可能會引起潛在的性能問題。
自動ESX 3起,vSphere hypervisor就能夠感知NUMA,而且其試圖將虛擬機保留在單個NUMA節點內以提供最好以及最穩定的性能。大型虛擬機可能不適合保留在單個 NUMA節點上。配置了4個vCPU以及40GB內存的虛擬機可能不適合我所列舉的NUMA節點。該大型虛擬機需要在兩個NUMA節點之間進行擴展。大多 數內存將位于一個NUMA節點內,但是某些內存將會位于另一個NUMA節點內,因此訪問速度會有些慢。所有的CPU將會位于第一個節點內,這樣所有的 vCPU能夠以相同的速度訪問內存頁。虛擬機配置8個vCPU以及24GB內存非常常見,盡管其內存位于一個NUMA節點,但兩個vcPU將會被安排到另 一個節點上。對于這兩個vCPU來說,所有的內存都不在本地,因此其運行速度會比較慢。
知道應用負載以及架構至關重要。如果高配置虛擬機能夠拆分為兩個小虛擬機,那么每個虛擬機將會位于一個NUMA節點內,你很可能會獲得更好的性能。至少,你將會得到更為一致的結果,在發生故障時將會有利于故障診斷。
如果應用能夠感知NUMA,那就更好了。vSphere使用vNUMA可以創建能夠感知NUMA的虛擬機。該虛擬機將會被分割為虛擬NUMA節點,每個 vNUMA節點將會被放置到一個不同的物理NUMA節點。盡管虛擬機仍舊在兩個NUMA節點之間擴展,但虛擬機內的操作系統和應用能夠感知NUMA,資源 使用將會得到優化。
管理員需要了解硬件配置
了解硬件也很重要。這意味著要了解物理服務器的NUMA節點規模并使虛擬機與節點規模相匹配。集群中的所有主機擁有相同的NUMA節點規模,保持集群的一 致性同樣很重要,因為與擁有六核CPU的NUMA節點相匹配的虛擬機可能不適合四核CPU主機。這同樣會影響你分配給虛擬機的vCPU的數量;如果有幾臺 虛擬機使用了兩個以上的vCPU,那么一定要確保多個虛擬機與NUMA的核心數相匹配。比如6核NUMA節點適合配置了2個vCPU以及3個vCPU的虛 擬機,可能不適合配置了4個vCPU的虛擬機,配置了4個vCPU的虛擬機更適合CPU配置為4核以及8核的NUMA節點。
和很多事情將會影響vSphere設計類似,個人意識是避免問題的關鍵。小型虛擬機不需要了解或者關心NUMA但是大型以及核心的虛擬機需要感知NUMA才能夠高效運行。在設計大型虛擬機時要適合主機的NUMA架構,并確保HA和DRS集群NUMA節點規模的一致性。