聲明:
本博客歡迎轉載,但請保留原作者信息!
作者:黃堆榮
團隊:華爲杭州OpenStack團隊
1、簡介
Openstack在J版本中新增NUMA特性,用戶可以通過將虛擬機只能的CPU和內存綁定到物理機的NUMA節點上來提升虛擬機的性能。
2、使用方式
NUMA分配方式有兩種方式:
1、用戶指定NUMA節點的個數,然後由Nova根據套餐中的規格平均將CPU和內存分佈到不同的NUMA節點上(默認從node 0開始分配,依次遞增)。
2、用戶指定NUMA節點的個數,以及每個NUMA上分配的虛擬機CPU的編號以及內存大小
可以通過設置套餐和鏡像的屬性來指定虛擬機的NUMA的部署方式,創建虛擬機的時候選擇特定套餐或則鏡像來實現NUMA,具體方法如下:
1、設置套餐的extra_specs屬性,設置方式如下
nova flavor-key flv_name set hw:numa_nodes=2 hw:numa_cpus.0=0 hw:numa_mem.0=512 hw:numa_cpus.1=0 hw:numa_mem.1=512
2、創建鏡像的property屬性,設置方式如下
glance image-update --property hw_numa_nodes=2 hw_numa_cpus.0=0 hw_numa_mem.0=512 hw_numa_cpus.1=0 hw_numa_mem.1=512 image_name
各個字段表示的含義如下:
numa_nodes:該虛擬機包含的NUMA節點個數
numa_cpus.0:虛擬機上NUMA節點0包含的虛擬機CPU的ID,格式"1-4,^3,6",如果用戶自己指定部署方式,則需要指定虛擬機內每個NUMA節點的CPU部署信息,所有NUMA節點上的CPU總和需要與套餐中vcpus的總數一致。
numa_mem.0:虛擬機上NUMA節點0包含的內存大小,單位M,如果用戶自己指定部署方式,則需要指定虛擬機內每個NUMA節點的內存信息,所有NUMA節點上的內存總和需要等於套餐中的memory_mb大小。
自動分配NUMA的約束和限制:
1、不能設置numa_cpus和numa_mem
2、自動從0節點開始平均分配
手動指定NUMA的約束和限制:
1、用戶指定的CPU總數需要與套餐中的CPU個數一致
2、用戶指定的內存總數需要與套餐中的內存總數一致
3、必須設置numa_cpus和numa_mem
4、需要從0開始指定各個numa節點的資源佔用
3、總體流程分析
Nova各個組件實現NUMA特性的處理如下:
nova-api對於套餐或者鏡像中的參數處理之後,保存在instance['numa_topology']中,信息格式如下:
{
"cells": [
{
"mem": {
"total": 1024
},
"cpus": "0,1",
"id": 0
},
{
"mem": {
"total": 1024
},
"cpus": "2,3",
"id": 0
}
]
}
nova-api創建虛擬機的處理流程中對於NUMA參數的處理如下:
nova-compute獲取主機側總的資源信息邏輯如下:
nova-scheduler中NUMATopologyFilter調度器的處理流程如下:
nova-compute中的Claim流程會對資源再做一次校驗,校驗完成之後生成的XML信息:
虛擬機部署完成之後生成的XML對應信息如下:
<domain>
<cputune>
<span style="color:#006600;">/*虛擬機CPU與物理機的綁定關係,4-7,12-15在一個物理機的NODE節點上,0-3,8-11在另外一個NODE節點上*/</span>
<vcpupin vcpu="0" cpuset="4-7,12-15"/>
<vcpupin vcpu="1" cpuset="4-7,12-15"/>
<vcpupin vcpu="2" cpuset="0-3,8-11"/>
<vcpupin vcpu="3" cpuset="0-3,8-11"/>
<emulatorpin cpuset="0-15"/>
</cputune>
***
<cpu match="host-model">
<model fallback="allow"/>
<topology sockets="2" cores="2" threads="1"/>
<span style="color:#006600;">/*虛擬機內部的NUMA信息,一個cell表示一個虛擬機的NODE節點,默認從0開始編號*/</span>
<feature policy="disable" name="lahf_lm"/>
<numa>
<span style="color:#006600;">/*cpus表示該NODE節點內包含的虛擬機CPU的ID信息,memory表示該NODE節點包含的內存大小,默認單位KB*/</span>
<cell id="0" cpus="0-1" memory="1048576"/>
<cell id="1" cpus="2-3" memory="1048576"/>
</numa>
</cpu>
</domain>
通過對流程分析,J版本中虛擬機的NUMA分配主要採用的是平均分配或者用戶指定的方式,因此在nova-api中就已經確定好虛擬機對應的拓撲信息。但是在最終XML裏面並沒有numatune的信息,因此從現有的XML並無法看出虛擬機每個NUMA節點上的內存是從哪個物理機的NUMA節點上分配的,在Redhat的OS中,內存默認的分配方式與CPU的分配方式一致,但是在SUSE的平臺上,需要指定numatune信息才能生效。
本篇主要是對J版本中NUMA特性的總體邏輯進行下簡單的分析,下一篇博客會對代碼中的詳細流程進行分析。