OpenStack是 一個IAAS(基礎設施即服務)因此免不了會與硬體打交道。下面我介紹下與CPU強關聯的一些知識點。1 什麼是超配 2 CPU的個數是怎麼統計的 3 vCPU的隔離、繫結
在kvm虛擬化的環境中,一個vCPU本質上是一個kvm的一個執行緒,如果一臺虛擬機器器有4個vCPU,對應的就是4個執行緒。
1.1 假設VM1 有兩個2vCPU, VM2 也有兩個vCPU,而物理機上總共只有2個CPU,則這4個執行緒是在兩個物理CPU上排程的。這也就說明即虛機的 VCPU 總數可以超過物理 CPU 數量,這個叫CPU overcommit(超配); KVM 允許 overcommit,這個特性使得虛機能夠充分利用宿主機的 CPU 資源但前提是在同一時刻,不是所有的虛機都滿負荷執行。
1.2 在實際的生產中經驗,在x86架構中我們建議的通用型設定是1:3的超配比,而在ARM架構中該比例為1:2。(注:該設定僅僅為建議設定,實際生產中要根據自己的業務和CPU的型號不同,在充分測試下才能給出合理的超分比例。)
1.3 那在OpenStack的環境中我們如何檢視和設定超配比例?
組態檔的方式
cpu_allocation_ratio=3 #cpu 超分比
disk_allocation_ratio=1.0 #磁碟 超分比
ram_allocation_ratio=1.0 #記憶體 超分比
命令列方式
檢視計算節點id
nova hypervisor-list
設定 cpu 超分比2.0
nova hypervisor-set-ratio --cpu 2.0 a1266c51-e693-4bf9-84dc-37b3d15322e7
檢視 超分比
物理機CPU的統計用一個簡單的公式就能算出每臺物理機擁有的CPU總數。
系統可用的CPU總數(邏輯處理器) = Socket數(CPU個數)x Core數(核心)x Thread數(超執行緒)
Socket數 :就是我們常說的幾路CPU ,如兩路CPU 就會有兩個Socket
Core數 : 物理核心的數量。
Thread數 :系統層上的多執行緒技術。超執行緒即是可在同一時間裡,應用程式可以使用晶片的不同部分。雖然單執行緒晶片每秒鐘能夠處理成千上萬條指令,但是在任一時刻只能夠對一條指令進行操作。而超執行緒技術可以使晶片同時進行多執行緒處理,使晶片效能得到提升。
總的來說就是一臺物理機上有N路CPU ,而每個CPU有M個核心數,每個核心上還可以支援超執行緒。
下面我們用實際生產中CPU來舉例
X86
ARM
為什麼我們需要CPU獨佔?
1、在公有云中我們在購買雲主機時,會發現雲主機有如下兩類,一類是共用型雲主機,一類是獨享型雲主機,這兩種雲主機有什麼區別了?
其實他們的本質區別就是執行緒佔用CPU是否是獨佔的,前面我們說過,KVM虛擬化環境中每一個vCPU在物理機上都只是一個執行緒,如果他對物理CPU是獨佔的就是獨享型雲主機,獨享型不會出現資源爭奪線現象,計算效能更加穩定。
共用型雲主機,每個vCPU會被隨機分配到任何空閒CPU超執行緒上,不同範例vCPU會爭搶物理CPU資源。
這樣我們提一個有爭議的話題,那獨享型雲主機的VCPU的個數是否和物理機的CPU數是1 : 1 的關係了?
2、在超融合環境中(OpenStack的管理節點和計算節點和網路節點都在同一臺物理機上)如何將租戶使用的CPU和管理側的CPU進行隔離?
3、DPDK是一種使用者空間的網路框架,旨在通過繞過作業系統核心的網路棧,直接存取網路裝置,從而提高網路處理效能。通過將特定的CPU核心隔離出來並專門用於執行DPDK應用程式,可以避免其他程序或核心執行緒對這些CPU核心的競爭,減少上下文切換和干擾,從而提高DPDK應用程式的效能。
上述環境中都免不了要使用CPU獨佔技術,在KVM虛擬機器器的環境中,在Linux核心啟動的命令列中加上「isolcpus=引數
,可以實現CPU的隔離,使得在系統啟動後普通程序預設都不會被排程到被隔離的CPU上執行。
(*注意上述方式的隔離僅針對使用者空間隔離,核心空間是無法隔離的。)
例如,隔離cpu6和cpu7的核心啟動命令列如下:
vi /etc/sysconfig/grub
GRUB_CMDLINE_LINUX="spectre_v2=retpoline rhgb quiet net.ifnames=0 biosdevname=0 intel_iommu=on isolcpus=6,7"
grub2-mkconfig -o /boot/grub2/grub.cfg
#LEGACY啟動模式的檔案是這個,/boot/grub2/grub.cfg
#UEFI啟動模式的檔案是這個,/boot/efi/EFI/centos/grub.cfg
接下來系統重啟reboot後我們來驗證下是否生效
cat /proc/cmdline
CPU的親和性也就是cpu affinity機制,指的是程序要在指定的 CPU 上儘量長時間地執行而不被遷移到其他處理器, 通過處理器關聯可以將虛擬處理器對映到一個物理處理器上 ,也就是說把一個程式繫結到一個物理CPU上。
在大部分文章中都使用taskset
來繫結指定的執行緒號
在指定的CPU編號上。但是這種方式存在問題,虛擬機器器是需要關機和遷移的需求的,每次重啟後,執行緒的編號會變化,還需要一個單獨的程式來進行重新系結。
這裡我們使用virsh 的親和性命令來繫結VCPU和物理CPU的關係。
virsh vcpupint ${vm_name}
將虛擬機器器的vCPU繫結到特定的物理CPU上
virsh emulatorpin ${vm_name}
用於將虛擬機器器的emulator程序(即QEMU程序)繫結到特定的物理CPU上。
virsh vcpupin test 0 7
#將名為test的虛擬機器器vcpu 0 繫結在物理機CPU 7 上
#virsh vcpuinfo 來檢查
[root@192-168-48-11 ~]# virsh vcpuinfo test
VCPU: 0
CPU: 7
State: running
CPU time: 35.2s
CPU Affinity: -------y
virsh emulatorpin test 7
#將虛擬機器器test qemu程序繫結物理CPU 7上。
實驗:
在環境中,我隔離出6-7號物理cpu編號,分別繫結 test虛擬機器器的 0,1 cpu 上,
下面我們用htop
命令來進行驗證
test執行在CPU 8和7上,(此時的顯示的CPU 是從1開始,則對應6,7號cpu)
下一期我們將開始介紹儲存和網路元件的虛擬化。