Hyper-V. Часть 5: Распределяем процессор и память

Все части серии «Hyper-V»

В первой части машина получила два виртуальных процессора и 4 ГБ памяти, и этого хватило, чтобы установить систему. Здесь разберём, как Hyper-V делит между машинами процессорное время и память: что значат резерв, лимит и вес процессора, как работает динамическая память и что делать, когда памяти на хосте не хватает, что из этого меняется на работающей машине и как дать машине собственный Hyper-V.


Виртуальные процессоры

Число виртуальных процессоров задаёт Set-VMProcessor -Count, и меняется оно только на выключенной машине (Set-VMProcessor):

Stop-VM -Name app1
Set-VMProcessor -VMName app1 -Count 8
Start-VM -Name app1
Get-VMProcessor -VMName app1 | Format-List Count, Reserve, Maximum, RelativeWeight, CompatibilityForMigrationEnabled

Виртуальный процессор — это поток, который гипервизор планирует на логические процессоры хоста. Hyper-V не ограничивает соотношение виртуальных процессоров к логическим, но каждый лишний vCPU — лишний поток, который нужно планировать, и машине с восемью процессорами, которая использует два, это не помогает, а соседям мешает. Больше логических процессоров хоста дать одной машине нельзя (лимиты).

Резерв, лимит и вес

Как делить процессорное время между машинами, когда его не хватает на всех, задают три параметра, и меняются они на ходу (там же):

  • -Reserve — процент ресурсов машины, гарантированно зарезервированный за ней (0–100);
  • -Maximum — процент, выше которого машина не поднимется, даже если хост свободен (0–100);
  • -RelativeWeight — вес машины в конкуренции за процессор (1–10000, по умолчанию 100): при нехватке процессорного времени машина с весом 200 получает вдвое больше, чем с весом 100.
Set-VMProcessor -VMName sql1  -Reserve 25 -RelativeWeight 200
Set-VMProcessor -VMName test1 -Maximum 50 -RelativeWeight 50
Get-VM | Get-VMProcessor | Format-Table VMName, Count, Reserve, Maximum, RelativeWeight

Проценты считаются от ресурсов самой машины, а не хоста: -Maximum 50 у машины с четырьмя процессорами — это не больше двух процессоров времени. Резерв уменьшает то, что остаётся остальным: хост не запустит машину, если её резерв нечем обеспечить.

SMT и NUMA

SMT (Hyper-Threading внутри гостя): -HwThreadCountPerCore задаёт, сколько потоков на ядро видит машина; 0 — как у хоста, на Windows Server 2016 это значение не поддерживается (Set-VMProcessor). Гостю это знание нужно, чтобы правильно раскладывать свои потоки по ядрам.

NUMA. У многопроцессорного сервера память разделена между сокетами, и обращение к памяти «своего» сокета быстрее, чем к чужой. Hyper-V передаёт большой машине виртуальную топологию NUMA, похожую на топологию хоста, чтобы гость тоже учитывал, где лежит память. -MaximumCountPerNumaNode ограничивает число виртуальных процессоров в одном виртуальном узле NUMA, -MaximumCountPerNumaSocket — число узлов в сокете; без особой причины их оставляют такими, какими Hyper-V их вычислил по хосту.

Get-VMHostNumaNode | Format-Table NodeId, ProcessorsAvailability, MemoryAvailable, MemoryTotal
Get-VMProcessor -VMName sql1 | Format-List HwThreadCountPerCore, MaximumCountPerNumaNode, MaximumCountPerNumaSocket

Если машине нужно больше памяти, чем есть в одном узле NUMA хоста, она получит память из нескольких узлов. Set-VMHost -NumaSpanningEnabled $false запрещает это, и тогда такая машина просто не запустится — вариант для тех, кому предсказуемая скорость важнее (Set-VMHost).

Статическая память

Без динамической памяти машина получает ровно StartupBytes и держит их всё время работы. Начиная с Windows Server 2016 объём статической памяти меняется на работающей машине обоих поколений, если в госте Windows Server 2016 или Windows 10 и новее (новшества Windows Server 2016). Уменьшить можно только до того объёма, который гость сумеет освободить:

Set-VMMemory -VMName app1 -StartupBytes 12GB

Для SQL Server, Exchange и прочих служб, которые сами управляют памятью и занимают всю, что видят, обычно выбирают именно статическую память.

Динамическая память

С динамической памятью машина стартует с StartupBytes, а дальше Hyper-V через драйвер в госте забирает у неё неиспользуемую память вплоть до MinimumBytes и добавляет при нехватке до MaximumBytes (обзор Dynamic Memory). Включают и выключают её на выключенной машине; на работающей можно только поднять максимум и снизить минимум:

Stop-VM -Name app2
Set-VMMemory -VMName app2 -DynamicMemoryEnabled $true -MinimumBytes 1GB -StartupBytes 2GB -MaximumBytes 8GB
Start-VM -Name app2
Set-VMMemory -VMName app2 -MaximumBytes 16GB      # на ходу

Ещё два параметра (Set-VMMemory):

  • -Buffer — сколько процентов сверх текущей потребности держать про запас (от 5 до 2000, по умолчанию 20). Буфер нужен, чтобы всплеск потребности не ждал, пока Hyper-V добавит память;
  • -Priority — вес машины, когда памяти на хосте не хватает на всех (от 0 до 100, по умолчанию 50). Важные машины получают больший вес, тестовые — меньший.

Посмотреть, сколько машине назначено и сколько она просит:

Get-VM | Format-Table Name, DynamicMemoryEnabled,
    @{n='AssignedGB'; e={[math]::Round($_.MemoryAssigned/1GB, 1)}},
    @{n='DemandGB';   e={[math]::Round($_.MemoryDemand/1GB, 1)}}, MemoryStatus
Get-VMMemory -VMName app2

MemoryDemand — сколько гость реально использует, MemoryAssigned — сколько ему сейчас выдано, то есть потребность плюс буфер. MemoryStatus показывает OK, Low или Warning, когда буфер исчерпан и машине не хватает памяти.

Smart Paging

Динамическая память создаёт неприятный случай: машина работала на минимуме, хост раздал освободившуюся память соседям, а потом машину перезагрузили — и ей снова нужен стартовый объём, которого на хосте нет. Тогда Hyper-V временно добирает недостающее файлом на диске — это Smart Paging; после загрузки гость отдаёт лишнее, и файл перестаёт использоваться (обзор Dynamic Memory). Срабатывает он только при перезагрузке машины, у которой минимум ниже стартового объёма. Папку для файла задаёт Set-VM -SmartPagingFilePath; том для неё нужен с запасом:

Set-VM -Name app2 -SmartPagingFilePath 'D:\Hyper-V\SmartPaging'
Get-VM | Format-Table Name, SmartPagingFilePath, SmartPagingFileInUse

Что меняется на работающей машине

Первый вопрос перед любым изменением — придётся ли выключать машину. Сводная таблица по всей серии:

Изменение На ходу Условие
Подключить или отключить диск да только на SCSI-контроллере
Увеличить диск да диск на SCSI-контроллере
Добавить SCSI-контроллер нет
Добавить или удалить сетевой адаптер да только поколение 2
Сменить коммутатор, VLAN, полосу да
Сменить объём статической памяти да гость Windows Server 2016 / Windows 10 и новее
Поднять максимум или снизить минимум динамической памяти да
Включить или выключить динамическую память нет
Число виртуальных процессоров нет
Резерв, лимит и вес процессора да
Совместимость процессора для миграции нет
Версия конфигурации нет
Поколение никогда

Источники: горячее добавление сетевых адаптеров и памяти — в таблице совместимости функций и в новшествах Windows Server 2016, динамическая память — в обзоре Dynamic Memory, диски — в Resize-VHD.

Вложенная виртуализация

Чтобы внутри машины запустить свой Hyper-V — лабораторию для кластера или контейнеры с изоляцией Hyper-V, — машине передают расширения виртуализации процессора. Машина при этом должна быть выключена (Set-VMProcessor, вложенная виртуализация):

Stop-VM -Name lab1
Set-VMProcessor -VMName lab1 -ExposeVirtualizationExtensions $true
Set-VMNetworkAdapter -VMName lab1 -MacAddressSpoofing On
Start-VM -Name lab1

Вторая команда нужна, чтобы машины внутри lab1 могли выходить в сеть со своими MAC-адресами через внешний коммутатор, — это переключатель из части о сети. Пока внутри машины работает Hyper-V, её память не меняется на лету, даже если включена динамическая память (вложенная виртуализация).

Учёт ресурсов

Учёт ресурсов (resource metering) копит для машины среднюю загрузку процессора, память, использование диска и сетевой трафик с момента включения учёта (Measure-VM):

Enable-VMResourceMetering -VMName app1
Measure-VM -VMName app1
Reset-VMResourceMetering -VMName app1

Это не мониторинг, а счётчик: его снимают раз в период — например, раз в месяц для отчёта по потреблению, — и сбрасывают.

Смотрим руками

Машины, которым не хватает памяти, и разница между назначенной и запрошенной памятью:

Get-VM | Where-Object State -eq 'Running' | Sort-Object MemoryDemand -Descending |
    Format-Table Name, MemoryStatus,
        @{n='DemandGB'; e={[math]::Round($_.MemoryDemand/1GB, 1)}},
        @{n='AssignedGB'; e={[math]::Round($_.MemoryAssigned/1GB, 1)}},
        @{n='MaxGB'; e={[math]::Round($_.MemoryMaximum/1GB, 1)}}

Сколько виртуальных процессоров роздано против логических процессоров хоста:

$vcpu = (Get-VM | Where-Object State -eq 'Running' | Measure-Object ProcessorCount -Sum).Sum
$lp   = (Get-VMHost).LogicalProcessorCount
"{0} vCPU на {1} логических процессоров, {2:N1} : 1" -f $vcpu, $lp, ($vcpu / $lp)

Источники


Процессор машины — это потоки, которые гипервизор делит по резерву, лимиту и весу, а память — либо фиксированный объём, либо диапазон, внутри которого Hyper-V сам перераспределяет её между машинами.

Дальше — часть 6: как работают контрольные точки. Стандартные и рабочие точки, дерево точек, почему удаление точки — это слияние дисков, что делать с осиротевшими .avhdx и почему контрольная точка не заменяет резервную копию.

Оставить комментарий могут только зарегистрированные пользователи.

Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.