Offloading der Netzwerkkarte mit PowerShell aktivieren

Ein kleines HowTo um Receive Side Scaling (RSS) sowie sämtliches Offloading der NIC(s) an einem Windows Server zu aktivieren (oder deaktivieren).

Ein Kunde hatte eine leicht vernachlässigte VMware vSphere Umgebung mit dem Stand der ESXi Hosts von 6.0 Update 1. Aufgrund der damals™ auftretenden Netzwerkprobleme, hatte der Kunde sich dazu entschlossen sämtliches Offloading sowie Receive Side Scaling auf den Netzwerkkarten zu deaktivieren. Siehe dazu den VMware KB Artikel 2129176. Nachdem die Umgebung auf einen aktuellen 6.5 Build aktualisiert wurde gab es erneut extreme Netzwerkprobleme. Siehe erneut den VMware KB Artikel 2129176. 😉

Kurzum musste auf diversen Windows Servern die erweiterte Netzwerkkartenkonfiguration angepasst werden. Vorher:

Jetzt folgte ein wenig PowerShell „Magic“:

# Zum Deaktivieren des Offloading sowie RSS alle Werte (-Value) auf "0" setzen
$RegRoot = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}"
$RegItems = Get-ChildItem -Path Registry::$RegRoot -Name
 
foreach ($RegItem in $RegItems) {
    if ($RegItem -ne "Properties" -and $RegItem -ne "Configuration") {
        $RegPath = $RegRoot + "\" + $RegItem
        if ($(Get-ItemProperty -Path Registry::$RegPath | Select-Object -ExpandProperty "ProviderName") -eq "VMware, Inc." -and $(Get-ItemProperty -Path Registry::$RegPath | Select-Object -ExpandProperty "DriverDesc") -eq "vmxnet3 Ethernet Adapter"){
            Set-ItemProperty -Path Registry::$RegPath -Name "*IPChecksumOffloadIPv4" -Value "3" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "*LsoV1IPv4" -Value "1" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "*LsoV2IPv4" -Value "1" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "*LsoV2IPv6" -Value "1" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "*RSS" -Value "1" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "*TCPChecksumOffloadIPv4" -Value "3" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "*TCPChecksumOffloadIPv6" -Value "3" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "*UDPChecksumOffloadIPv4" -Value "3" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "*UDPChecksumOffloadIPv6" -Value "3" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "OffloadIpOptions" -Value "1" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "OffloadTcpOptions" -Value "1" -Force
            Set-ItemProperty -Path Registry::$RegPath -Name "OffloadVlanEncap" -Value "1" -Force
        }
    }
}

Die evtl. große Frage: Was macht das Script? Generell recht simpel:

  1. Der Netzwerk-Adapter Zweig der Registry wird festgelet (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}). Siehe dazu die Microsoft Docs: https://docs.microsoft.com/en-us/windows-hardware/drivers/install/system-defined-device-setup-classes-available-to-vendors
  2. Es werden alle Unterschlüssel des Registryzweiges ausgelesen und nacheinander in einer foreach-Schleife durchlaufen.
  3. Im Zweig gibt es neben den interessanten Schlüsseln „0000“ bis „00xy“ noch die uninteressanten Schlüssel „Propertiers“ sowie „Configuration“. Diese werden „aussortiert“.
  4. Der aktuelle Registry-Pfad wird gebaut und auf das Vorhandensein des Keys „ProviderName“ mit dem Wert „VMware, Inc.“ und „DriverDesc“ mit dem Wert „vmxnet3 Ethernet Adapter“ geprüft. (Wir befinden uns ja bei VMware, daher VMXnet3 und VMware Inc.)
  5. Zum Schluss werden die entsprechenden für das Offloading verantwortlichen Reg-Keys mit den passenden Werten geschrieben.

Und voilà:

Da wir uns hier ja im VMware Bereich befinden und es glücklicherweise die PowerCLI von VMware gibt, machen wir uns diese zu Nutze, um das Script auf allen Windows Systemen auszurollen:

$vCenterServer = "Name des VCenter Servers / der VCenter Appliance"
$Cred = Get-Credential
 
Get-Module -ListAvailable VMWare* | Import-Module
 
Connect-VIServer -Server $vCenterServer
 
foreach($VM in Get-VM | Where { $_.Guest -Like "*:Microsoft Windows Server*" }) {
    Write-Host $VM.Name
    Copy-VMGuestFile -VM $VM -Source C:\Install\Scripts\Offloading.ps1 -Destination C:\install\Scripts\Offloading.ps1 -LocalToGuest -GuestCredential $Cred -Force
    Invoke-VMScript -VM $VM -ScriptText C:\Install\Scripts\Offloading.ps1 -ScriptType Powershell -GuestCredential $Cred
}

Erneut, die Frage: Was ist passiert?

  1. Der FQDN des VCenters wird eingelesen, danach wird das Kennwort für einen entsprechenden Windows Benutzer in den VMs abgefragt und schließlich die verfügbaren VMware PowerShell Module der PowerCLI werden aufgelistet und geladen. Die PowerCLI gibt es übrigens >hier<.
  2. Es wird sich mit dem VCenter verbunden.
  3. Erneut geht es in eine foreach-Schleife in der alle Virtuellen Maschinen gesucht werden, die als Gast ein Windows Server OS ausführen.
  4. Völlig unspektakulär wird der VMName ausgegeben.
  5. Vom lokalen Client, auf dem die PowerShell ausgeführt wird, wird das Script C:\Install\Scripts\Offloading.ps1 (siehe oben) in die Gast VM an selbige Stelle kopiert. Dabei werden die anfangs eingegeben Credentials genutzt. „-Force“ wird benutzt, falls das Script schon dort liegen sollte.
  6. Zum Schluss wird das soeben kopierte Script in der virtuellen Maschine ausgeführt.

That’s it. 🙂

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.