zoukankan      html  css  js  c++  java
  • [转] HyperV如何避免NUMA對效能上的影響

    源地址:http://www.dotblogs.com.tw/daniel07793/archive/2012/03/26/71046.aspx

    =========================================================

    NUMA在一般人使用Hyper-V時,是一個非常容易被忽略的部份

    它的設定,在這裡

    00043

    而這項功能為何會有降低整體效能的可能?

    這裡有一份電子報,有介紹何謂NUMA架構,可以參考一下這張圖片

    201012201508001

    多核心計算環境—NUMA與CPUSET簡介

    http://www.cc.ntu.edu.tw/chinese/epaper/0015/20101220_1508.htm

    然而,這項技術,運用在虛擬化的主機時,如果是未經過計算的情況下,就有可能產生效能上的問題

    因為,它在Hyper-V上運作會是像下圖

    下面的圖片來源,是國外的IT人員的文章

    http://workinghardinit.wordpress.com/2011/08/08/virtualization-with-hyper-v-the-numa-tax-is-not-just-about-dynamic-memory/

    下圖這樣的存取模式,在NUMA中又稱為本地端記憶體存取

    image10

    然而,Virtual Machine在某些情況下,就會產生下圖的情況(像是Node1的Memory已經不足,而調用Node2的Memory)

    又稱為非本地端記憶體存取

    image11

    接下來的案例會展示這樣的一種情況

    這是我這次測試的主機板Tyan S7016,是一個2 Socket Server 共18個DIMM

    S7016_2D

    CPU的實體配置是Intel E5620兩顆(E5620實體核心數是四核心,開啟HT後,一顆是八個執行緒)

    而18個DIMM則是插滿DDR3 ECC 8GB

    所以一共會有16個Processor、144GB的Memory

    00047

    所以,一個NUMA的節點將會是8個Processor、72GB的RAM

    我們可以透過資料收集器,去得知目前的NUMA Node在Memory跟CPU的配置情況

    ※分頁的大小是4KB,18,874,272個分頁(4KB/個),也就是71.99GB(少掉的那一點點應該是Hypervisor用掉了)

    如果是18,874,368個分頁(4KB/個),就是剛好72GB

    00046

    然而Hyper-V在分配NUMA時,會自動盡可能的避免存取到非本地端記憶體的節點

    一樣可以透過資料收集器,去取得目前虛擬機的NUMA配置節點,以及是否有用到非本地端記憶體

    下圖就是一個使用到非本地端記憶體的案例(紅框處)

    00048

    藍框的部份,則是該Virtual Machine所使用的主要NUMA節點是NUMA Node 0,沒有使用到非本地端記憶體

    綠框的部份,則是該Virtual Machine所使用的主要NUMA節點是NUMA Node 1,沒有使用到非本地端記憶體

    紅框的部份,則是該Virtual Machine所使用的主要NUMA節點是NUMA Node 0,使用了約9G多的非本地端記憶體

    上面這個案例,是我先將記憶體在NUMA Node 0已使用約43GB、NUMA Node 1則是使用60GB的情況(這是自動分配的使用狀況)

    然後,在將ServiceVM00006這部Virtual Machine以40GB RAM啟動

    因為沒有任何一個Node符合可以使用完全非本地端記憶體,所以就會產生這個問題

    但是實際上,我這部機器如果照這樣的設定,將VM全開一定要用到NUMA非本地端記憶體嗎?

    其實是不用到的,我們可以先依據NUMA節點的記憶體配置以及CPU配置,來評估要如何手動配置VM該屬於哪一個NUMA節點

    我們可以透過這個PowerShell去指派哪些VM該用哪一個NUMA Node的資源去啟動

    這個PowerShell的來源是微軟官方Virtual Machine開發團隊的MSDN Blog提供的,網址如下:

    http://blogs.msdn.com/b/tvoellm/archive/2008/09/28/looking-for-that-last-once-of-performance_3f00_-then-try-affinitizing-your-vm-to-a-numa-node-.aspx

    相信小弟人品的,就請自行取用吧

    01 ################################################
    02 # Developer: Anthony F. Voellm
    03 #          : Taylor Brown
    04 # Copyright (c) 2008 by Microsoft Corporation
    05 # All rights reserved
    06 #
    07 # This is "demonstration" code and there are no
    08 # warrantees expressed or implied
    09 ################################################
    10   
    11   
    12   
    13 # This script will set the Virtual Machine to run
    14 # on a specific NUMA node
    15   
    16   
    17   
    18 # Check command line arguments
    19   
    20 if (($args.length -lt 1) -or
    21     (($args[0] -ne "/list") -and
    22      ($args[0] -ne "/set") -and
    23      ($args[0] -ne "/clear")) -or
    24      (($args[0] -eq "/set") -and ($args.length -lt 3)) -or
    25      (($args[0] -eq "/clear") -and ($args.length -lt 2))) {
    26      Write-Host "numa.ps1 /list [<Hyper-V host>]"
    27      Write-Host "numa.ps1 /set <vm machine name> <required node> [<Hyper-V host>]"
    28      Write-Host "numa.ps1 /clear <vm machine name> [<Hyper-V host>]`n"
    29      Write-Host "Options:"
    30      Write-Host "`t/list - show configured VM's"
    31      Write-Host "`t/set <vm machine name> <required node> - set the NUMA node for the VM"
    32      Write-Host "`t/clear <vm machine name> - clear NUMA node seting for the VM"
    33      exit;
    34   }
    35   
    36   
    37   
    38 # just display VM's
    39 if ($args[0] -eq "/list") {
    40   if ($args.length -gt 1) {
    41     $HyperVHost = $args[1];
    42   }
    43   Get-WmiObject -Namespace 'root\virtualization' -Query "Select * From Msvm_ComputerSystem" | select ElementName
    44   exit;
    45 }
    46   
    47   
    48   
    49 # Set or clear
    50  
    51 $HyperVHost = '.';
    52 if ($args[0] -eq "/set") {
    53   if ($args.length -gt 3) {
    54     $HyperVHost = $args[3];
    55   }
    56   $VMName = $args[1];
    57   $RequiredNode = $args[2];
    58 } elseif ($args[0] -eq "/clear") {
    59   if ($args.length -gt 2) {
    60     $HyperVHost = $args[2];
    61   }
    62   $VMName = $args[1];
    63 }
    64   
    65    
    66 #Main Script Body
    67 $VMManagementService = Get-WmiObject -Namespace root\virtualization -Class Msvm_VirtualSystemManagementService -ComputerName $HyperVHost
    68   
    69  
    70 $Query = "Select * From Msvm_ComputerSystem Where ElementName='" + $VMName + "'"
    71   
    72   
    73 $SourceVm = Get-WmiObject -Namespace root\virtualization -Query $Query -ComputerName $HyperVHost
    74  
    75   
    76   
    77 $VMSettingData = Get-WmiObject -Namespace root\virtualization -Query "Associators of {$SourceVm} Where ResultClass=Msvm_VirtualSystemSettingData AssocClass=Msvm_SettingsDefineState" -ComputerName $HyperVHost
    78  
    79   
    80   
    81 if ($args[0] -eq "/set") {
    82   $VMSettingData.NumaNodesAreRequired = 1
    83   $VMSettingData.NumaNodeList = @($RequiredNode)
    84 } else {
    85   $VMSettingData.NumaNodesAreRequired = 0
    86 }
    87   
    88   
    89   
    90 $VMManagementService.ModifyVirtualSystem($SourceVm, $VMSettingData.PSBase.GetText(1))

    將以上程式碼,儲存成numa.ps1

    接著,就可以用PowerShell,使用numa.ps1指定Virtual Machine該在哪一個NUMA Node上

    而不再是自動分配,避免有可能產生本地端記憶體不夠配置的問題

    指令的範例:

    .\numa.ps1 /List可以取得Virtual Machine的名稱

    .\numa.ps1 /Set VirtualMachineName 0,則是將這部Virtual Machine指派給NUMA Node 0

    .\numa.ps1 /Clear VirtualMachineName,則是恢復自動指派

    指派完畢,都是需要將Virtual Machine關機後再開機才會生效。

  • 相关阅读:
    网络对抗技术-实验四
    网络对抗技术-实验三
    安卓终端-Termux
    linux杂记
    使用pl/sql导入导出oracle
    systemctl 实现开机自启服务
    Java8 Collectors.toMap的坑
    idea使用lombok插件
    解决Lost connection to MySQL server during query错误方法
    java8之lamda
  • 原文地址:https://www.cnblogs.com/licheng/p/2979970.html
Copyright © 2011-2022 走看看