博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转] Hyper-V如何避免NUMA對效能上的影響
阅读量:5846 次
发布时间:2019-06-18

本文共 4398 字,大约阅读时间需要 14 分钟。

源地址:

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

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

它的設定,在這裡

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

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

 

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

 

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

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

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

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

 

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

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

 

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

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

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

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

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

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

 

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

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

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

 

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

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

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

藍框的部份,則是該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提供的,網址如下:

 

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

 
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關機後再開機才會生效。

转载于:https://www.cnblogs.com/licheng/archive/2013/03/25/2979970.html

你可能感兴趣的文章
阿里数据中台七年演化史——行在口述干货
查看>>
10.Java异常问题
查看>>
利用Git Webhooks实现jekyll博客自动化部署
查看>>
Fescar undoExecutor介绍
查看>>
Linux命令操作大全
查看>>
从周五开始香港主机特别慢,香港主机用户有同感吗?
查看>>
Ember.js 3.9.0-beta.3 发布,JavaScript Web 应用开发框架
查看>>
python标准库00 学习准备
查看>>
4.2. PHP crypt()
查看>>
commonservice-config配置服务搭建
查看>>
连接池的意义及阿里Druid
查看>>
ComponentOne 2019V1火热来袭!全面支持 Visual Studio 2019——亮点之WinForm篇
查看>>
Python递归函数与匿名函数
查看>>
loadrunner安装运行一步一步来(多图)
查看>>
git请求报错 401
查看>>
监控工具htop的安装及使用
查看>>
Nodejs使用图灵机器人获取笑话
查看>>
Spring 任务调度 简单的,使用Schedule
查看>>
SQL 2005删除作业计划出错(DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突。)的解决...
查看>>
【Touch&input 】支持多个游戏控制器(18)
查看>>