banner
Центр новостей
Постоянно совершенствуем наши технологии и качество, чтобы оставаться в курсе тенденций отрасли.

Как использовать PowerShell для отслеживания ресурсов VDI

Aug 07, 2023

Максим_Казьмин - Фотолия

PowerShell глубоко интегрирован в операционную систему Windows, поэтому вы можете использовать PowerShell для поиска недостаточно используемых областей VDI.

Вот несколько основных методов, которые вы можете адаптировать к своей среде, чтобы использовать PowerShell для отслеживания ресурсов VDI.

Если ваша цель — создать сценарий PowerShell для отслеживания использования ресурсов VDI, вам следует сначала создать цикл, который сможет просматривать ваши серверы по одному. Для этого создайте список всех серверов.

Для целей этой статьи я жестко запрограммирую имена серверов, но вы можете вместо этого разработать сценарий для запроса имен или извлечения имен из текстового файла. Любой метод сделает сценарий более динамичным.

Вот строка кода, которая создает массив, содержащий список серверов:

$Servers = @("Гипер-V-1", "Гипер-V-2", "Гипер-V-3", "Гипер-V-4")

Эта строка создает переменную $Servers, содержащую список серверов Hyper-V с именами Hyper-V-1, Hyper-V-2 и т. д. Эту команду можно изменить, если вы используете платформу VDI, не основанную на Гипер-В.

Теперь, когда у вас есть список серверов, сопоставленный с переменной, следующим шагом будет создание цикла:

ForEach ($Server в $Servers) {}

Этот цикл проходит через список серверов один за другим. Код заканчивается набором скобок. Любой код, который вы добавите между двумя скобками, будет применяться к каждому серверу в списке.

Следующим шагом будет написание кода, который сможет проверить, не используется ли хост VDI недостаточно. Во-первых, вы должны определить, что означает недостаточное использование хоста.

В этой статье я собираюсь определить недостаточно загруженный сервер как сервер, у которого доступно более 20% памяти. Однако вам следует использовать определение, которое имеет смысл для вашей среды.

Вот как выглядит мой скрипт:

$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 "Общий объем памяти: " $TotalMemoryWrite-Host "Свободная память: " $FreeMemoryIf ($FreeMemory -GT $TargetMemorySize) { Write-Host "Этот хост используется недостаточно"}If ($FreeMemory -LT $TargetMemorySize) {Write-Host "Этот хост не используется недостаточно"}}}

В этом сценарии предполагается, что все хосты присоединены к домену и что аутентификатором является Kerberos.

В первом разделе сценария определяется список хостов, которые он будет запрашивать, а затем устанавливается цикл. Я создам переменную $ServerName, содержащую имя сервера, к которому в данный момент обращается сценарий.

Следующие две строки кода устанавливают удаленный сеанс с сервером, который запрашивает команда. Командлет Invoke-Command определяет блок сценария. Весь код в блоке сценария выполняется на удаленном компьютере.

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

Содержимое блока сценария сравнивает общий объем памяти сервера с используемой памятью, чтобы определить, недостаточно ли загружен сервер. Переменная $TotalMemory содержит общий объем установленной памяти на сервере, а переменная $FreeMemory хранит оставшийся объем памяти.

В этом примере недостаточно загруженные серверы используют менее 80 % доступной памяти. Я создал переменную $TargetMemorySize, которая содержит значение, равное 20% от общего объема памяти --$TotalMemory * .2. Это позволяет мне сравнить объем свободной памяти сервера — $FreeMemory — с моим целевым значением — $TargetMemorySize — чтобы определить, используется ли машина недостаточно.

Для простоты я создал модифицированную версию скрипта. Я удалил цикл и код для создания удаленного сеанса. Этот упрощенный сценарий проверяет только локальный компьютер, а не запрашивает удаленные хосты. Я также добавил строку кода для отображения целевого размера памяти. Вот упрощенный сценарий: