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 [<Hyper-V host>]" Write-Host "numa.ps1 /set <vm machine name> <required node> [<Hyper-V host>]" Write-Host "numa.ps1 /clear <vm machine name> [<Hyper-V host>]`n" Write-Host "Options:" Write-Host "`t/list - show configured VM's" Write-Host "`t/set <vm machine name> <required node> - set the NUMA node for the VM" Write-Host "`t/clear <vm machine name> - 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
Je travaille actuellement en tant qu’Enterprise Architect pour le groupe CAPGEMINI. Acteur et expert communautaire reconnu depuis de nombreuses années, j’anime ce site autour des technologies Microsoft, des thématiques du Cloud, des infrastructures, … Je suis également à l’origine de nombreuses publications dans la presse IT.