Configure ESXi host RAMdisks with PowerCLI
The symptoms of a full RAMdisk on a ESXi host can be pretty nasty and diverse. The possible causes are also very diverse (search for ramdisk full in the VMware Knowledge Base, you will see what I mean).
Also, it can be affecting the RAMdisk root, tmp, or even hostdstats depending on the cause, so this is not easy to troubleshoot.
To help prevent this type of issues, we can increase the size of ESXi RAMdisks by increasing their memory reservation, memory limit and set their reservation as “expandable”, just like in resource pools.
This corresponds to settings in System Resource Allocation :

Let’s see how we can configure this in a more automated way, with PowerCLI.
C:\> $ESXiHosts = Get-VMHost
C:\> $Spec = New-Object VMware.Vim.HostSystemResourceInfo
Here, we save all our ESXi Hosts into a variable for later use, because we want to configure all the ESXi hosts in the vCenter.
We also create a new, empty HostSystemResourceInfo object, which we are going to populate with the memory settings we want.
Now, the tricky part is to use the appropriate key, depending on the RAMdisk we want to configure. This can be one of 3 possible RAMdisks that we might want to configure, so this is a good candidate for a Switch statement :
C:\> $RamDisk = 'tmp'
C:\> switch ($RamDisk) {
'tmp' {$Spec.Key = "host/system/kernel/kmanaged/visorfs/tmp"}
'root' {$Spec.Key = "host/system/kernel/kmanaged/visorfs/root"}
'hostdstats' {$Spec.Key = "host/system/kernel/kmanaged/visorfs/hostdstats"}
}
As an example, we are going to configure the tmp RAMdisk.
Then, we create a new, empty ResourceConfigSpec object and store it into our Config property :
C:\> $Spec.Config = New-Object VMware.Vim.ResourceConfigSpec
C:\> $Spec.Config
Entity :
ChangeVersion :
LastModified :
CpuAllocation :
MemoryAllocation :
LinkedView :
DynamicType :
DynamicProperty :
Even though, the CPU allocation is not applicable to a RAMdisk, we need to create one and assign it to the CpuAllocation property of our ResourceConfigSpec.
Why ? Because the vSphere API won’t let us apply the ResourceConfigSpec to a host, if the CpuAllocation or the MemoryAllocation property is null.
C:\> $Spec.Config.cpuAllocation = New-Object VMware.Vim.ResourceAllocationInfo
Now, let’s set the memory reservation to 30 MB, the limit to 400 MB and the reservation as expandable.
Expandable reservation means that more than the reservation can be allocated to the RAMdisk if there are available resources in the parent resource pool.
C:\> $Spec.Config.memoryAllocation = New-Object VMware.Vim.ResourceAllocationInfo
C:\> $Spec.Config.memoryAllocation.Reservation = 30
C:\> $Spec.Config.memoryAllocation.Limit = 400
C:\> $Spec.Config.memoryAllocation.ExpandableReservation = $True
Now, it’s time to apply the configuration to each individual ESXi host :
Foreach ( $ESXiHost in $ESXiHosts ) {
$Spec.Config.ChangeVersion = $ESXiHost.ExtensionData.SystemResources.Config.ChangeVersion
$ESXiHost.ExtensionData.UpdateSystemResources($Spec)
}
What is this
ChangeVersionbusiness ?
We get the version identifier of the current ESXi host configuration and we make sure the ChangeVersion property in our ResourceConfigSpec matches with it.
This is to prevent problems in case the ESXi host configuration was changed between the moment we last read it and the moment we apply a new ResourceConfigSpec to it.
For more information, you can refer to this documentation page.
Lastly, we apply the resource allocation settings contained in our $Spec, using the method UpdateSystemResources of our HostSystem view (we used the ExtensionData property above, but it is the same as a view).
Putting it all together
Using these techniques, I wrote a function called Set-VMHostRamDisk and packaged it in a module available here.
It is fully parameterized and accepts one or multiple ESXi hosts from the pipeline.
I took the time to write a proper comment-based help, so if you need more information on how to use the function, Get-Help is your BFF.
Leave a Comment
Your email address will not be published. Required fields are marked *