{"id":367,"date":"2015-06-26T15:07:48","date_gmt":"2015-06-26T14:07:48","guid":{"rendered":"http:\/\/snakenet.eu\/blog\/?p=367"},"modified":"2016-01-29T12:11:53","modified_gmt":"2016-01-29T11:11:53","slug":"utilisation-memoire-des-vms","status":"publish","type":"post","link":"https:\/\/snakenet.eu\/blog\/utilisation-memoire-des-vms\/367\/","title":{"rendered":"Utilisation m?moire des VMs"},"content":{"rendered":"<p>Cela fait un moment que j&rsquo;essaye de trouver le juste ?quilibre entre l&rsquo;allocation de ressource et ce que les utilisateurs demandent.<br \/>\nTr?s souvent, c&rsquo;est TRES largement sur-?valu?. Bien sur, VMware ESXi s&rsquo;en sort tr?s bien et optimise ? la vol?e, mais&#8230; j&rsquo;aime pas.<br \/>\nJ&rsquo;ai donc cherch? comment mesurer les ressources r?ellement utilis?es et j&rsquo;en suis arriv? ? ces conclusions:<\/p>\n<ul>\n<li>VMware montre ce que les VMs utilisent REELLEMENT.\n<ul>\n<li>Si vous d?marrez un Windows et le laissez ? ne rien faire pendant des jours, VMware vous montrera une utilisation de quelques centaines de Mo, pas plus. Or, si vous regardez le Gestionnaire des taches, vous constaterez une utilisation de 2 Go&#8230; Comment Est-ce possible?<\/li>\n<li>VMware note ce qui est r?ellement utilis?. Or, Windows ne fout rien&#8230; Donc, VMware montre qu&rsquo;il n&rsquo;utilise rien..<\/li>\n<\/ul>\n<\/li>\n<li>Windows r?serve ses ressources pour le cas o?. Typiquement, un SQL Server va manger la quasi totalit? de RAM disponible pour lui tout seul (gourmand) alors que potentiellement, il n&rsquo;en utilise que quelques Mo&#8230; Gourmand !\n<ul>\n<li>Un bon DBA pourra limiter l&rsquo;utilisation de la RAM par SQL Server pour ?viter qu&rsquo;il ne vampirise toute la RAM.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Mais comment trouver la \u00ab\u00a0v?rit?\u00a0\u00bb dans ce merdier? Ben&#8230; En mesurant les 2 et en r?fl?chissant.<\/p>\n<p>Les 3 sont :<\/p>\n<ol>\n<li>Utilisation r?elle (VMware side)<\/li>\n<li>Utilisation Windows<\/li>\n<li>Le croisement des deux<\/li>\n<\/ol>\n<p>Allons-y :<\/p>\n<h1>1. Ressources sur les 5 derniers jours<\/h1>\n<p>(au del?, il agr?ge les donn?es, et ca ne veux plus rien dire)<\/p>\n<pre>Function Get-TrueUsage {\r\n? param ($Name, $Start=((get-date).adddays(-5)), $End=(get-date))\r\n# Usage : Get-TrueUsage -Name VM01 -Start ((get-date).addMonths(-2)) -End (get-date)\r\n\r\n? $MyVM=Get-VM -Name $name\r\n? $MyVMView=$MyVM | get-view\r\n\r\n? $obj=New-Object PSObject\r\n? $obj | add-Member Noteproperty -name Name -value $Name\r\n? $obj | add-Member Noteproperty -name Datacenter -value $MyVM | Get-Datacenter\r\n\r\n? $StatsESX= $MyVM | select Name, @{n=\"AssignedMemory\";e={$_.MemoryGB*1024*1024}}, @{n=\"HostMemoryUsage\";e={$_.ExtensionData.Summary.QuickStats.HostMemoryUsage*1024}} \r\n? $StatsMemGuest=? Get-Stat -Entity ($MyVM ) -Start $Start -Finish $End -Stat mem.active.average | measure -max -min -Average Value\r\n? $StatsCpuGuest=? Get-Stat -Entity ($MyVM ) -Start $Start -Finish $End -Stat cpu.usage.average? | measure -max -min -Average Value\r\n\r\n? $obj | add-Member -MemberType Noteproperty -name AssignedMem?? -value $StatsESX.AssignedMemory\r\n? $obj | add-Member -MemberType Noteproperty -name HostUsedMem?? -value $StatsESX.HostMemoryUsage\r\n\r\n? $obj | Add-Member -MemberType NoteProperty -Name CPUSocket???? -Value ($MyVMView.config.hardware.NumCPU\/(@{$true=$MyVMView.config.hardware.NumCoresPerSocket;$False=1}[$MyVMView.config.hardware.NumCoresPerSocket -gt 0 ]))\r\n? $obj | Add-Member -MemberType NoteProperty -Name Corepersocket -Value @{$true=$MyVMView.config.hardware.NumCoresPerSocket;$False=1}[$MyVMView.config.hardware.NumCoresPerSocket -gt 0 ]\r\n\r\n? $obj | add-Member -MemberType Noteproperty -name GuestMaxMem?? -value (($StatsMemGuest.Maximum) )\r\n? $obj | add-Member -MemberType Noteproperty -name GuestMinMem?? -value (($StatsMemGuest.Minimum) )\r\n? $obj | add-Member -MemberType Noteproperty -name GuestAvgMem?? -value ([math]::round($StatsMemGuest.Average) )\r\n\r\n? $obj | add-Member -MemberType Noteproperty -name MemPrivShar?? -value ($MyVM.ExtensionData.Summary.QuickStats.PrivateMemory + $MyVM.ExtensionData.Summary.QuickStats.SharedMemory)\r\n\r\n? $obj | add-Member -MemberType Noteproperty -name GaspillageMem -value (([Math]::round((1-($StatsMemGuest.Maximum\/$StatsESX.AssignedMemory)) *10000 ))\/10000 )\r\n\r\n? $obj | Add-Member -MemberType NoteProperty -Name GuestMaxCpu?? -value ([Math]::round(($StatsCpuGuest.Maximum)*100 )\/10000)\r\n? $obj | Add-Member -MemberType NoteProperty -Name GuestMinCpu?? -value ([Math]::round(($StatsCpuGuest.Minimum)*100 )\/10000)\r\n? $obj | Add-Member -MemberType NoteProperty -Name GuestAvgCpu?? -value ([math]::round(($StatsCpuGuest.Average)*100 )\/10000)\r\n\r\n? $obj | add-Member -MemberType Noteproperty -name GaspillageCpu -value ([Math]::truncate($MyVMView.config.hardware.NumCPU - ($MyVMView.config.hardware.NumCPU*($StatsCpuGuest.Maximum\/100))))\r\n\r\n## WMI\r\n? try{\r\n??? $WMIPageFile=Get-WmiObject Win32_PageFileUsage -ComputerName $MyVM | select Name,CurrentUsage,AllocatedBaseSize,PeakUsage,TempPageFile\r\n? } catch {\r\n??? $WMIPageFile=''|select Name,CurrentUsage,AllocatedBaseSize,PeakUsage,TempPageFile \r\n? }\r\n\r\n? $obj | Add-Member -MemberType NoteProperty -Name SwapFile????????? -value ($WMIPageFile.Name)\r\n? $obj | Add-Member -MemberType NoteProperty -Name SwapCurrentUsage? -value ($WMIPageFile.CurrentUsage)\r\n? $obj | Add-Member -MemberType NoteProperty -Name SwapAllocatedSize -value ($WMIPageFile.AllocatedBaseSize)\r\n? $obj | Add-Member -MemberType NoteProperty -Name SwapPeak????????? -value ($WMIPageFile.PeakUsage)\r\n\r\n? # Calculs recommandations\r\n\r\n? # Pic m?moire + 20% et ensuite par blocks rond\r\n? $NewMem=$obj.GuestMaxMem *1.2 \/1024\r\n? switch ($true) {\r\n??? ( $NewMem -gt 4096) {$NewMem=([Math]::Truncate($NewMem \/ 2048)+1)*2048;break}\r\n??? ( $NewMem -gt 3072) {$NewMem=4096;break}\r\n??? ( $NewMem -gt 2048) {$NewMem=3072;break}\r\n??? ( $NewMem -gt 1024) {$NewMem=2048;break}\r\n??? ( $NewMem -gt 512)? {$NewMem=1024;break}\r\n??? default???????????? {$NewMem=512;break}\r\n? }\r\n\r\n? # Pic CPU \r\n? $NewCpu=[System.Math]::Round($obj.GuestMaxCpu * $obj.CPUSocket * $obj.Corepersocket ,0)\r\n? if (($obj.CPUSocket + $obj.Corepersocket) -gt 2 -and $NewCpu -le 1 ) {$NewCpu=2}\r\n? if ($NewCpu -le 1 ) {$NewCpu=1}\r\n\r\n? $obj | Add-Member -MemberType NoteProperty -Name RecommendedMemory -value $NewMem\r\n? $obj | Add-Member -MemberType NoteProperty -Name RecommendedCpu??? -value $NewCpu\r\n\r\n? $obj\r\n}<\/pre>\n<h1>Le Performance Monitor<\/h1>\n<p>Ce truc peux sauver tout un tas de compteur de votre machine. Les ressources sont quasiment illimit?es, une vrai mine d&rsquo;or.<\/p>\n<pre>REM Delete the counter if it allready exist.\r\nlogman STOP VMWARE_AUDIT_MEMORY\r\nlogman DELETE VMWARE_AUDIT_MEMORY \r\nREM Create the counter\r\nlogman CREATE counter VMWARE_AUDIT_MEMORY -f bincirc -max 500 -si 2 --v -o \"C:\\perflogs\\VMWARE_AUDIT_MEMORY\" -c \"\\Memory\\Available MBytes\"\r\n\r\nREM We need to delete the old file as the DataCollector does not support an existing file.\r\ndel C:\\perflogs\\VMWARE_AUDIT_MEMORY.blg\r\nlogman START VMWARE_AUDIT_MEMORY<\/pre>\n<h1>Le m?lange des 2<\/h1>\n<p>Bon, ben&#8230; J&rsquo;en suis pas encore l?&#8230;<\/p>\n<p>On va comparer l&rsquo;utilisation r?elle VMware (get-stat), les ressources utilis?es par la VM (perfmon), la swap (wmi),&#8230;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cela fait un moment que j&rsquo;essaye de trouver le juste ?quilibre entre l&rsquo;allocation de ressource et ce que les utilisateurs demandent. Tr?s souvent, c&rsquo;est TRES largement sur-?valu?. Bien sur, VMware ESXi s&rsquo;en sort tr?s bien et optimise ? la vol?e, mais&#8230; j&rsquo;aime pas. J&rsquo;ai donc cherch? comment mesurer les ressources r?ellement utilis?es et j&rsquo;en suis [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,47,14],"tags":[],"class_list":["post-367","post","type-post","status-publish","format-standard","hentry","category-performances","category-performances-3","category-vmware"],"_links":{"self":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts\/367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/comments?post=367"}],"version-history":[{"count":8,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts\/367\/revisions"}],"predecessor-version":[{"id":379,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts\/367\/revisions\/379"}],"wp:attachment":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/media?parent=367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/categories?post=367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/tags?post=367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}