dsccommunity / dsccommunity/ComputerManagementDsc

VirtualMemory: 'value out of range' error when sizes > 1/8th of the disk

Open
#376 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
PowerShell
Stars
338
Forks
80
PR merge metrics
No merged PRs in 30d

Description

Details of the scenario you tried and the problem that is occurring

I'm trying to utilize Azure VM temp disks for the pagefile but due to their small size (typically 2x RAM) and a limitation in Set-CimInstance (and similar methods), it's not possible to create anything of much use (e.g. only 1Gb on an 8Gb temp drive).

For example, splitting out the offending command in Set-PageFileSetting against an 8Gb drive with sufficient free space:

    $Drive = 'D:'
    $InitialSize = 4096
    $MaximumSize = 7000

    $setParams = @{
        Namespace = 'root\cimv2'
        Query     = "Select * from Win32_PageFileSetting where SettingID='pagefile.sys @ $Drive'"
        Property  = @{
            InitialSize = $InitialSize
            MaximumSize = $MaximumSize
        }
    }

    Set-CimInstance @setParams

Throws the following error:

Verbose logs showing the problem
Set-CimInstance : Value out of range 
At line:1 char:5
+     Set-CimInstance @setParams
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Win32_PageFileS...\pagefile.sys"):CimInstance) [Set-CimInstance], CimException
    + FullyQualifiedErrorId : HRESULT 0x8004102b,Microsoft.Management.Infrastructure.CimCmdlets.SetCimInstanceCommand
Suggested solution to the issue

All the CIM-based solutions seem to have a base class that is the underlying issue. To work around it, the only solution I've found is to directly set the registry key:

<#
    .SYNOPSIS
        Sets a new page file name.
    .PARAMETER Drive
        The letter of the drive containing the page file
        to change the settings of.
    .PARAMETER InitialSize
        The initial size to set the page file to.
    .PARAMETER MaximumSize
        The maximum size to set the page file to.
#>
function Set-PageFileSetting
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        [System.String]
        $Drive,

        [Parameter()]
        [System.Int64]
        $InitialSize = 0,

        [Parameter()]
        [System.Int64]
        $MaximumSize = 0
    )
        # Using Set-CimInstance fails if pagefile exceeds 1/8th of the available disk space so we're switching to using direct registry key settings.
        $pageFileName = Join-Path `
                    -Path $driveInfo.Name `
                    -ChildPath 'pagefile.sys'

        $value = "$pageFileName $InitialSize $MaximumSize`n" # Even though it's a Reg_SZ_Multi, it's not double-null terminated
        # TODO: Fix to support other drive values

        Set-ItemProperty `
            -LiteralPath 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management' `
            -Name 'PagingFiles' `
            -Type MultiString `
            -Value $value `
            -Force
    }

   Write-Verbose -Message ($script:localizedData.SettingPageFileSettingsMessage -f $Drive, $InitialSize, $MaximumSize)
}

The above is incomplete as it does not account for any other / pre-existing settings on another drive but that shouldn't be too hard to work out given the simple data structure of the registry key.

The DSC configuration that is used to reproduce the issue (as detailed as possible)

Using a system with a D: drive that is 8Gb in size:

    VirtualMemory "pagefile"
    {
      Type        = 'CustomSize'
      Drive       = 'D'
      InitialSize = 4096
      MaximumSize = 7000
    }
The operating system the target node is running
OsName               : Microsoft Windows Server 2019 Datacenter
OsOperatingSystemSKU : DatacenterServerEdition
OsArchitecture       : 64-bit
WindowsVersion       : 1809
WindowsBuildLabEx    : 17763.1.amd64fre.rs5_release.180914-1434
OsLanguage           : en-US
OsMuiLanguages       : {en-US}
Version and build of PowerShell the target node is running
Name                           Value                                                                                                                                                               
----                           -----                                                                                                                                                               
PSVersion                      5.1.17763.1971                                                                                                                                                      
PSEdition                      Desktop                                                                                                                                                             
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                                                                                             
BuildVersion                   10.0.17763.1971                                                                                                                                                     
CLRVersion                     4.0.30319.42000                                                                                                                                                     
WSManStackVersion              3.0                                                                                                                                                                 
PSRemotingProtocolVersion      2.3                                                                                                                                                                 
SerializationVersion           1.1.0.1                                                                                                                                                             
Version of the DSC module that was used ('dev' if using current dev branch)

8.4.0

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the VirtualMemory resource's Set-PageFileSetting entry point and reproduce the issue using the provided 8 GB D: drive configuration with InitialSize 4096 and MaximumSize 7000. Compare the CIM failure with the registry-based workaround, including preservation of existing PagingFiles entries. Done means valid pagefile settings above one-eighth of disk capacity are applied without losing settings on other drives.

Written by the indexing model from the issue text.

Assessment

Tech stack
powershell
Domain
devops, operating-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
32/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.