Monday, May 13, 2013

Server 2012: De pagefile configureren met PowerShell

De Windows pagefile, er zijn hele boeken geschreven over het nut ervan en de beste manier om deze te configureren. Op een aparte partitie om fragmentatie tegen te gaan, op een partitie die aan de binnenrand van de fysieke schijf ligt omdat doorvoer daar het hoogste is, anderhalf keer het fysieke geheugen, door het systeem beheerd of zelfs helemaal uitgeschakeld.

Tegenwoordig kun je in veel situaties zonder een grote pagefile, tenzij je bij een eventuele crash een volledige geheugendump op schijf wilt hebben om de oorzaak te kunnen onderzoeken. Voor een volledige dump moet de pagefile minimaal gelijk zijn aan de hoeveelheid werkgeheugen + 1 MB en bovendien op het systeemvolume staan. Zo valt te lezen in onder andere: Windows does not save memory dump file after a crash Als dat voor jou niet belangrijk is dan wil je de pagefile misschien kleiner maken, zeker in het tijdperk van machines met een werkgeheugen van 64 GB of zelfs nog meer.

Anno 2013 doen we dit bij voorkeur met PowerShell, want dit is snel (copy, paste), makkelijk te herhalen en te automatiseren. In het boek Windows Server 2012 Hyper-V Installation and Configuration Guide geeft de auteur het volgende voorbeeld om deze vast in te stellen op 10 GB groot.

$Pagefile = Get-WmiObject Win32_ComputerSystem
$Pagefile.AutomaticManagedPagefile = $false
$Pagefile.Put()

$NewPagefile = gwmi -query "select * from Win32_PageFileSetting where name ='C:\\pagefile.sys'"
$NewPagefile.InitialSize = [int]"10240"
$NewPagefile.MaximumSize = [int]"10240"
$NewPagefile.Put()

Het eerste deel van het scriptje slaat het juiste WMI-object op in een variabele waarna we de waarde van AutomaticManagedPagefile op False zetten en vervolgens het aangepaste object weer wegschrijven. Op mijn systeem bleek dat niet te werken:

image

De oorzaak heeft te maken met UAC, we kunnen dit omzeilen door de –EnableAllPrivileges switch toe te voegen:

$System = Get-WmiObject Win32_ComputerSystem -EnableAllPrivileges
$System.AutomaticManagedPagefile = $False
$System.Put()

image

Het resultaat is dat de pagefile nu niet meer door Windows beheerd wordt. Nu kunnen we de eigenschappen van de pagefile aanpassen, in dit geval kiezen we dus een vaste grootte van 10 GB:

$CurrentPagefile = Get-WmiObject -query "select * from Win32_PageFileSetting where name ='C:\\pagefile.sys'"
$CurrentPagefile.InitialSize = [int]"10240"
$CurrentPagefile.MaximumSize = [int]"10240"
$CurrentPagefile.Put()

Als je goed kijkt dan zie je dat ik in de twee scriptdelen voor andere variabelenamen gekozen heb dan de auteurs van het boek: $System in plaats van $Pagefile en $CurrentPagefile in plaats van $NewPagefile. Dit is maar cosmetisch, ik had ook kunnen kiezen voor $Appeltaart of $QWERTY, maar het beschrijft wel iets correcter waar we mee werken. In het eerste deel van het script doen we een bewerking op het WMI-object Win32_ComputerSystem en niet op de pagefile. In het tweede deel van het script passen we de eigenschappen aan van de huidige pagefile, niet van de nieuwe pagefile. Vandaar.

Met dank aan forumgebruiker Oldguard die e.e.a. hier samenvatte. In datzelfde topic beschrijft hij ook een alternatieve aanpak waarbij de de bestaande pagefile eerst verwijdert en daarna een nieuwe aanmaakt. Heel interessant om te zien wat je met PowerShell en WMI allemaal kunt.

No comments: