Hyper-V, snapshots, AVHD soubor

Snapshoty (snímky) jsou sice mocná, ale nebezpečná výbava. Mocná v tom, že během chviličky je možné sejmout aktuální stav celé rodiny virtuálních serverů určité služby. Např. v případě aplikace “nebezpečného” patche, nevyzpytatelného service packu, nasazení “zvláštně se chovající” aplikace od dodavatele atd. Nebezpečná proto, že v určitých případech dokáže snímkování zatraceně rychle vyčerpat celý dostupný prostor vyhrazený pro virtuální servery. A  nebezpečná výbava je to také pro to, že zbavit se AVHD souboru nelze bez výpadku běhu virtuálního serveru.

Jak fungují snapshoty v Hyper-V? V okamžiku vytvoření snapshotu vznikne vedle každého VHD souboru použitého ve virtuálním serveru ještě AVHD soubor. Do toho se začnou ukládat všechny změny oproti VHD souboru od okamžiku vytvoření snapshotu. VHD soubor je tak od tohoto okamžiku neměnný. V Hyper-V (non-R2) se tyto AVHD soubory vytvářejí v tom samém adresáři, kde je uložena definice virtuálního stroje. V Hyper-V R2 se AVHD soubory vytvářejí v adresáři, v němž je VHD soubor. Ačkoliv ten popis vypadá na první pohled obdobně a ve většině případů to funguje v obou verzích stejně, najdou se výjimky – a u nich pak chování non-R2 způsobuje velké problém s alokací diskového prostoru.

Proč je virtuální stroj automaticky přepínán na Paused? K tomu dojde, pokud na některém z disků, na nichž je uložen VHD a AVHD soubor, začne docházet místo. Docela blbé to je v případě Hyper-V clusterových farem, kde jsou (většinou) iSCSI disky používané coby Clustered Shared Volumes mapovány pod C:\ClusterStorage\ jako NTFS Volume Mount Points. Všechny jednoduché monitorovací nástroje počítají s tím, že co logický disk Windows systému, to písmenko. Zatím jsem nenašel žádný rozumný způsob, jak jednotlivé podadresáře monitorovat – nezbude tak asi nic jiného, než napsat vlastní PowerShell skript a volat jej s příslušným parametrem z dohledového nástroje.

Jak se dá AVHD zbavit? Prvním krokem je označení a smazání nepotřebného snapshotu. To lze učinit jak z Hyper-V manažeru, tak z VMM. Tam, kde je nasazeno VMM, je samozřejmě lepší maximum dostupných úkonů provádět z něj. Po smazání snapshotu (bez problémů za běhu virtuálního serveru) AVHD soubor zůstává. A to až do doby, kdy je příslušný virtuální stroj korektně ukončen (shutdown), natvrdo vypnut (turned off) nebo uložen za běhu (saved state). Teprve v jednom z těch tří stavů (za předchozího smazání snapshostu) dojde k započetí sloučení VHD a AVHD souborů.

Problémem je, že tato aktivita není ve VMM nikde zobrazena. Jediné, kde jsem ji našel, je Hyper-V Manager. V případě clusterové Hyper-V farmy je tak nutné identifikovat, na kterém uzlu aktuálně daný virtuální stroj běží a vůči němu pak spustit Hyper-V Manager.

Ještě pár doporučení od MS:

  1. používání snapshotů má negativní dopad na výkon
  2. VHD soubor, od nějž jsou odvozeny snapshoty, se nesmí nijak velikostně upravovat, jinak se AVHD soubory stanou neplatnými