Openstack J版本 NUMA特性相關分析(一)

聲明:

本博客歡迎轉載,但請保留原作者信息!

作者:黃堆榮

團隊:華爲杭州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特性的總體邏輯進行下簡單的分析,下一篇博客會對代碼中的詳細流程進行分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章