Catégories

NUMA et virtualisation

Un aspect très important de la configuration de la mémoire des ordinateurs virtuels est l’accès mémoire non uniforme (NUMA). Cet accès permet d’accélérer l’accès mémoire en partitionnant la mémoire physique de telle sorte que chaque coeur d’un socket dispose de sa propre mémoire. Par exemple, dans un système à 8 cœurs et 32 Go de RAM, chaque cœur ou nœud possède 4 Go de mémoire physique.

Si un ordinateur virtuel est configuré pour utiliser 12 Go de RAM, le système doit utiliser la mémoire d’un autre nœud. Le franchissement de la limite NUMA peut réduire les performances virtuelles jusqu’à 8 %, une bonne pratique consiste à configurer un ordinateur virtuel pour utiliser les ressources d’un seul nœud NUMA.

Plutôt qu’un long discours, voici deux schémas permettant de bien comprendre la technologie NUMA.

Le script suivant permet de forcer une affinité NUMA pour une machine virtuelle

################################################
# Developer: Anthony F. Voellm
#          : Taylor Brown
# Copyright (c) 2008 by Microsoft Corporation
# All rights reserved
#
# This is "demonstration" code and there are no
# warrantees expressed or implied
################################################</p>
# This script will set the Virtual Machine to run
# on a specific NUMA node

# Check command line arguments

if (($args.length -lt 1) -or
(($args[0] -ne "/list") -and
($args[0] -ne "/set") -and
($args[0] -ne "/clear")) -or
(($args[0] -eq "/set") -and ($args.length -lt 3)) -or
(($args[0] -eq "/clear") -and ($args.length -lt 2))) {
Write-Host "numa.ps1 /list [&lt;Hyper-V host&gt;]"
Write-Host "numa.ps1 /set &lt;vm machine name&gt; &lt;required node&gt; [&lt;Hyper-V host&gt;]"
Write-Host "numa.ps1 /clear &lt;vm machine name&gt; [&lt;Hyper-V host&gt;]`n"
Write-Host "Options:"
Write-Host "`t/list - show configured VM's"
Write-Host "`t/set &lt;vm machine name&gt; &lt;required node&gt; - set the NUMA node for the VM"
Write-Host "`t/clear &lt;vm machine name&gt; - clear NUMA node seting for the VM"
exit;
}

# just display VM's
if ($args[0] -eq "/list") {
if ($args.length -gt 1) {
$HyperVHost = $args[1];
}
Get-WmiObject -Namespace 'root\virtualization' -Query "Select * From Msvm_ComputerSystem" | select ElementName
exit;
}

# Set or clear

$HyperVHost = '.';
if ($args[0] -eq "/set") {
if ($args.length -gt 3) {
$HyperVHost = $args[3];
}
$VMName = $args[1];
$RequiredNode = $args[2];
} elseif ($args[0] -eq "/clear") {
if ($args.length -gt 2) {
$HyperVHost = $args[2];
}
$VMName = $args[1];
}

#Main Script Body
$VMManagementService  = Get-WmiObject -Namespace root\virtualization -Class  Msvm_VirtualSystemManagementService -ComputerName $HyperVHost

$Query = "Select * From Msvm_ComputerSystem Where ElementName='" + $VMName + "'"

$SourceVm = Get-WmiObject -Namespace root\virtualization -Query $Query -ComputerName $HyperVHost

$VMSettingData  = Get-WmiObject -Namespace root\virtualization -Query "Associators of  {$SourceVm} Where ResultClass=Msvm_VirtualSystemSettingData  AssocClass=Msvm_SettingsDefineState" -ComputerName $HyperVHost

if ($args[0] -eq "/set") {
$VMSettingData.NumaNodesAreRequired = 1
$VMSettingData.NumaNodeList = @($RequiredNode)
} else {
$VMSettingData.NumaNodesAreRequired = 0
}

$VMManagementService.ModifyVirtualSystem($SourceVm, $VMSettingData.PSBase.GetText(1))

La syntaxe est très simple:

numa.ps1 /set NOMVM noeudnuma => numa.ps1 /set sql2012 2

numa.ps1 /? => obtenir l'aide

Un compteur de performance permet de vérifier l’afinité d’une machine virtuelle à noeud NUMA, il se nomme Preferred NUMA Node Index

image_pdfimage_print

Laisser un commentaire

Vous devez être connecté pour publier un commentaire.