1) 减少CPU切换开销
CPU固定绑定到主机的指定CPU上,在整个运行期间,不会发生CPU浮动, 减少CPU切换开销 ,提高虚拟机的计算性能。
2) 提供CPU cache的命中率
在多核运行的机器上,每个CPU自身会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此, CPU cache命中率 就低了,当绑定CPU后,程序就会一直在指定的孙樱核cpu跑,不会由 *** 作系统调度到其他CPU上,性能有一则掘定的提高。
taskset:设置或检索进程的CPU相关性
1) 如果没有taskset命令, 安装 包含taskset命令的util-linux工具集:yum install util-linux
2) 查看进程的CPU亲和力 ,-p选项是一个十六进制数,-cp选项是一个cpu列表,表示相应的cpu核。3的颂肆二进制形式是0011,相应的第0位和第1位都是1,表示14795进程只能运行在cpu的第0个核和第1个核。
$ 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
OpenStack K版本引入了许多CPU高级特性功能,不仅支持自定义CPU拓扑功能,支持设置虚拟机CPU的socket、core、threads等,还支持CPU pinning功能,即CPU核绑定,甚至能够配置虚拟机独占物理CPU,虚拟机的vCPU能够固定绑定到物理宿主机的指定pCPU上,在整个运行期间,不会发生CPU浮动,减少CPU切换开销,提高虚拟机的计算性能。
$ 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
以上可知,该宿主机有两个CPU(socket),每个CPU 10核(core),每个核可以开启两个 超线程(thread) ,即有40个逻辑CPU。宿主机CPU包含两个NUMA node,其中node0包括0,2,4,...,38,node1包括1,3,5,...,39。
步骤1) 创建支持绑核的主机集合
不是所有的计算节点都支持CPU绑核特性,可以通过主机集合(host aggregate)把支持绑核CPU的主机放到一个集合中。
步骤2) 创建支持绑核的flavor
目前Nova并不支持启动时直接指定主机集合的metadata(hint只支持指定server group),需要通过flavor的扩展属性和主机集合的metadata匹配,将不匹配的主机滤掉,部署到匹配的主机上。flavor支持配置虚拟机的CPU拓扑、QoS、CPU pinning策略、NUMA拓扑以及PCI passthrough等扩展属性。
步骤3) 通过步骤2) 的Flavor创建虚拟机,创建完成到虚机所在物理机上查看虚机绑核情况:
查询方法1) virsh dumpxml 虚机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) 在虚拟机所运行的物理宿主机上执行virsh list找到相应虚机的实例id,然后virsh vcpupin 实例id可以查到该虚拟机所占用的CPU具体核数。
# virsh vcpupin vm46 绑核的虚机
VCPU: CPU Affinity
----------------------------------
0: 25
1: 5
2: 8
3: 28
4: 9
5: 29
6: 24
7: 4
# virsh vcpupin vm6 未绑核的虚机
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
virsh vcpupin 子命令是KVM自带的指令工具,它可以把vm实例的每个vcpu与宿主机的cpu对应绑定,这种绑定方式粒度更小。
# virsh vcpupin vm4 查看绑定情况
VCPU: CPU Affinity
----------------------------------
0: 0-23
1: 0-23
#默认2个vcpu没有进行绑定,可以在0-23号cpu上切换
# virsh vcpuinfo vm4 查看CPU使用时长
VCPU: 0
CPU: 10 #运行在10号cpu上
State: running
CPU time: 14.2s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 1
CPU: 8 #运行在8号cpu上
State: running
CPU time: 6.8s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
# virsh vcpupin vm4 0 3 绑定虚机的第1个CPU到宿主机的第4号cpu上
# virsh vcpupin vm4 1 5 绑定虚机的第2个CPU到宿主机的第6号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
三种方法的相同点:都能实现绑核效果
优劣势对比:openstack支持虚机重生虚拟迁移到其他物理主机上,第1种方法在这些 *** 作后绑核还是有效的,但2和3就不会绑核的。此外,第1种方法是自动的,2和3是手动的,可以作为临时补救方法。
在虚拟机上执行高密度计算,测试的Python脚本如下:
# test_compute.py
k = 0
for i in xrange(1, 100000):
for j in xrange(1, 100000):
k = k + i * j
使用shell脚本同时跑50个进程,保证CPU满载运行:
for i in `seq 1 50`do
python test_compute.py &
done
使用sar命令查看宿主机CPU使用情况:
sar -P ALL 1 100
结果如下:
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使用情况看宿主机的pCPU 4-5,8-9,24-25,28-29使用率100%,并且整个过程中没有浮动,符合我们的预期结果,说明CPU核绑定成功。
CPU 正在运行的程序和需要立即处理携尘的数据通常会存储在 CPU 的内存中。枝前内存是计算机中用于存储数据和程序的设备,它是 CPU 进行数据处理的主要工作区域。当 CPU 要处理的数据和程猛隐清序较多时,会将部分数据和程序存储在内存中,以便 CPU 能够快速访问和处理。
在运行过程中,CPU 会不断访问内存中的数据和程序,并将处理结果存储回内存。因此,内存的容量越大,CPU 能够处理的数据和程序就越多,计算机的性能就会越高。
程序主要放在存储器中。
官方答案:
高级程序设计语言不能直接被计算机理解并执行,需要通过翻译程序将其转换成特定处理器上可执行的指令,计算机 CPU 的简单工作原理如下所示:
CPU 主要由控制单元、运算单元和存储单元组成(注意忽略了中断系统),各自的作用如下:
除此之外滑纤,计算机系统执行程序指令时需要花费时间,其中取出一条指令并执行这条指令的时间叫指令周期。指令周期可以分为若干个阶段(取指周期、间址周期、执行周期备渣和中断周期),每个阶段主要完成一项基本 *** 作,完成基本 *** 作的时间叫机器周期。机器周期是时钟周期的分频,例如最经典的 8051 单片机的机器周期为 12 个时钟周期。时钟周期是 CPU 工作的基本时间单位,也可以称为节拍脉冲或 T 周期(CPU 主频的倒数) 。假设 CPU 的主频是 1 GHz(1 Hz 表示每信滚仿秒运行 1 次),那么表示时钟周期为 1 / 109 s。理论上 CPU 的主频越高,程序指令执行的速度越快。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)