CPU拓扑
OpenStack中的NUMA拓扑和CPU固定功能可提供对实例在虚拟机管理程序CPU上的运行方式以及实例可用的虚拟CPU拓扑的高级控制。这些功能有助于最大程度地减少延迟并提高性能。
SMP,NUMA和SMT
对称多处理器(SMP)
SMP是在许多现代多核系统中发现的设计。在SMP系统中,有两个或多个CPU,并且这些CPU通过某种互连连接。这为CPU提供了对系统资源(如内存和输入/输出端口)的同等访问权限。
非统一内存访问(NUMA)
NUMA是SMP设计的派生产品,可在许多多路插座系统中找到。在NUMA系统中,系统内存分为与特定CPU关联的单元或节点。通过互连总线可以请求其他节点上的内存。但是,此共享总线上的带宽是有限的。结果,对此资源的竞争可能会导致性能下降。
同时多线程(SMT)
SMT是SMP的补充设计。SMP系统中的CPU共享总线和一些内存,而SMT系统中的CPU共享更多组件。共享组件的CPU被称为线程同级。所有CPU在系统上均显示为可用CPU,并且可以并行执行工作负载。但是,与NUMA一样,线程争夺共享资源。
非统一I / O访问(NUMA I / O)
在NUMA系统中,映射到本地内存区域的设备的I / O比远程设备的I / O效率更高。连接到同一插槽(提供CPU和内存)的设备由于其物理上的接近性而为I / O操作提供了较低的延迟。通常,这会在连接到PCIe总线的设备(例如NIC或vGPU)中体现出来,但适用于任何支持内存映射的I / O的设备。
在OpenStack中,SMP CPU被称为核心,NUMA单元或节点被称为 套接字,SMT CPU被称为线程。例如,具有超线程功能的四路,八核系统将具有四个插槽,每个插槽八个核心,每个核心两个线程,总共64个CPU。
如何启用cpu pinning功能
- 需要配置vcpu_pin_set
Defines which physical CPUs (pCPUs) can be used by instance virtual CPUs (vCPUs).
Possible values:
- A comma-separated list of physical CPU numbers that virtual CPUs can be allocated to by default. Each element should be either a single CPU number, a range of CPU numbers, or a caret followed by a CPU number to be excluded from a previous range. For example:
vcpu_pin_set = "4-12,^8,15"
划分出虚拟机专用的 pCPUs 来保证性能,另一方面,也是为了防止 Guest 过分争抢 Host 进程的 CPU 资源,为 Host 适当的留下一些 CPU 以保证正常运作。
2. 启用NUMATopologyFilter
nova-scheduler服务的nova.conf里
[filter_scheduler]
enabled_filters里添加上NUMATopologyFilter
Numa拓扑策略
To restrict an instance's vCPUs to a single host NUMA node, run:
--property hw:numa_nodes=1
某些工作负载对内存访问延迟或带宽的要求非常苛刻,超过了单个NUMA节点可用的内存带宽。对于此类工作负载,将实例分布在多个主机NUMA节点上是有益的,即使实例的RAM / vCPU理论上可以在单个NUMA节点上安装也是如此。要强制实例的vCPU分布在两个主机NUMA节点上
To force an instance's vCPUs to spread across two host NUMA nodes, run:
--property hw:numa_nodes=2
如果想配置非对称的cpu/内存,可以显式地在flavor里指定
To spread the 6 vCPUs and 6 GB of memory of an instance across two NUMA nodes and create an asymmetric 1:2 vCPU and memory mapping between the two nodes, run:
--property hw:numa_nodes=2
--property hw:numa_cpus.0=0,1 --property hw:numa_mem.0=2048
--property hw:numa_cpus.1=2,3,4,5 --property hw:numa_mem.1=4096
CPU绑定策略
To configure a flavor to use pinned vCPUs, a use a dedicated CPU policy.
--property hw:cpu_policy=dedicated \
--property hw:cpu_thread_policy=require,isolate,prefer
By default, when instance NUMA placement is not specified, a topology of N sockets, each with one core and one thread, is used for an instance, where N corresponds to the number of instance vCPUs requested.
如果没有指定numa配置, 默认为1个numa, N个socket, 1个核,1个线程, N个vCPU对应N个socket
When instance NUMA placement is specified, the number of sockets is fixed to the number of host NUMA nodes to use and the total number of instance CPUs is split over these sockets.
如果设置numa策略,sockets会和主机numa个数相关,但实测中看到,一般会设置为core=1,threads=2,sockets=Nvcpu/2。可以结合cpu_sockets,cpu_cores