將進(jìn)程綁定到指定的CPU上

背景:為什么要進(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) 綁定CPUtaskset -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核綁定成功。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一.管理進(jìn)程狀態(tài) 當(dāng)程序運(yùn)行為進(jìn)程后如果希望停止進(jìn)程時(shí)可以使用kill命令對(duì)進(jìn)程發(fā)送關(guān)閉信號(hào)。除了kill還有ki...
    AGod_9141閱讀 442評(píng)論 0 0
  • 系統(tǒng)平均負(fù)載 系統(tǒng)平均負(fù)載:是處于可運(yùn)行或不可中斷狀態(tài)的平均進(jìn)程數(shù)。 可運(yùn)行進(jìn)程:使用 CPU 或等待使用 CPU...
    safecdn閱讀 742評(píng)論 0 1
  • SMP (Symmetrical Multi-Processing):指在一個(gè)計(jì)算機(jī)上匯集了一組處理器(多CPU)...
    龍飛1107閱讀 4,418評(píng)論 0 1
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)、注意力、語(yǔ)言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會(huì)...
    Jenaral閱讀 6,038評(píng)論 0 5
  • 城空了,有樹長(zhǎng)出來(lái) 我的城死了 鑄起它的人,殺死它的人 不愿因?yàn)檫@件事而驕傲 一座城的終結(jié) 永遠(yuǎn)因?yàn)榻K結(jié)這件事而顯...
    于十六閱讀 3,147評(píng)論 6 17

友情鏈接更多精彩內(nèi)容