Loading... > 转载文章,排版可能出现错误,建议到原文阅读:http://events.jianshu.io/p/eaf6a9615acc _azeqjz OpenStack: OpenStack中的CPU绑核、NUMA亲和、大页内存_ > [Flavor中定义的CPU绑核、NUMA亲和、大页内存](https://link.jianshu.com?t=https://docs.openstack.org/nova/pike/admin/flavors.html#extra-specs) ## CPU绑核策略 对Libvirt驱动而言,虚拟机的vCPU可以绑定到主机的物理CPU上(pCPU)。这些配置可以改善虚拟机实例的精确度与性能。 _注意:_ 应该摔死主机组来隔离绑核虚拟机与非绑核虚拟机,因为非绑核虚拟机不会顾及绑核虚拟机的资源需求。 ```bash $ openstack flavor set FLAVOR-NAME \ --property hw:cpu_policy=CPU-POLICY \ --property hw:cpu_thread_policy=CPU-THREAD-POLICY ``` 有效的CPU-POLICY值为: * shared: \(默认值\) 虚拟机的vCPU允许在主机pCPU上自由浮动,尽管可能受到NUMA策略的限制。 * dedicated: 虚拟机vCPU被严格绑定到一组主机pCPU上。当CPU绑定生效时,虚拟机CPU拓扑会和绑定的CPU拓扑策略一致。这意味着超分率为1.0。例如,如果2个vCPU的虚拟机绑定到有两个线程的物理CPU核,那么虚拟机的CPU拓扑为一个socket、一个核、两线程。 有效的CPU-THREAD-POLICY值为: * prefer: \(默认值\) 主机可能是也可能不是SMT(同时多线程simultaneous multithreading-based)架构,如果应用SMT架构时,优选兄弟线程。 * isolate: 应用在主机可能不是SMT架构,或者必须模拟非SMT架构。当主机不是SMT架构时,每个vCPU相当于一个核。如果主机应用SMT架构,也就是说一个物理和有多个兄弟线程,每个vCPU也相当于一个物理核。其他虚拟机的vCPU不会放在同一个核上。选中的核上只有一个兄弟线程可用。 * require: 主机必要使用SMT架构。每个vCPU被分配在兄弟线程上。如果主机没有SMT架构,那就不使用此主机。如果主机使用SMT架构,却没有足够空闲线程的核,那么nova调度失败。 _注意:_ hw:cpu\_thread\_policy只在hw:cpu\_policy设置为dedicated时有效。 ## NUMA拓扑 Libvirt驱动程序可以为虚拟机vCPU定义放置的NUMA节点,或者定义虚拟机从哪个NUMA节点分配vCPU与内存。对于内存与vCPU超过计算节点NUMA容量的flavor,NUMA拓扑定义允许主机更好地利用NUMA并提高GuestOS的性能。 ```bash $ openstack flavor set FLAVOR-NAME \ --property hw:numa_nodes=FLAVOR-NODES \ --property hw:numa_cpus.N=FLAVOR-CORES \ --property hw:numa_mem.N=FLAVOR-MEMORY ``` * FLAVOR-NODES: \(整数\) 限制虚拟机vCPU线程运行的可选NUMA节点数量。如果不指定,则vCPU线程可以运行在任意可用的NUMA节点上。 * N: \(整数\) 应用CPU或内存配置的虚拟机NUMA节点,值的范围从0到FLAVOR-NODES \- 1。比如为0,则运行在NUMA节点0;为1,则运行在NUMA节点1. * FLAVOR-CORES: \(英文逗号分隔的整数\) 映射到虚拟机NUMA节点N上的虚拟机vCPU列表。如果不指定,vCPU在可用的NUMA节点之间平均分配。 * FLAVOR-MEMORY: \(整数,单位MB\) 映射到虚拟机NUMA节点N上的虚拟机内存大小。如果不指定,则内存平均分配到可用NUMA节点。 例子:Flavor定义虚拟机有4个vCPU,4096MB内存,以下表示虚拟机的vCPU与内存可以分布在2个NUMA节点。虚拟机的0号与1号vCPU在NUMA 0上,2号与3号vCPU在NUMA 1上。虚拟机的2048MB内存在NUMA 0上,另外的2048MB内存分配到在NUMA 1上。 ```bash $ openstack flavor set aze-FLAVOR \ --property hw:numa_nodes=2 \ --property hw:numa_cpus.0=0,1 \ --property hw:numa_cpus.1=2,3 \ --property hw:numa_mem.0=2048 \ --property hw:numa_mem.1=2048 \ ``` _注意:_ hw:numa\_cpus.N与hw:numa\_mem.N只在设置hw:numa\_nodes时有效。另外,只有当实例的NUMA节点具有非对称的CPU和RAM分配(对于某些NFV工作负载很重要)时才需要。 _注意:_ **N是虚拟机NUMA节点的索引,并不一定对应主机NUMA节点。**例如,在两个NUMA节点的平台,根据hw:numa\_mem.0,调度会选择虚拟机NUMA节点0,但是却是在主机NUMA节点1上,反之亦然。类似的,FLAVOR-CORES也是虚拟机vCPU的编号,并不对应与主机CPU。因此,**这个特性不能用来约束虚拟机所处的主机CPU与NUMA节点。** _警告:_ 如果hw:numa\_cpus.N或hw:numa\_mem.N的值比可用CPU或内存大,则会引发错误。 ## 大页内存分配 ```bash $ openstack flavor set FLAVOR-NAME \ --property hw:mem_page_size=PAGE_SIZE ``` 有效的PAGE\_SIZE值为: * small: \(默认值\) 使用最小的内存页面,例如x86平台的4KB。 * large: 虚拟机RAM使用大页内存。例如x86平台的2MB或1G。 * any: 取决于计算驱动程序。此情况下,Libvirt驱动可能会尝试寻找内存大页,但最终回落到小页。其他的驱动则可能选择可用策略。 _注意:_ 大页内存可以分配给虚拟机内存,而不考虑Guest OS是否使用。如果Guest OS不使用大页内存,则它值会识别小页。反过来,如果Guest OS计划使用大页内存,则一定要给虚拟机分配大页内存。否则虚拟机的性能将不及预期。 最后修改:2021 年 09 月 29 日 11 : 20 AM © 转载自他站 赞赏 要多恰饭才能长胖 赞赏作者 支付宝微信