Короткий ответ

«Диск тормозит» у VM-APP01 бывает тремя разными слоями: (1) гость сам пишет (SQL, backup внутри, антивирус гостя), (2) Hyper-V пишет в AVHDX/checkpoint/replica HRL, (3) CSV в Redirected или СХД/MPIO. Снимите latency в госте и на хосте, Get-ClusterSharedVolumeState, Get-VHD ParentPath до «поставили фиксированный диск» или «выключили AV».

Не оптимизируйте VHDX и не сносите checkpoint в пик нагрузки как первый шаг.

Симптомы и как отличить

Типичная картина:

  • в госте Disk Queue Length и Avg. sec/Write плохие;
  • на HV01 высок Hyper-V Virtual Storage Device latency;
  • пользователи «1С/SQL висит», CPU гостя при этом низкий;
  • совпадает с окном backup или с Merge checkpoint.

Отличия:

Что видноКуда
Том забит файломрост VHDX
Merge не кончаетсяcheckpoint
CSV не DirectCSV
Нужна полная карта CPU/RAM/дискдиагностика perf

Возможные причины

  1. Production/standard checkpoint, длинный AVHDX: каждое письмо — overlay + родитель.
  2. CSV Redirected Access на узле-владельце VM.
  3. Backup хоста (VSS) или backup внутри гостя одновременно.
  4. Антивирус хоста сканирует VHDX.
  5. Thin LUN закончился / СХД rebuild.
  6. Один CSV для всех VM и Replica.
  7. Dynamic VHDX сильно фрагментирован (реже, чем думают, но бывает на забитом NTFS).

Диагностика

Гость (если доступен):

Get-Counter '\PhysicalDisk(*)\Avg. Disk sec/Read','\PhysicalDisk(*)\Avg. Disk sec/Write','\PhysicalDisk(*)\Current Disk Queue Length'

Хост:

Get-VM -Name 'VM-APP01' | Format-List Name, State, CPUUsage, MemoryAssigned, Path
Get-VMHardDiskDrive -VMName 'VM-APP01' | ForEach-Object { Get-VHD -Path $_.Path | Format-List Path, VhdType, ParentPath, FragmentationPercentage, FileSize }
Get-VMCheckpoint -VMName 'VM-APP01'
Get-ClusterSharedVolumeState | Where-Object VolumeFriendlyName -match 'Volume1'

Счётчики Hyper-V (имена могут локализоваться; используйте английский инсталл или Get-Counter -ListSet):

Get-Counter -ListSet 'Hyper-V Virtual Storage Device' | Select-Object -ExpandProperty Paths | Select-String 'Latency|IOPS|Throughput'
Enable-VMResourceMetering -VMName 'VM-APP01'
Measure-VM -Name 'VM-APP01' | Format-List AggregatedAverageNormalizedIOPS, AggregatedAverageLatency, AggregatedDiskDataRead, AggregatedDiskDataWritten

Процессы хоста: backup, Windows Defender сканирование каталога CSV, StorageJob merge.

Get-StorageJob -ErrorAction SilentlyContinue
Get-VMReplication -VMName 'VM-APP01' -ErrorAction SilentlyContinue

Сверьте, не идёт ли backup с VSS в этот момент.

Решение

Сценарий A. Виноват AVHDX

Слейте checkpoint в окно низкой нагрузки. Пока overlay жив, «ускорить диск» настройками QoS можно, но корень — снимок. Не merge в полдень OLTP без согласования.

Сценарий B. CSV Redirected

Верните Direct: сеть CSV, путь к LUN, координатор. Пока redirected, IO VM идёт через другого узла — latency удвоится. Не перемещайте все VM на координатор «чтобы стало Direct» как постоянную архитектуру без починки сети.

Сценарий C. Гостевой IO

Индексация, DBCC, backup to the same vDisk, pagefile на том же VHDX что data. Разнесите data/log по разным VHDX на разные CSV/LUN если СХД это позволяет. QoS:

Get-VMHardDiskDrive -VMName 'VM-APP01' | Set-VMHardDiskDrive -MinimumIOPS 0 -MaximumIOPS 0

Нули — снять лимит, если кто-то поставил MaximumIOPS 50 «для теста». Для шумного соседа наоборот задайте потолок, не отбирая у OLTP.

Сценарий D. Антивирус хоста

Исключения каталогов VM/CSV по Microsoft. Не Defender Off навсегда.

Сценарий E. СХД

Rebuild, thin out of space, один 1 Gb iSCSI без MPIO. Это не лечится compact VHDX.

Сверьте расписание: Windows Server Backup / Veeam / антивирус full scan / Windows Update гостя / native SQL backup на тот же VHDX. Три writer в одну минуту на Volume1 дают «Hyper-V тормозит» без бага Hyper-V.

Get-VM -Name 'VM-APP01' | Format-List CPUUsage, MemoryDemand
Get-ClusterSharedVolume | Format-Table Name, State, OwnerNode

Если CPU гостя низкий, а latency высокий — это не «добавить vCPU». Если CPU высокий и диск тихий — статья производительности, слой CPU. Не лечите оба слоя сразу одним изменением.

Для CSV cache (если включён в вашей версии) смотрите, не выключили ли его «для теста». Redirected + выключенный cache + AVHDX — худший стек.

Сверьте Get-VMReplication и backup job на то же окно latency. Resync Replica плюс Full backup на Volume1 — не «сломанный SQL».

Как проверить, что проблема устранена

В госте Avg. Disk sec/Write вернулись к вашему baseline (для многих OLTP < 10–20 ms). Measure-VM AggregatedAverageLatency снизился. CSV StateInfo Direct. ParentPath пуст. Пользователи подтверждают, не только зелёный счётчик за 30 секунд — посмотрите 15 минут пика.

Get-ClusterSharedVolumeState | Format-Table Node, StateInfo
Get-VHD -Path 'C:\ClusterStorage\Volume1\VM-APP01\VM-APP01.vhdx' | Format-List VhdType, ParentPath
Measure-VM -Name 'VM-APP01'

Если не помогло

  • CPU wait в госте высокий при низком disk: это не диск, статья perf CPU/RAM.
  • Только один файл логов SQL: разнесите диски.
  • Replica resync: отложите или увеличьте канал, не «ещё один checkpoint».
  • После патча драйвера HBA стало хуже — откат драйвера.

Профилактика

  • Запрет долгих checkpoint на OLTP.
  • Мониторинг CSV redirected и storage latency per VM.
  • Разные LUN для log/data тяжёлых СУБД.
  • Backup не в тот же CSV без QoS.
  • Metering включён постоянно на критичных VM.
  • Не держите production checkpoint через пик OLTP: overlay удваивает письмо на Volume1 независимо от «быстрой СХД».

FAQ

Storage QoS в Hyper-V vs на СХД?

Оба. Хостовый MaximumIOPS спасает соседей. СХД QoS точнее на LUN. Не ставьте конфликтующие жёсткие лимиты вдвоём без измерения.

Fixed VHDX быстрее dynamic?

Меньше метаданных расширения. На современной СХД разница часто меньше, чем от AVHDX и redirected. Не конвертируйте в пик как «ускорение».

Нужен ли TRIM/Unmap с гостя?

На thin полезен, если стек поддерживает. Не путать с compact файла на NTFS хоста.

Один CSV на все VM плохо?

Концентрация очереди и blast radius. Для малого парка ок, для OLTP — планируйте несколько томов.

Почему ночью медленно, днём нет?

Backup, merge, replica resync, Windows Update гостя, indexing. Снимите timeline job'ов.

Get-VHD FragmentationPercentage высокий — сразу Optimize-VHD?

Сначала checkpoint и backup. Дефраг/compact — окно Off, после backup.