1、核與巨頁
一個服務器通常有多個物理CPU,每個CPU又包含多個核,所以物理總核數=物理CPU*單個CPU的核數,每個核又可以包含幾個(2個居多)超線程,邏輯總和數=物理總核數*超線程數,下面分別是某刀片的物理CPU數,每個cpu的核數,邏輯核。
下面是CPU的內部基本架構,同一個核的超線程通過高速緩存L1 cache進行通信,不同的核通過L2 cache進行通信,BIU是總線接口單元,負責從內存指定區域取出指令傳送到指令隊列中排隊並把指令執行的結果存入內存。
每個刀片有多個物理CPU,也有多個內存塊,系統進程通過虛擬地址訪問內存,CPU把它轉換程物理內存地址訪問真正內存,為了提高這個轉換效率,CPU會緩存最近的虛擬內存地址和物理內存地址的映射關系,內存都是以頁的形式划分的,默認情況下每頁是4K,物理內存很大時,映射表的條目將會非常多,會影響CPU的檢索效率,為了減少映射表的條目,引入的巨頁,如果在系統中使用了huge page,則內存頁的數量會減少,從而需要更少的頁表,節約了頁表所占用的內存數量,並且所需的地址轉換也減少了,TLB(A Translation Lookaside Buffer)緩存失效的次數就減少了,從而提高了內存訪問的性能。另外,由於地址轉換所需的信息一般保存在CPU的緩存中,huge page的使用讓地址轉換信息減少,從而減少了CPU緩存的使用,減輕了CPU緩存的壓力,讓CPU緩存能更多地用於應用程序的數據緩存,也能夠在整體上提升系統的性能。
2、NUMA
之前的時候,是采用SMP(Symmetric Multi Processing)對稱多處理器模型,這種模型多個CPU之間沒有區別,平等地訪問內存、外設、一個操作系統。操作系統管理着一個隊列,每個處理器依次處理隊列中的進程。如果兩個處理器同時請求訪問一個資源,由硬件、軟件的鎖機制去解決資源爭用問題,這種模型在CPU數量增加時,系統性能提高的比例會遞減,共享內存可能會導致內存訪問沖突越來越厲害。
基於這種原因,又引入了一個NUMA(Non-Uniform Memory Access)模型,NUMA就是將CPU的資源分開,以node為單位進行切割,每個node里有着獨有的core ,mem等資源,比如一台機器是有2個處理器,有4個內存塊。我們將1個處理器和兩個內存塊合起來,稱為一個NUMA node,這樣這個機器就會有兩個NUMA node。在物理分布上,NUMA node的處理器和內存塊的物理距離更小,因此訪問也更快。比如這台機器會分左右兩個處理器(cpu1, cpu2),在每個處理器兩邊放兩個內存塊(memory1.1, memory1.2, memory2.1,memory2.2),這樣NUMA node1的cpu1訪問memory1.1和memory1.2就比訪問memory2.1和memory2.2更快,但是NUMA的問題是2個node之間的資源交互非常慢,所以即使有很多核,也不能划分很多歌node,否則效果反而不好。
可以通過virsh命令查詢節點信息,可以看到,該節點有48個邏輯核,配置了超線程,48和邏輯核,NUMA cell為2說明有兩個物理CPU。
通過virsh capabilities可以看到查到當前cpu的親和性信息,cell 0即物理CPU 0,memory是本numa node的內存,下面兩個page代碼默認頁大小和數量,巨頁的大小和數量,現在我們的巨頁支持arge|small|any|2048|1048576這幾種配置,distances代表,cpu訪問其他cpu的距離,可以看到,本node間距離為10,跨node的距離為21,cpus num=24說明這個cpu有24和邏輯核,分別是0-11,24-35,其中siblings代表邏輯核的親和關系,0,24親和,1,25親和。。。,如果VM使用具有親和關系的核,性能會更高。
執行numactl --hardware可以看到numa節點的信息,節點vcpu編號,內存,距離等。
執行nova hypervisor-show 1可以看到具體的numa_topology,cpu,親和,已被綁核的cpu,占用的普通內存頁,占用的巨頁內存頁等。
找個虛機看一下:
虛機核和物理核一一對應,是綁過核的,而且綁的都是帶親和關系的核,
如果是未綁過核的,則是下面這樣:
可以用virsh vcpuinfo instance-00000003查看具體核對於的信息,發現所有的vcpu都分到了4號cpu上,這樣調度就會很慢,影響整體的性能:
綁核的命令為:
virsh vcpupin (虛機實例名稱virsh list) (虛機核id) (宿主機核id)
virsh vcpupin instance-***** 0 35