$ps -o pid,command,psr -q 1406
proc文件系统中cpu允许调度信息
$cat /proc/1406/status
Cpus_allowed: 8
Cpus_allowed_list: 3
绑定至某个cpu:
$taskset -cp 2 1406
cpu隔离(独占)试验:
在linux启动时加isocpu即可:
kernel .... root=... isolcpu=2,3
启动时,默认进程就不会调度到2,3号cpu上
再加上前面的taskset,就可以控制某些cpu个某些进程独占
背景:为什么要进程绑定到指定的CPU上?
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核绑定成功。
1、物理CPU数:机器主板上实际插入的cpu数量,比如说你的主板上安装了一块8核CPU,那么物理CPU个数就是1个,所以物理CPU个数就是主板上安装的CPU个数。
2、物理CPU核数:单个物理CPU上面有多个核,物理CPU核数=物理CPU数✖️单个物理CPU的核
3、逻辑CPU核数:一般情况,我们认为一颗CPU可以有多个核,加上intel的超线程技术(HT), 可以在逻辑上再分一倍数量的CPU core出来。逻辑CPU核数=物理CPU数✖️单个物理CPU的核*2
4、超线程技术(Hyper-Threading):就是利用特殊的硬件指令,把两个逻辑CPU模拟成两个物理CPU,实现多核多线程。我们常听到的双核四线程/四核八线程指的就是支持超线程技术的CPU。
1、并行:两件(多件)事情在同一时刻一起发生。
2、并发:两件(多件)事情在同一时刻只能有一个发生,由于CPU快速切换,从而给人的感觉是同时进行。
3、进程和线程
进程是资源分配的最小单位,一个程序有至少一个进程。线程是程序执行的最小单位。一个进程有至少一个线程。
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
4、单核多线程:单核CPU上运行多线程, 同一时刻只有一个线程在跑,系统进行线程切换,系统给每个线程分配时间片来执行,看起来就像是同时在跑, 但实际上是每个线程跑一点点就换到其它线程继续跑。
5、多核多线程:每个核上各自运行线程,同一时刻可以有多个线程同时在跑。
1、对于单核:多线程和多进程的多任务是在单cpu交替执行(时间片轮转调度,优先级调度等),属于并发
2、对于多核:同一个时间多个进程运行在不同的CPU核上,或者是同一个时间多个线程能分布在不同的CPU核上(线程数小于内核数),属于并行。
3、上下文切换:上下文切换指的是内核( *** 作系统的核心)在CPU上对进程或者线程进行切换。上下文切换过程中的信息被保存在进程控制块(PCB-Process Control Block)中。PCB又被称作切换帧(SwitchFrame)。上下文切换的信息会一直被保存在CPU的内存中,直到被再次使用。
CPU 亲和性(affinity)就是进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性。这样可以减少上下文切换的次数,提高程序运行性能。可分为:自然亲和性和硬亲和性
1、自然亲和性:就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。Linux调度器缺省就支持自然CPU亲和性(natural CPU affinity): 调度器会试图保持进程在相同的CPU上运行。
2、硬亲和性:简单来说就是利用linux内核提供给用户的API,强行将进程或者线程绑定到某一个指定的cpu核运行。Linux硬亲和性指定API:taskset .
taskset [options] mask command [arg]...
taskset [options] -p [mask] pid
taskset 命令用于设置或者获取一直指定的 PID 对于 CPU 核的运行依赖关系。也可以用 taskset 启动一个命令,直接设置它的 CPU 核的运行依赖关系。
CPU 核依赖关系是指,命令会被在指定的 CPU 核中运行,而不会再其他 CPU 核中运行的一种调度关系。需要说明的是,在正常情况下,为了系统性能的原因,调度器会尽可能的在一个 CPU 核中维持一个进程的执行。强制指定特殊的 CPU 核依赖关系对于特殊的应用是有意义的
CPU 核的定义采用位定义的方式进行,最低位代表 CPU0,然后依次排序。这种位定义可以超过系统实际的 CPU 总数,并不会存在问题。通过命令获得的这种 CPU 位标记,只会包含系统实际 CPU 的数目。如果设定的位标记少于系统 CPU 的实际数目,那么命令会产生一个错误。当然这种给定的和获取的位标记采用 16 进制标识。
0x00000001
代表 #0 CPU
0x00000003
代表 #0 和 #1 CPU
0xFFFFFFFF
代表 #0 到 #31 CPU
-p, --pid
对一个现有的进程进行 *** 作,而不是启动一个新的进程
-c, --cpu-list
使用 CPU 编号替代位标记,这可以是一个列表,列表中可以使用逗号分隔,或者使用 "-" 进行范围标记,例如:0,5,7,9
-h, --help
打印帮助信息
-V, --version
打印版本信息
如果需要设定,那么需要拥有 CAP_SYS_NICE 的权限;如果要获取设定信息,没有任何权限要求。
taskset 命令属于 util-linux-ng 包,可以使用 yum 直接安装。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)