第一章 什么是绑核

线程绑核是指将线程绑定到特定的CPU核心上执行,而不允许线程在不同核心之间切换执行。这种操作可以有效地减少操作系统的上下文切换和负载均衡的开销,从而提高程序的执行效率。没有绑核的线程则可以在多个CPU核心上随意切换执行。这虽然可以让操作系统更加灵活地分配CPU资源,并提高系统的负载均衡性,但也会增加上下文切换的开销和CPU缓存的失效率。因此,线程绑核和没有绑核的区别主要在于执行效率和系统负载均衡的优化。需要根据具体的应用场景进行选择。

第二章 虚拟机绑核类型

2.1 不绑核

不绑核的情况下,虚拟机的线程在当前CPU资源池中按需分配CPU资源。此时一个虚拟机的线程,一方面要进入线程队列中等待分配时间片,而该线程队列中不仅有自身虚拟机的线程,还有其他虚拟机的线程,因此存在资源竞争。另一方面操作系统还要决策将该任务调度分配到哪个物理CPU上运行,然后要将线程的上下文切换到该CPU核中,存在切换的时间。但是由于这种分配方式较为灵活,不会预留CPU而浪费资源,因此对于CPU资源要求和处理延迟要求不高的场景使用。

2.2 绑核

绑核又分为三个方式,分别是绑核不独占线程绑核且独占核和绑核且独CPU。

2.2.1 绑核不独占

几乎不使用。相比于不绑核的情况只是将从CPU池中获取CPU资源变成了从指定的CPU核中获取CPU资源。此时,虚拟机的线程同样需要进入线程队列中等待分配时间片,线程队列中也同样可能存在其他虚拟机的线程,只是分配到的CPU核是固定的,减少了线程在不同的CPU核进行上下文切换的时间。虽然也存在和其他虚拟机的资源竞争,但是如果该CPU核上其他虚拟机的线程少,那么资源竞争就没有不绑核那么剧烈。由于这种情况对于处理延迟的提升不明显。

2.2.2 绑核且独占核

虚拟机绑核且独占核是指将一个或多个物理核心分配给一个虚拟机,并保证虚拟机是唯一能够使用这些核心的。这意味着在虚拟机运行期间,这些核心不会被分配给其他虚拟机或主机进程使用。这种方式通常是最常用的,即将虚拟机cpu与物理机cpu核进行绑定。绑核且独占核通常可以使用以下命令查看:

virsh vcpuinfo <id>
VCPU:           0
CPU:            3        
State:          running        
CPU time:       198781.4s        
CPU Affinity:   0x8
VCPU:           1        
CPU:            2        
State:          running        
CPU time:       198781.3s        
CPU Affinity:   0x4
  • VCPU编号:表示虚拟机中的第几个虚拟CPU,从0开始。
  • CPU编号:表示虚拟CPU当前绑定的物理CPU编号。
  • 状态:表示虚拟CPU的运行状态,包括running(运行中)blocked(阻塞中)等。
  • CPU时间:表示虚拟CPU从启动到现在运行的总时间。
  • CPU Affinity:表示虚拟CPU绑定的物理CPU核心,以16进制的形式表示。

如果是非绑核的虚拟机,则输出以下内容

VCPU:           0
CPU:            -1
State:          running
CPU time:       28.2s
CPU Affinity:   0x0

或者使用vcpupin来确认,以下这种输出就是绑核虚拟机。

[root@kvm-host ~]# virsh vcpupin vm1
VCPU:           CPU Affinity
------------------------------------
0:              0-3
1:              0-3
2:              0-3
3:              0-3

还可以通过查看xml文件来确认虚拟机是否绑核

<domain type='kvm'>
  <name>examplevm</name>
  <vcpu placement='static'>2</vcpu>
  <cputune>
    <vcpupin vcpu='0' cpuset='1'/>
    <vcpupin vcpu='1' cpuset='2'/>
  </cputune>
  ...
</domain>

<vcpu>标签定义了虚拟机的虚拟CPU数量,这里设置为2。<cputune>标签下面的两个<vcpupin>标签定义了虚拟机中的两个vCPU分别绑定在哪个CPU核心上,这里分别绑定在核心1和核心2上。

2.2.3 绑核且独CPU

绑核且独占 CPU 是指将整个物理 CPU 分配给一个虚拟机,并保证该虚拟机是唯一能够使用该 CPU 的。这意味着在虚拟机运行期间,该 CPU 不会被分配给其他虚拟机或主机进程使用。因此,两者的区别在于资源分配的粒度不同。虚拟机绑核且独占核是将核心级别的资源分配给虚拟机,而绑核且独占 CPU 则是将整个 CPU 分配给虚拟机。这意味着在绑定和独占 CPU 的情况下,虚拟机将获得更多的计算资源,但是这也意味着在虚拟机未使用 CPU 时,该 CPU 不能用于主机上的其他进程。在绑定和独占核的情况下,虚拟机只获得了核心级别的资源,因此,即使虚拟机未使用该核心时,该核心也可以用于主机上的其他进程。

第三章 如何创建绑核虚拟机

3.1 FS创建绑核虚拟机

在FuionSphere OpenStack中,创建规格时可以设置绑核。在该解决方案中,绑核虚拟机核非绑核虚拟机不能共numa部署,即某个numa部署了绑核虚拟机,再创建非绑核虚拟机就会失败。

如何提高虚拟机性能?利用这个特性来实现!_执行效率

3.2 kvm创建绑核虚拟机

1、使用virt-install命令创建虚拟机时,可以使用--vcpus--cpu-set选项来指定虚拟机的CPU数量和绑定。例如:

virt-install --name vm_name --vcpus 2 --cpu host-passthrough --cpu-set 0,1 ...
virt-install --name vm_name --vcpus 2 --cpu host-passthrough --cpu-set 0,1 ...

其中,vm_name是虚拟机的名称,2是虚拟机的CPU数量,--cpu host-passthrough指定使用宿主机的CPU特性,--cpu-set 0,1指定将虚拟机绑定到CPU核心0和1上。

或者,您可以在创建虚拟机时在XML配置文件中指定CPU绑定。在<vcpu>标签下添加以下行:

<cputune>
  <vcpupin vcpu='0' cpuset='0'/>
  <vcpupin vcpu='1' cpuset='1'/>
</cputune>

其中,vcpu指定虚拟CPU的编号,cpuset指定要绑定的CPU核心。

如果我的文章对你有帮助,欢迎关注我的同名公众号~