背景:為什么要進(jìn)程綁定到指定的CPU上?
1) 減少CPU切換開銷
CPU固定綁定到主機(jī)的指定CPU上,在整個(gè)運(yùn)行期間,不會(huì)發(fā)生CPU浮動(dòng),減少CPU切換開銷,提高虛擬機(jī)的計(jì)算性能。
2) 提供CPU cache的命中率
在多核運(yùn)行的機(jī)器上,每個(gè)CPU自身會(huì)有緩存,緩存著進(jìn)程使用的信息,而進(jìn)程可能會(huì)被OS調(diào)度到其他CPU上,如此,CPU cache命中率就低了,當(dāng)綁定CPU后,程序就會(huì)一直在指定的cpu跑,不會(huì)由操作系統(tǒng)調(diào)度到其他CPU上,性能有一定的提高。
非虛擬化場(chǎng)景
taskset:設(shè)置或檢索進(jìn)程的CPU相關(guān)性
1) 如果沒有taskset命令,安裝包含taskset命令的util-linux工具集:yum install util-linux
2) 查看進(jìn)程的CPU親和力,-p選項(xiàng)是一個(gè)十六進(jìn)制數(shù),-cp選項(xiàng)是一個(gè)cpu列表,表示相應(yīng)的cpu核。3的二進(jìn)制形式是0011,相應(yīng)的第0位和第1位都是1,表示14795進(jìn)程只能運(yùn)行在cpu的第0個(gè)核和第1個(gè)核。
$ taskset -p 14795
pid 14795's current affinity mask: 3
$ taskset -cp 14795
pid 14795's current affinity list: 0,1
3) 綁定CPU:taskset -cp <CPU IDs>? <Process ID>
$ taskset -cp? 0? 14795
pid 14795's current affinity list: 0,1
pid 14795's new affinity list: 0
虛擬化場(chǎng)景-openstack
方法1) 通過(guò)綁核的flavor進(jìn)行創(chuàng)建虛機(jī)
OpenStack K版本引入了許多CPU高級(jí)特性功能,不僅支持自定義CPU拓?fù)涔δ?,支持設(shè)置虛擬機(jī)CPU的socket、core、threads等,還支持CPU pinning功能,即CPU核綁定,甚至能夠配置虛擬機(jī)獨(dú)占物理CPU,虛擬機(jī)的vCPU能夠固定綁定到物理宿主機(jī)的指定pCPU上,在整個(gè)運(yùn)行期間,不會(huì)發(fā)生CPU浮動(dòng),減少CPU切換開銷,提高虛擬機(jī)的計(jì)算性能。
$ lscpu
Architecture:? ? ? ? ? x86_64
CPU op-mode(s):? ? ? ? 32-bit, 64-bit
Byte Order:? ? ? ? ? ? Little Endian
CPU(s):? ? ? ? ? ? ? ? 40
On-line CPU(s) list:? 0-39
Thread(s) per core:? ? 2
Core(s) per socket:? ? 10
Socket(s):? ? ? ? ? ? 2
NUMA node(s):? ? ? ? ? 2
Vendor ID:? ? ? ? ? ? GenuineIntel
CPU family:? ? ? ? ? ? 6
Model:? ? ? ? ? ? ? ? 63
Model name:? ? ? ? ? ? Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz
Stepping:? ? ? ? ? ? ? 2
CPU MHz:? ? ? ? ? ? ? 1201.480
BogoMIPS:? ? ? ? ? ? ? 4603.87
Virtualization:? ? ? ? VT-x
L1d cache:? ? ? ? ? ? 32K
L1i cache:? ? ? ? ? ? 32K
L2 cache:? ? ? ? ? ? ? 256K
L3 cache:? ? ? ? ? ? ? 25600K
NUMA node0 CPU(s):? ? 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38
NUMA node1 CPU(s):? ? 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39
以上可知,該宿主機(jī)有兩個(gè)CPU(socket),每個(gè)CPU 10核(core),每個(gè)核可以開啟兩個(gè)超線程(thread),即有40個(gè)邏輯CPU。宿主機(jī)CPU包含兩個(gè)NUMA node,其中node0包括0,2,4,...,38,node1包括1,3,5,...,39。
步驟1) 創(chuàng)建支持綁核的主機(jī)集合
不是所有的計(jì)算節(jié)點(diǎn)都支持CPU綁核特性,可以通過(guò)主機(jī)集合(host aggregate)把支持綁核CPU的主機(jī)放到一個(gè)集合中。
步驟2)? 創(chuàng)建支持綁核的flavor
目前Nova并不支持啟動(dòng)時(shí)直接指定主機(jī)集合的metadata(hint只支持指定server group),需要通過(guò)flavor的擴(kuò)展屬性和主機(jī)集合的metadata匹配,將不匹配的主機(jī)濾掉,部署到匹配的主機(jī)上。flavor支持配置虛擬機(jī)的CPU拓?fù)洹oS、CPU pinning策略、NUMA拓?fù)湟约癙CI passthrough等擴(kuò)展屬性。
步驟3) 通過(guò)步驟2) 的Flavor創(chuàng)建虛擬機(jī),創(chuàng)建完成到虛機(jī)所在物理機(jī)上查看虛機(jī)綁核情況:
查詢方法1) virsh dumpxml 虛機(jī)id
<vcpu placement='static'>8</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='25'/>
<vcpupin vcpu='1' cpuset='5'/>
<vcpupin vcpu='2' cpuset='8'/>
<vcpupin vcpu='3' cpuset='28'/>
<vcpupin vcpu='4' cpuset='9'/>
<vcpupin vcpu='5' cpuset='29'/>
<vcpupin vcpu='6' cpuset='24'/>
<vcpupin vcpu='7' cpuset='4'/>
<emulatorpin cpuset='4-5,8-9,24-25,28-29'/>
</cputune>
查詢方法2) 在虛擬機(jī)所運(yùn)行的物理宿主機(jī)上執(zhí)行virsh list找到相應(yīng)虛機(jī)的實(shí)例id,然后virsh vcpupin 實(shí)例id可以查到該虛擬機(jī)所占用的CPU具體核數(shù)。
# virsh vcpupin vm46? 綁核的虛機(jī)
VCPU: CPU Affinity
----------------------------------
? 0: 25
? 1: 5
? 2: 8
? 3: 28
? 4: 9
? 5: 29
? 6: 24
? 7: 4
# virsh vcpupin vm6 未綁核的虛機(jī)
VCPU: CPU Affinity
----------------------------------
? 0: 0-39?
? 1: 0-39
? 2: 0-39?
? 3: 0-39
? 4: 0-39?
? 5: 0-39
? 6: 0-39?
? 7: 0-39
方法2) virsh vcpupin也可以綁定虛機(jī)(當(dāng)做一個(gè)進(jìn)程)的CPU核數(shù)
virsh vcpupin 子命令是KVM自帶的指令工具,它可以把vm實(shí)例的每個(gè)vcpu與宿主機(jī)的cpu對(duì)應(yīng)綁定,這種綁定方式粒度更小。
# virsh vcpupin vm4 查看綁定情況
VCPU: CPU Affinity
----------------------------------
? 0: 0-23? ? ?
? 1: 0-23
#默認(rèn)2個(gè)vcpu沒有進(jìn)行綁定,可以在0-23號(hào)cpu上切換
# virsh vcpuinfo vm4 查看CPU使用時(shí)長(zhǎng)
VCPU:? ? ? ? ? 0
CPU:? ? ? ? ? ? 10? #運(yùn)行在10號(hào)cpu上
State:? ? ? ? ? running
CPU time:? ? ? 14.2s
CPU Affinity:? yyyyyyyyyyyyyyyyyyyyyyyy
VCPU:? ? ? ? ? 1
CPU:? ? ? ? ? ? 8? ? ? #運(yùn)行在8號(hào)cpu上
State:? ? ? ? ? running
CPU time:? ? ? 6.8s
CPU Affinity:? yyyyyyyyyyyyyyyyyyyyyyyy
# virsh vcpupin vm4 0 3 綁定虛機(jī)的第1個(gè)CPU到宿主機(jī)的第4號(hào)cpu上
# virsh vcpupin vm4 1 5 綁定虛機(jī)的第2個(gè)CPU到宿主機(jī)的第6號(hào)cpu上
# virsh vcpuinfo vm4
VCPU:? ? ? ? ? 0
CPU:? ? ? ? ? ? 3
State:? ? ? ? ? running
CPU time:? ? ? 14.5s
CPU Affinity:? ---y--------------------
VCPU:? ? ? ? ? 1
CPU:? ? ? ? ? ? 5
State:? ? ? ? ? running
CPU time:? ? ? 7.3s
CPU Affinity:? -----y------------------
# virsh vcpupin vm4
VCPU: CPU Affinity
----------------------------------
? 0: 3
? 1: 5
方法3) 通過(guò)taskset命令綁核,見非虛擬化場(chǎng)景
三種方法的相同點(diǎn):都能實(shí)現(xiàn)綁核效果
優(yōu)劣勢(shì)對(duì)比:openstack支持虛機(jī)重生虛擬遷移到其他物理主機(jī)上,第1種方法在這些操作后綁核還是有效的,但2和3就不會(huì)綁核的。此外,第1種方法是自動(dòng)的,2和3是手動(dòng)的,可以作為臨時(shí)補(bǔ)救方法。
驗(yàn)證方法:CPU綁核后的占用情況
在虛擬機(jī)上執(zhí)行高密度計(jì)算,測(cè)試的Python腳本如下:
# test_compute.py
k = 0
for i in xrange(1, 100000):
? ? for j in xrange(1, 100000):
? ? ? ? k = k + i * j
使用shell腳本同時(shí)跑50個(gè)進(jìn)程,保證CPU滿載運(yùn)行:
for i in `seq 1 50`; do
? ? python test_compute.py &
done
使用sar命令查看宿主機(jī)CPU使用情況:
sar -P ALL 1 100
結(jié)果如下:
Linux 3.10.0-229.20.1.el7.x86_64 (8409a4dcbe1d11af)? ? 05/10/2018? ? ? _x86_64_? ? ? ? (40 CPU)
10:20:14 PM? ? CPU? ? %user? ? %nice? %system? %iowait? ? %steal? ? %idle
10:20:15 PM? ? all? ? 20.48? ? ? 0.00? ? ? 0.15? ? ? 0.03? ? ? 0.00? ? 79.34
10:20:15 PM? ? ? 0? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 1? ? ? 0.99? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 99.01
10:20:15 PM? ? ? 2? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 3? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 4? ? 100.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00
10:20:15 PM? ? ? 5? ? 100.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00
10:20:15 PM? ? ? 6? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 7? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 8? ? 100.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00
10:20:15 PM? ? ? 9? ? 100.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00
10:20:15 PM? ? ? 10? ? ? 1.01? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 98.99
10:20:15 PM? ? ? 11? ? ? 1.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 99.00
10:20:15 PM? ? ? 12? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 13? ? ? 0.00? ? ? 0.00? ? ? 0.99? ? ? 0.00? ? ? 0.00? ? 99.01
10:20:15 PM? ? ? 14? ? ? 0.99? ? ? 0.00? ? ? 0.99? ? ? 0.00? ? ? 0.00? ? 98.02
10:20:15 PM? ? ? 15? ? ? 1.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 99.00
10:20:15 PM? ? ? 16? ? ? 0.99? ? ? 0.00? ? ? 0.99? ? ? 0.00? ? ? 0.00? ? 98.02
10:20:15 PM? ? ? 17? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 18? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 19? ? ? 3.96? ? ? 0.00? ? ? 0.99? ? ? 0.00? ? ? 0.00? ? 95.05
10:20:15 PM? ? ? 20? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 21? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 22? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 23? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 24? ? 100.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00
10:20:15 PM? ? ? 25? ? 100.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00
10:20:15 PM? ? ? 26? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 27? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 28? ? 100.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00
10:20:15 PM? ? ? 29? ? 100.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00
10:20:15 PM? ? ? 30? ? ? 2.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 98.00
10:20:15 PM? ? ? 31? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 32? ? ? 2.97? ? ? 0.00? ? ? 0.99? ? ? 0.00? ? ? 0.00? ? 96.04
10:20:15 PM? ? ? 33? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 34? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 35? ? ? 1.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 99.00
10:20:15 PM? ? ? 36? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 37? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 38? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
10:20:15 PM? ? ? 39? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? ? 0.00? ? 100.00
從CPU使用情況看宿主機(jī)的pCPU 4-5,8-9,24-25,28-29使用率100%,并且整個(gè)過(guò)程中沒有浮動(dòng),符合我們的預(yù)期結(jié)果,說(shuō)明CPU核綁定成功。