性能優化調優 | 如何分配虛擬機CPU拓撲會得到較好的性能


文章轉自:原創: 楊建旭,https://mp.weixin.qq.com/s/ZtwKmG3xCsTShJni6xTCmw


對於物理機來說,CPU有socket、Core、thread的概念,一個linux虛擬機上面同樣有這些信息,這些信息是什么含義,和物理機之間有多少對應關系呢?如何分配CPU拓撲,會得到較好的性能?


物理CPU

首先介紹一下物理CPU的概念:

一個服務器可以有多個socket

一個socket(插槽)可以插一個chip。

一個chip里面可以有N個core(核)

一個核里面可以有1個CPU線程,如果開啟超線程, CPU線程=核*2

下面是一個物理機的CPU信息

上面這些信息是x86 CPU。如果是Power的CPU,超線程可以一個核超出來2個、4個、8個(根據機器型號)。同時,還有一個drawer(抽屜)的概念。一個抽屜里面有N個socket,一個服務器可以有多個抽屜。

虛擬機的CPU


對於虛擬機來說,操作系統看到的CPU信息都是虛擬的,但操作系統認為他們是物理的。

查看虛擬機CPU的方法和物理機沒什么區別,一般用lscpu或者cat /proc/cpuinfo來查看

拿一台虛擬的linux舉例

這個是linux操作系統看到的CPU信息,linux操作系統並不知道自己跑在一個虛擬機上,雖然看到的CPU都是虛擬的,但linux認為這些都是真的,因此在進程調度上,也會按照這個信息去調度。

CPU(s): 8   :一共8個邏輯CPU,即8個vCPU


Thread(s) per core: 1:每個核有幾個線程,分配虛擬機的時候,拓撲默認就是1


Core(s) per socket: 1:每個插槽(一個插槽可以插一個cpu chip)里面有幾個核,分配虛擬機的時候,拓撲默認就是1


Socket(s): 8:有幾個插槽(一個插槽可以插一個cpu chip)


這一段的信息是,該虛擬機一共有8個chip,每個chip里有1個核,每個核里有1個thread。這樣就是8*1*1=8個thread,即8個邏輯CPU,即8個vCPU。

注:這里的socket、core都是虛的。


接下來,看cpuinfo里面的信息(和lscpu是一致的)




processor:
0 :虛擬CPU(vCPU)的ID,OS以為這是物理的,其實是虛擬的。這里的processor不是虛擬核,而是虛擬CPU線程。因為如果如果分配虛擬機的時候,虛擬核開啟超線程(2),那么虛擬CPU線程=虛擬核2


physical id: 0
:這個是虛擬socket(chip)的ID。在本例中,給虛擬機分配了8個sockets,那么physical id會有8個,分別是0-7.


siblings: 1
:一個虛擬socket上有多少虛擬CPU線程。如果=1,那么只有1個thread(processor)。說明這個socket上只有一個core,這個core里只有一個thread(processor)。


core id: 0
:這是虛擬core的id號,每個虛擬core可以有1個虛擬thread(processor),如果分配虛擬機的時候,虛擬核開啟超線程(2),那么每個虛擬core可以有2個虛擬thread(processor)


cpu cores: 虛擬core的數量


收集全部cpuinfo的信息如下











CPU拓撲






即分配多少邏輯CPU,這些邏輯CPU是如何通過socket、core、超線程組合出來的。




分配虛擬機時,需要指定多少socket(插槽)、每個插槽有多少core,core有沒有超線程。










不同的拓撲






同樣是分配8個邏輯CPU,也可以采用其他的拓撲。




本例中,分配的方式我們再回顧一下


CPU(s):      
      8


Thread(s) per core:    1


Core(s) per socket:    1


Socket(s):    
      8


分配8個vCPU:該虛擬機一共有8個chip,每個chip里有1個核,每個核里有1個thread。這樣就是81*1=8個thread,即8個vCPU。




換成拓撲B:


CPU(s):     
               8


Thread(s) per core:    2


Core(s) per socket:    4


Socket(s):      
           1




Cpuinfo對應的信息如下















換成拓撲C:


CPU(s):     
               8


Thread(s) per core:    1


Core(s) per socket:    8


Socket(s):      
           1




拓撲的排列組合還可以有很多其他方式。








不同的拓撲是否性能不同?








首先操作系統會看這個拓撲,在進程調度時為了保持親和性,會優先把同一個進程調度到同一個core上,如果不能調度到同一個core,則盡量調度到同一個socket上。


虛擬化平台,也許也會傾向於把同一個虛擬core、虛擬socket調度到同一個物理core、物理socket上。至於具體到某個虛擬化平台(VMware、KVM、Hyper-V、Citrix)是怎么調度的,肯定是各有各的算法。


因此,如果想收獲比較好的虛擬機性能表現,把虛擬機的CPU拓撲設置為和物理機一致,這樣在親和性保持上比較有利。如果不一致,就不利。


舉一個不一致的例子。


物理機拓撲:2個sockets、每個socket有4個cores,每個core有一個thread。


虛擬機拓撲:1個sockets、每個socket有8個cores,每個core有一個thread。


在OS進程調度時,如果同一個進程不能調度到同一個虛擬core(名叫A)上,它會調度到同一個socket上其他core,OS一看拓撲,大家都在同一個socket,於是就隨便調度到一個core(名叫F)。


而在物理機層面,這個8個虛擬core不可能調度到同一個socket(假設叫1)上,因為一個socket只有4個cores。結果,core(F)就被調度到Socket(名叫2)上了。


於是上下文切換的代價就明顯增高。




閱讀原文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM