先介绍几个基本概念:

Node:包含由若干个socket的组;

Socket:是一颗物理cpu的封装,简称插槽。Inter为了将物理cpu和逻辑cpu混淆,所以将物理处理器统称为插槽。

Core:Socket内含有的物理;

Thread:在Inter超线程的处理器上,每个core一般可以被虚拟为两个逻辑处理器,逻辑处理器会共享大多数内核资源。逻辑处理器被统称为Thread。

Process:处理器的统称,可以区分为物理处理器,逻辑处理器,对应用来说,他们不关系处理器是物理的还是逻辑的。

Siblings:每个物理process所含有的逻辑process的数量。

包含关系:

Numa node->Socket->Core->Thread 

Linux Numa 调度策略:

Linux每个进程都会延续父进程的策略,优先将其约束在一个numa node内,如果numa策略允许的话,进程也可以调用其他node上的资源;

Numa的cpu分配策略有两种:

1. cpunodebind:约定进程运行在制定的若干个node内;

2.physnodebind:约定进程运行在若干个物理cpu上;

Numa的内存分配策略有:

1.localalloc:约束进程只能访问本地内存;

2.preferred: 进程指定一个优先node,优先node内存资源不足,进程允许运行在别的node上;

3.membind:进程只能从若干个node上请求访问内存,不严格规定只访问本地内存;

4.interleave: 进程使用RR算法轮转的从指定的若干个node上请求访问内存;

查看numa相关信息:

openstack masakari部署_插槽

openstack masakari部署_超线程_02

测试访问不同node的内存带宽:

numactl --cpubind=0 --membind=0 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024

1073741824字节(1.1 GB)已复制,0.488197 秒,2.2 GB/秒

numactl --cpubind=0 --membind=1 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024  

1073741824字节(1.1 GB)已复制,0.584448 秒,1.8 GB/秒

虽然差距不是特别大,还是要尽量避免跨节点访问内存。

openstack配置后...

1. 设置cpu绑定策略:

openstack flavor set FLAVOR-NAME --property hw:cpu_policy=CPU-POLICY  --property hw:cpu_thread_policy=CPU-THREAD-POLICY

其中:cpu_policy 可以取:

shared:允许虚拟机的vCPU在多个pCPU之间浮动

dedicated(有三个策略):VCPU会绑定在指定的PCPU上

cpu_thread_policy:

prefer (default):如果计算节点打开超线程, vCPU 优先选择在 Siblings Thread 中运行。例如:4 个逻辑核属于同一 NUMA,其中 CPU1 和 CPU2 属于相同物理核,CPU3 和 CPU4 属于不同的物理核,若此时创建一个 Flavor vCPU 为 4 的云主机会创建失败,因为 siblings 只有 [set([1, 2])]

isolate(vCPU 性能最好):vCPU 必须绑定到 Core 上。如果 Host 没有开启超线程,则理所当然会将 vCPU 绑定到 Core 上;相反,如果 Host 开启了超线程,则 vCPU 会被绑定到 Siblings Thread 的一个 Thread 中,并且其他的 vCPU 不会再被分配到该 Core 上,相当于 vCPU 独占一个 Core,避免 Siblings Thread 竞争。

require(vCPU 数量最多):vCPU 必须绑定到 Thread 上。Host 必须开启超线程,每个 vCPU 都会被绑定到 Thread 上,直到 Thread 用完为止。如果没有开启的话,那么该 Host 不会出现在 Nova Scheduler 的调度名单中。

NOTE 1:

如果 pinned(isolate) 和 unpinned 的虚拟机运行在同一个 compute node,则会发生 CPU 竞争,因为 unpinned 的虚拟机不会考虑到 pinned 虚拟机的资源需求,由于 Cache 的影响。这将会严重的影响进行了 CPU 绑定的虚拟机的性能,尤其当两者同处一个 NUMA 节点时。所以,应该使用 Host Aggregate 来区分开 pinned 和 unpinned 的虚拟机,退一步来说,最起码也应该让两者运行在不同的 NUMA 节点上。而且如果一个 compute node 上运行的全是 pinned 虚拟机,那么这个 compute node 不建议配置超配比。
NOTE 2:如果 cpu_thread_policy=prefer | require 时,Nova 的 Thread 分配策略是尽量先占满一个 Core,然后再使用下一个 Core 上的 Thread,尽量避免 Thread/Core 碎片影响到后面创建的虚拟机。

flavor设置:

openstack flavor set  1  --property hw:cpu_policy=dedicated --property hw:cpu_thread_policy=require

openstack masakari部署_插槽_03

后面再补充