<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hypervisor.fr &#187; slot size</title>
	<atom:link href="http://www.hypervisor.fr/?feed=rss2&#038;tag=slot-size" rel="self" type="application/rss+xml" />
	<link>http://www.hypervisor.fr</link>
	<description>French Bare-Metal weblog</description>
	<lastBuildDate>Wed, 26 Jun 2024 22:42:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[PSH] HA AutoSlotSize &#8211; MAJ</title>
		<link>http://www.hypervisor.fr/?p=4283</link>
		<comments>http://www.hypervisor.fr/?p=4283#comments</comments>
		<pubDate>Sun, 21 Oct 2012 22:37:14 +0000</pubDate>
		<dc:creator>NiTRo</dc:creator>
				<category><![CDATA[VMware]]></category>
		<category><![CDATA[HA]]></category>
		<category><![CDATA[PowerCLI]]></category>
		<category><![CDATA[powershell]]></category>
		<category><![CDATA[slot size]]></category>
		<category><![CDATA[webclient]]></category>

		<guid isPermaLink="false">http://www.hypervisor.fr/?p=4283</guid>
		<description><![CDATA[MAJ 21.02.2013 : Ajout de filtres pour les hosts vide afin d’éviter les divisions par 0.
MAJ 06.02.2013 : Debug des scripts.
MAJ 22.11.2012 : Nous avons oublié de préciser que pour que le script fonctionne correctement, le &#8220;statistic level&#8221; pour l&#8217;intervale de 5 minutes doit être à 2 minimum :

MAJ 23.10.2012 : Ajout d&#8217;un filtre dans les scripts [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><em><span style="color: #ff0000;">MAJ 21.02.2013</span> : Ajout de filtres pour les hosts vide afin d’éviter les divisions par 0.</em></p>
<p style="text-align: justify;"><em><span style="color: #ff0000;">MAJ 06.02.2013</span> : Debug des scripts.</em></p>
<p style="text-align: justify;"><em><span style="color: #ff0000;">MAJ 22.11.2012</span> : Nous avons oublié de préciser que pour que le script fonctionne correctement, le &#8220;statistic level&#8221; pour l&#8217;intervale de 5 minutes doit être à <strong>2 minimum</strong> :</em></p>
<p style="text-align: center;"><a href="http://files.hypervisor.fr/img/AutoSlotSize/ha_stats.png"><img class="aligncenter" src="http://files.hypervisor.fr/img/AutoSlotSize/ha_stats.png" alt="" width="238" height="231" /></a></p>
<p style="text-align: justify;"><em><span style="color: #ff0000;">MAJ 23.10.2012</span> : Ajout d&#8217;un filtre dans les scripts pour ne modifier le(s) cluster que si nécéssaire.</em></p>
<p style="text-align: justify;">Suite au post de Frank &#8220;distributed&#8221; Denneman traitant du sujet délicat des HA slot size &#8220;<a href="http://frankdenneman.nl/vmware/ha-admission-control-is-not-a-capacity-management-tool/" target="_blank">HA admission control is not a capacity management tool</a>&#8220;, nous avons dépoussiéré une vieille idée de script de <strong>configuration automatique des &#8220;slot size&#8221;</strong> (mémoire et cpu) d&#8217;un cluster HA pour en faire un bon petit oneliner. L&#8217;idée est <strong>forcer le &#8220;slot size&#8221; à une valeur reflétant une vm moyenne du cluster</strong> afin de savoir approximativement la &#8220;<em>place</em>&#8221; restante dans le cluster et surtout pouvoir vraiment tirer parti de l&#8217;alarme &#8220;<a href="http://kb.vmware.com/kb/1001596">insufficient resources to satisfy HA failover level</a>&#8220;</p>
<p style="text-align: justify;">Nous avons fais nos tests sur un cluster de 6 ESXi 4.1 (4&#215;4 cores 2.3Ghz &amp; 64Go de RAM) contenant <strong>environ 150 VM sans réservations</strong>. Par défaut, voici ce qu&#8217;HA remonte comme information dans le vCenter :</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://files.hypervisor.fr/img/AutoSlotSize/ha_panel_default.png" alt="" width="404" height="180" /></p>
<p style="text-align: justify;"><img class="aligncenter" src="http://files.hypervisor.fr/img/AutoSlotSize/ha_runtime_default.png" alt="" width="299" height="319" /></p>
<p style="text-align: justify;">Ces informations sont totalement erronés étant donné que le cluster est presque plein (en tenant compte du N-1 pour HA) mais c&#8217;est le comportement attendu d&#8217;HA lorsque les VM n&#8217;ont pas de réservations (l&#8217;overhead est pris en compte). On notera que le nombre de vcpu correspond à la plus grosse vm.</p>
<p style="text-align: justify;">Voici ce qu&#8217;HA remonte après avoir passé notre script :</p>
<p style="text-align: justify;"><img class="aligncenter" src="http://files.hypervisor.fr/img/AutoSlotSize/ha_panel_auto.png" alt="" width="404" height="180" /></p>
<p style="text-align: justify;"><img class="aligncenter" src="http://files.hypervisor.fr/img/AutoSlotSize/ha_runtime_auto.png" alt="" width="299" height="319" /></p>
<p style="text-align: justify;">On est nettement plus proche de la vérité. Le calcul pour <strong>le cpu est la moyenne d&#8217;utilisation journalière par vm démarrée, idem pour les vcpu</strong> mais pour la ram nous avons du faire un choix pas trop optimiste (active memory) ni trop optimiste (consumed memory). Nous avons donc choisi de prendre <strong>la valeur médiane entre active et consumed</strong><strong> (moyene journalière)</strong>. Voici le résultat sur une journée de stat sur notre cluster de test :</p>
<p style="text-align: center;"><a href="http://files.hypervisor.fr/img/AutoSlotSize/memory_usage_summary.png" target="_blank"><img class="aligncenter" src="http://files.hypervisor.fr/img/AutoSlotSize/memory_usage_summary.png" alt="" width="516" height="356" /></a></p>
<p style="text-align: justify;">Idéalement, ce script est donc à lancée une fois par jour. Voici la version pour vSphere 4.x (filtré par cluster où HA est activé) :</p>
<pre class="brush: powershell; title: ; notranslate">foreach ($cluster in (get-view -viewtype ClusterComputeResource -property Host,ConfigurationEx|?{$_.ConfigurationEx.DasConfig.Enabled})) {,($cluster.host|%{get-view $_ -property runtime,vm}|?{$_.Runtime.ConnectionState -match &quot;^connected$&quot;}|?{($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})}|select @{n=&quot;mem&quot;;e={(($_|%{((get-view (Get-View ServiceInstance).content.PerfManager).QueryPerf((New-Object VMware.Vim.PerfQuerySpec -property @{entity = $_.moref;format = &quot;normal&quot;;IntervalId = &quot;300&quot;;MetricId = (New-Object VMware.Vim.PerfMetricId -property @{instance = &quot;&quot;;counterId = (((Get-View (Get-View ServiceINstance).Content.PerfManager).PerfCounter|?{$_.groupinfo.key -match &quot;mem&quot;}|?{$_.nameinfo.key -match &quot;active$&quot;}|?{$_.RollupType -match &quot;average&quot;}).key)})}))|%{$_.value}|%{$_.value}|measure -Average).average/(($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|measure).count/1kb}) + ($_|%{((get-view (Get-View ServiceInstance).content.PerfManager).QueryPerf((New-Object VMware.Vim.PerfQuerySpec -property @{entity = $_.moref;format = &quot;normal&quot;;IntervalId = &quot;300&quot;;MetricId = (New-Object VMware.Vim.PerfMetricId -property @{instance = &quot;&quot;;counterId = (((Get-View (Get-View ServiceINstance).Content.PerfManager).PerfCounter|?{$_.groupinfo.key -match &quot;mem&quot;}|?{$_.nameinfo.key -match &quot;consumed$&quot;}|?{$_.RollupType -match &quot;average&quot;}).key)})}))|%{$_.value}|%{$_.value}|measure -Average).average/(($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|measure).count/1kb}))/2}}, @{n=&quot;cpu&quot;;e={($_|%{((get-view (Get-View ServiceInstance).content.PerfManager).QueryPerf((New-Object VMware.Vim.PerfQuerySpec -property @{entity = $_.moref;format = &quot;normal&quot;;IntervalId = &quot;300&quot;;MetricId = (New-Object VMware.Vim.PerfMetricId -property @{instance = &quot;&quot;;counterId = (((Get-View (Get-View ServiceINstance).Content.PerfManager).PerfCounter|?{$_.groupinfo.key -match &quot;cpu&quot;}|?{$_.nameinfo.key -match &quot;usagemhz&quot;}|?{$_.RollupType -match &quot;average&quot;}).key)})}))|%{$_.value}|%{$_.value}|measure -Average).average/(($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|measure).count})}}, @{n=&quot;vcpu&quot;;e={(($_.vm|%{get-view $_ -property Runtime,Config}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|%{$_.Config.Hardware.NumCpu}|measure -average).average}}|measure -average -property mem,cpu,vcpu|%{[math]::round($_.average,0)})|%{if (($_|measure -Sum).sum -ne ($cluster.ConfigurationEx.DasConfig.Option|?{$_.key -match &quot;das.slotCpuInMhz|das.slotMemInMB&quot;}|measure -Sum -Property value).sum) {$cluster.ReconfigureComputeResource((New-Object VMware.Vim.ClusterConfigSpecEx -property @{dasConfig=(New-Object VMware.Vim.ClusterDasConfigInfo -property @{option=@((New-Object VMware.Vim.OptionValue -property @{key=&quot;das.vmMemoryMinMB&quot;;value=$_[0].tostring()});(New-Object VMware.Vim.OptionValue -property @{key=&quot;das.vmCpuMinMHz&quot;;value=$_[1].tostring()});(New-Object VMware.Vim.OptionValue -property @{key=&quot;das.slotMemInMB&quot;;value=$_[0].tostring()});(New-Object VMware.Vim.OptionValue -property @{key=&quot;das.slotCpuInMhz&quot;;value=$_[1].tostring()});(New-Object VMware.Vim.OptionValue -property @{key=&quot;das.SlotNumVCpus&quot;;value=$_[2].tostring()}))})}),$true)}}}</pre>
<p style="text-align: justify;">Pour vSphere 5.0, <a href="http://pubs.vmware.com/vsphere-51/topic/com.vmware.wssdk.apiref.doc/vim.cluster.DasFailoverLevelAdvancedRuntimeInfo.SlotInfo.html" target="_blank">le nombre de vcpu ne rentre plus en comptre pour le calcul du slot size</a>, nous avons donc adapté le script en conséquence :</p>
<pre class="brush: powershell; title: ; notranslate">foreach ($cluster in (get-view -viewtype ClusterComputeResource -property Host,ConfigurationEx|?{$_.ConfigurationEx.DasConfig.Enabled})) {,($cluster.host|%{get-view $_ -property runtime,vm}|?{$_.Runtime.ConnectionState -match &quot;^connected$&quot;}|?{($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})}|select @{n=&quot;mem&quot;;e={(($_|%{((get-view (Get-View ServiceInstance).content.PerfManager).QueryPerf((New-Object VMware.Vim.PerfQuerySpec -property @{entity = $_.moref;format = &quot;normal&quot;;IntervalId = &quot;300&quot;;MetricId = (New-Object VMware.Vim.PerfMetricId -property @{instance = &quot;&quot;;counterId = (((Get-View (Get-View ServiceINstance).Content.PerfManager).PerfCounter|?{$_.groupinfo.key -match &quot;mem&quot;}|?{$_.nameinfo.key -match &quot;active$&quot;}|?{$_.RollupType -match &quot;average&quot;}).key)})}))|%{$_.value}|%{$_.value}|measure -Average).average/(($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|measure).count/1kb}) + ($_|%{((get-view (Get-View ServiceInstance).content.PerfManager).QueryPerf((New-Object VMware.Vim.PerfQuerySpec -property @{entity = $_.moref;format = &quot;normal&quot;;IntervalId = &quot;300&quot;;MetricId = (New-Object VMware.Vim.PerfMetricId -property @{instance = &quot;&quot;;counterId = (((Get-View (Get-View ServiceINstance).Content.PerfManager).PerfCounter|?{$_.groupinfo.key -match &quot;mem&quot;}|?{$_.nameinfo.key -match &quot;consumed$&quot;}|?{$_.RollupType -match &quot;average&quot;}).key)})}))|%{$_.value}|%{$_.value}|measure -Average).average/(($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|measure).count/1kb}))/2}}, @{n=&quot;cpu&quot;;e={($_|%{((get-view (Get-View ServiceInstance).content.PerfManager).QueryPerf((New-Object VMware.Vim.PerfQuerySpec -property @{entity = $_.moref;format = &quot;normal&quot;;IntervalId = &quot;300&quot;;MetricId = (New-Object VMware.Vim.PerfMetricId -property @{instance = &quot;&quot;;counterId = (((Get-View (Get-View ServiceINstance).Content.PerfManager).PerfCounter|?{$_.groupinfo.key -match &quot;cpu&quot;}|?{$_.nameinfo.key -match &quot;usagemhz&quot;}|?{$_.RollupType -match &quot;average&quot;}).key)})}))|%{$_.value}|%{$_.value}|measure -Average).average/(($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|measure).count})}}|measure -average -property mem,cpu|%{[math]::round($_.average,0)})|%{if (($_|measure -Sum).sum -ne ($cluster.ConfigurationEx.DasConfig.Option|?{$_.key -match &quot;das.slotCpuInMhz|das.slotMemInMB&quot;}|measure -Sum -Property value).sum) {$cluster.ReconfigureComputeResource((New-Object VMware.Vim.ClusterConfigSpecEx -property @{dasConfig=(New-Object VMware.Vim.ClusterDasConfigInfo -property @{option=@((New-Object VMware.Vim.OptionValue -property @{key=&quot;das.vmMemoryMinMB&quot;;value=$_[0].tostring()});(New-Object VMware.Vim.OptionValue -property @{key=&quot;das.vmCpuMinMHz&quot;;value=$_[1].tostring()});(New-Object VMware.Vim.OptionValue -property @{key=&quot;das.slotMemInMB&quot;;value=$_[0].tostring()});(New-Object VMware.Vim.OptionValue -property @{key=&quot;das.slotCpuInMhz&quot;;value=$_[1].tostring()}))})}),$true)}}}</pre>
<blockquote><p>As of vSphere API 5.0, the number of vcpus is no longer used for slot calculations</p></blockquote>
<p>Pour vSphere 5.1, le slot size est maintenant configurable dans via la GUI du web client (et donc de nouvelles propriétés sont disponibles) mais on va le faire en PowerCLI quand même <img src='http://www.hypervisor.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="brush: powershell; title: ; notranslate">foreach ($cluster in (get-view -viewtype ClusterComputeResource -property Host,ConfigurationEx|?{$_.ConfigurationEx.DasConfig.Enabled})) {,($cluster.host|%{get-view $_ -property runtime,vm}|?{$_.Runtime.ConnectionState -match &quot;^connected$&quot;}|?{($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})}|select @{n=&quot;mem&quot;;e={(($_|%{((get-view (Get-View ServiceInstance).content.PerfManager).QueryPerf((New-Object VMware.Vim.PerfQuerySpec -property @{entity = $_.moref;format = &quot;normal&quot;;IntervalId = &quot;300&quot;;MetricId = (New-Object VMware.Vim.PerfMetricId -property @{instance = &quot;&quot;;counterId = (((Get-View (Get-View ServiceINstance).Content.PerfManager).PerfCounter|?{$_.groupinfo.key -match &quot;mem&quot;}|?{$_.nameinfo.key -match &quot;active$&quot;}|?{$_.RollupType -match &quot;average&quot;}).key)})}))|%{$_.value}|%{$_.value}|measure -Average).average/(($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|measure).count/1kb}) + ($_|%{((get-view (Get-View ServiceInstance).content.PerfManager).QueryPerf((New-Object VMware.Vim.PerfQuerySpec -property @{entity = $_.moref;format = &quot;normal&quot;;IntervalId = &quot;300&quot;;MetricId = (New-Object VMware.Vim.PerfMetricId -property @{instance = &quot;&quot;;counterId = (((Get-View (Get-View ServiceINstance).Content.PerfManager).PerfCounter|?{$_.groupinfo.key -match &quot;mem&quot;}|?{$_.nameinfo.key -match &quot;consumed$&quot;}|?{$_.RollupType -match &quot;average&quot;}).key)})}))|%{$_.value}|%{$_.value}|measure -Average).average/(($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|measure).count/1kb}))/2}}, @{n=&quot;cpu&quot;;e={($_|%{((get-view (Get-View ServiceInstance).content.PerfManager).QueryPerf((New-Object VMware.Vim.PerfQuerySpec -property @{entity = $_.moref;format = &quot;normal&quot;;IntervalId = &quot;300&quot;;MetricId = (New-Object VMware.Vim.PerfMetricId -property @{instance = &quot;&quot;;counterId = (((Get-View (Get-View ServiceINstance).Content.PerfManager).PerfCounter|?{$_.groupinfo.key -match &quot;cpu&quot;}|?{$_.nameinfo.key -match &quot;usagemhz&quot;}|?{$_.RollupType -match &quot;average&quot;}).key)})}))|%{$_.value}|%{$_.value}|measure -Average).average/(($_.vm|%{get-view $_ -property Runtime}|?{$_.Runtime.PowerState -eq &quot;poweredon&quot;})|measure).count})}}|measure -average -property mem,cpu|%{[math]::round($_.average,0)})|%{if (($_|measure -Sum).sum -ne (@($cluster.ConfigurationEx.DasConfig.AdmissionControlPolicy.SlotPolicy.Memory, $cluster.ConfigurationEx.DasConfig.AdmissionControlPolicy.SlotPolicy.Cpu)|measure -Sum).sum) {$cluster.ReconfigureComputeResource((New-Object VMware.Vim.ClusterConfigSpecEx -property @{dasConfig=((New-Object VMware.Vim.ClusterDasConfigInfo -property @{admissionControlPolicy=((New-Object VMware.Vim.ClusterFailoverLevelAdmissionControlPolicy -property @{slotPolicy=(New-Object VMware.Vim.ClusterFixedSizeSlotPolicy -property @{cpu = $_[1];memory = $_[0]});FailoverLevel = $cluster.ConfigurationEx.DasConfig.AdmissionControlPolicy.FailoverLevel}))}))}),$true)}}}</pre>
<p style="text-align: center;"><a href="http://files.hypervisor.fr/img/AutoSlotSize/ha_slotsize_vsp51.png" target="_blank"><img class="aligncenter" src="http://files.hypervisor.fr/img/AutoSlotSize/ha_slotsize_vsp51.png" alt="" width="485" height="328" /></a></p>
<p style="text-align: justify;">Ceux qui ont l&#8217;oeil auront certainement remarqué l&#8217;usage d&#8217;une &#8220;multidimensional array&#8221; (<a href="http://stackoverflow.com/questions/9669683/powershell-implementation-to-pipe-array-into-command" target="_blank">aka nested array</a>) dans nos oneliner pour faire passer des tableaux au travers d&#8217;un pipe sans en changer le type.</p>
<p style="text-align: justify;">Pour plus d&#8217;information sur HA, nous vous conseillons vivement la lecture de la série <a href="http://www.hypervisor.fr/?page_id=2748" target="_blank">&#8220;Clustering Deepdive&#8221; de Duncan et Frank</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hypervisor.fr/?feed=rss2&amp;p=4283</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
