banner
Nachrichtenzentrum
Wir verbessern unsere Techniken und Qualität ständig, um mit den Branchentrends Schritt zu halten.

So verwenden Sie PowerShell zum Verfolgen von VDI-Ressourcen

Aug 07, 2023

Maxim_Kazmin - Fotolia

PowerShell ist tief in das Windows-Betriebssystem integriert, sodass Sie PowerShell verwenden können, um nach nicht ausgelasteten VDI-Bereichen zu suchen.

Hier sind einige grundlegende Methoden, die Sie an Ihre eigene Umgebung anpassen können, um PowerShell zum Verfolgen von VDI-Ressourcen zu verwenden.

Wenn Sie ein PowerShell-Skript erstellen möchten, um die VDI-Ressourcennutzung zu verfolgen, sollten Sie zunächst eine Schleife erstellen, die Ihre Server einzeln anzeigen kann. Erstellen Sie dazu eine Liste aller Server.

Für die Zwecke dieses Artikels werde ich die Servernamen fest codieren, aber Sie könnten das Skript auch so gestalten, dass es die Namen abfragt oder stattdessen die Namen aus einer Textdatei abruft. Beide Methoden würden das Skript dynamischer machen.

Hier ist eine Codezeile, die ein Array mit einer Liste von Servern erstellt:

$Servers = @("Hyper-V-1", "Hyper-V-2", "Hyper-V-3", "Hyper-V-4")

Diese Zeile erstellt eine Variable namens $Servers, die eine Liste von Hyper-V-Servern mit den Namen Hyper-V-1, Hyper-V-2 usw. enthält. Sie können diesen Befehl anpassen, wenn Sie eine VDI-Plattform verwenden, die nicht darauf basiert Hyper-V.

Nachdem Sie nun eine Liste von Servern haben, die einer Variablen zugeordnet sind, besteht der nächste Schritt darin, eine Schleife zu erstellen:

ForEach ($Server in $Servers) {}

Diese Schleife durchläuft nacheinander die Liste der Server. Der Code endet mit einer Reihe von Klammern. Jeder Code, den Sie zwischen den beiden Klammern hinzufügen, gilt für jeden Server in der Liste.

Der nächste Schritt besteht darin, Code zu schreiben, der prüfen kann, ob ein VDI-Host nicht ausgelastet ist. Zunächst sollten Sie ermitteln, was es bedeutet, wenn ein Host nicht ausgelastet ist.

In diesem Artikel werde ich einen nicht ausgelasteten Server als einen Server definieren, der über mehr als 20 % seines Speichers verfügt. Sie sollten jedoch eine Definition verwenden, die für Ihre eigene Umgebung sinnvoll ist.

So sieht mein Skript aus:

$Servers = @("Hyper-V-1", "Hyper-V-2", "Hyper-V-3", "Hyper-V-4")ForEach ($Server in $Servers) {

$ServerName = $Server$MySession = New-PSSession -ComputerName $ServerNameInvoke-Command -Session $MySession -ScriptBlock {

Write-Host $ServerName$TotalMemory = (Get-CimInstance Win32_OperatingSystem).TotalVisibleMemorySize$FreeMemory = (Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory$TargetMemorySize = $TotalMemory * .2Write-Host "Gesamtspeicher: " $TotalMemoryWrite-Host "Freier Speicher: " $FreeMemoryIf ($FreeMemory -GT $TargetMemorySize) { Write-Host "Dieser Host ist nicht unterausgelastet"}If ($FreeMemory -LT $TargetMemorySize) {Write-Host "Dieser Host ist nicht unterausgelastet"}}}

Dieses Skript geht davon aus, dass alle Hosts einer Domäne beigetreten sind und dass Kerberos der Authentifikator ist.

Der erste Abschnitt des Skripts definiert die Liste der abzufragenden Hosts und richtet dann eine Schleife ein. Ich werde eine Variable namens $ServerName erstellen, die den Namen des Servers enthält, den das Skript gerade abfragt.

Die nächsten beiden Codezeilen richten eine Remotesitzung mit dem Server ein, den der Befehl abfragt. Das Cmdlet „Invoke-Command“ definiert einen Skriptblock. Der gesamte Code innerhalb des Skriptblocks wird auf einem Remotecomputer ausgeführt.

$MySession = New-PSSession -ComputerName $ServerNameInvoke-Command -Session $MySession -ScriptBlock {

Der Inhalt des Skriptblocks vergleicht den Gesamtspeicher des Servers mit dem verwendeten Speicher, um festzustellen, ob der Server nicht ausgelastet ist oder nicht. Die Variable $TotalMemory enthält die Gesamtmenge des auf dem Server installierten Speichers, während die Variable $FreeMemory die verbleibende Speichermenge speichert.

In diesem Beispiel nutzen nicht ausgelastete Server weniger als 80 % des verfügbaren Speichers. Ich habe eine Variable namens $TargetMemorySize erstellt, die einen Wert enthält, der 20 % des Gesamtspeichers entspricht – $TotalMemory * .2. Dadurch kann ich die freie Speichermenge des Servers – $FreeMemory – mit meinem Zielwert – $TargetMemorySize – vergleichen, um festzustellen, ob die Maschine nicht ausreichend ausgelastet ist oder nicht.

Der Einfachheit halber habe ich eine modifizierte Version des Skripts erstellt. Ich habe die Schleife und den Code entfernt, um eine Remote-Sitzung zu erstellen. Dieses vereinfachte Skript untersucht nur den lokalen Computer, anstatt Remote-Hosts abzufragen. Ich habe außerdem eine Codezeile hinzugefügt, um die Zielspeichergröße anzuzeigen. Hier ist das vereinfachte Skript:

$TotalMemory = (Get-CimInstance Win32_OperatingSystem).TotalVisibleMemorySize$FreeMemory = (Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory$TargetMemorySize = $TotalMemory * .2Write-Host "Gesamtspeicher: " $TotalMemoryWrite-Host "Freier Speicher: " $FreeMemoryWrite-Host „Zielspeichergröße:“ $TargetMemorySizeIf ($FreeMemory -GT $TargetMemorySize) { Write-Host „Dieser Host ist nicht unterausgelastet“}If ($FreeMemory -LT $TargetMemorySize) {Write-Host „Dieser Host ist nicht unterausgelastet“}