Динамічна пам’ять у Hyper-V
Спочатку Hyper-V використовувалося статичне виділення пам'яті, при якому необхідно було точно розрахувати об'єм для кожної віртуальної машини. Завдання досить непросте, виділиш менше, ніж потрібно — може впасти продуктивність, більше — пам'ять простоюватиме. Плюс до цього вся виділена віртуальній машині пам'ять відразу їй забиралася і ставала недоступною для інших, що накладало жорсткі обмеження на кількість одночасно запущених ВМ.
Ситуація змінилася із виходом Windows Server 2008 R2 SP1. Hyper-V отримав механізм динамічного розподілу пам'яті (Dynamic Memory), завдяки якому пам'ять може вільно перерозподілятися між віртуальними машинами у процесі роботи. Познайомимося з основними принципами роботи Dynamic Memory ближче.
Принцип роботи
При запуску віртуальної машини їй виділяється обсяг пам'яті, що дорівнює Startup RAM. Якщо раптом потрібного об'єму пам'яті не буде — машина відмовиться стартувати. У гостьовій ОС (при встановленні служб інтеграції) працює компонент Dynamic Memory VSC (DMVSC), який збирає відомості про пам'ять, що використовується в даний момент, і передає їх за допомогою віртуальної шини VMBus провайдеру Dynamic Memory VSP (DMVSP), що працює в хостовій ОС. DMVSP, своєю чергою, передає дані балансувальнику пам'яті – Dynamic Memory Balancer.
Балансувальник обчислює для кожної віртуальної машини ідеальний обсяг пам'яті. Формула досить проста: ідеальний обсяг дорівнює пам'яті, що споживається в даний момент плюс резерв (певний відсоток від пам'яті, що споживається, задається вручну).
Потім обчислюється значення навантаження Memory Pressure - відсоткове відношення обчисленого ідеального об'єму дообсягу, фактично виділеного віртуальної машини. Цей параметр показує, як на даний момент справи з пам'яттю на віртуальній машині: малі значення означають, що пам'яті достатньо, великі – використання пам'яті підходить до межі. Якщо значення Memory Pressure перевищує 100%, то значить пам'яті сильно не вистачає, і віртуальна машина активно використовує файл підкачки.
На підставі змін навантаження протягом часу балансувальник обчислює порогові значення навантаження – мінімальне та максимальне. Якщо навантаження перевищує максимальне граничне значення – то віртуальній машині додається пам'ять. Якщо значення навантаження опускається нижче мінімального порогового значення – це означає, що надлишок пам'яті можна відібрати.
Додавання пам'яті
Видалення пам'яті
Dynamic Memory вперше з'явилася у Windows Server 2008R2, а точніше – з виходом SP1. Ось так безрадісно виглядають налаштування пам'яті Windows Server 2008R2 без встановленого сервіс-паку. Кожній віртуальній машині виділяється фіксований обсяг пам'яті, що визначається параметром Startup RAM.

Після встановлення SP1 все набагато веселіше 🙂 У вікні Memory конфігурації віртуальної машини з'являється можливість вибору режиму виділення пам'яті: Static/Dynamic. При виборі Static пам'ять задаватиметься фіксовано, як і раніше. А ось якщо вибрати Dynamic, стануть доступні нові параметри налаштування. При використанні Dynamic Memory об'єм пам'яті віртуальної машини визначається не одним параметром, а кількома. Ось вони:
Startup RAM — мінімальний обсяг пам'яті, що виділяється віртуальній машині під час її запуску. За промовчанням дорівнює 512 Мбайт. Якщо система не зможе виділити відповідний обсяг пам'яті – віртуальна машина незапуститься;Maximum RAM — максимальний обсяг пам'яті, якийтеоретично може бути виділений віртуальній машині. За замовчуванням задається максимальне можливе значення (64Гб у Server 2008R2 та 1Тб у Server 2012);Memory Buffer - задається у відсотках, і може набувати значення від 5% до 2000%. Цей параметр призначений для того, щоб тримати певний обсяг пам'яті вільним на випадок раптових пікових навантажень. Наприклад, якщо Memory Buffer дорівнює 20% - система завжди намагатиметься забезпечити, щоб у віртуальної машини було вільно не менше 20% пам'яті. Memory Buffer визначається саме у відсотках, а не в мегабайтах, тому, що залежить від поточного споживання пам'яті;Memory Weight — визначає пріоритет віртуальної машини при розподілі пам'яті у разі її нестачі. Саме цей параметр визначає, у кого пам'ять буде відібрано в першу чергу, і кому в першу чергу буде додано. До тих пір, поки сервер має вільну пам'ять – ваги віртуальних машин не відіграють ніякої ролі. Але як тільки пам'ять добігає кінця і потрібно її перерозподілити - система відбирає пам'ять у віртуальних машин з найменшим пріоритетом, і віддає тим, хто має пріоритет найвищий.

Memory Reserve — параметр, який дозволяє зарезервувати певний обсяг пам'яті для використання хостової ОС. Теоретично може виникнути така ситуація, коли віртуальні машини розберуть усю пам'ять і хостовий ОС нічого не залишиться. Зрозуміло, що нестача пам'яті в хостовій ОС може мати неприємні наслідки для всіх віртуальних машин, які на ній запущені. Щоб цього уникнути, можна використовувати параметр Memory Reserve, що дозволяє зарезервувати певний обсяг пам'яті для використання хостової ОС. Зарезервований обсяг буденедоступний для використання віртуальних машин.
Цей параметр немає в налаштуваннях і змінити його можна лише через редагування реєстру. Для цього потрібно створити ключ типу DWORD з назвоюMemoryReserve у розділі реєстру HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Virtualization . Значення цього ключа визначає обсяг резервованої пам'яті в мегабайтах. Максимальне значення – 4096 (4 Гбайт), більше встановлювати марно. Навіть якщо встановити 8192 - все одно система зарезервує лише 4 Гбайт пам'яті.
У Windows Server 2012 на додаток доStartup RAM (об'єм пам'яті при старті) з'явився параметрMinimum RAM (мінімальний обсяг пам'яті). Якщо Server 2008R2 ці параметри еквівалентні, то Server 2012 вони зроблені повністю незалежними друг від друга. Такий підхід дозволяє гнучкіше керувати розподілом пам'яті. Наприклад, для старту машині можна виділити 4ГБ пам'яті, а на випадок бездіяльності задати мінімум 512МБ. До речі, налаштування Minimum RAM та Maximum RAM тепер можна крутити прямо на працюючій машині.

Примітка: Якщо бути точним, то в Server 2008R2 технічно все ж таки є можливість за допомогою WMI/PowerShell виставити мінімальне значення пам'яті менше, ніж стартове. Якщо цікаво, то тут є опис і текст скрипта.
Smart Paging
Трохи вище я писав, що якщо система не зможе виділити об'єм пам'яті Startup RAM, віртуальна машина не запуститься. Це не зовсім так.
Можливість налаштувати мінімальне значення динамічної пам'яті нижче за стартове дозволяє нам мати більшу кількість одночасно запущених машин на вузлі. Це звичайно здорово, але що станеться у разі використання машинами всієї пам'яті, якщо одну машину потрібно перезавантажити? ДляПерезавантаження машині потрібно виділити стартове значення пам'яті, яке може бути вище мінімального. При цьому на хості може не бути потрібної кількості вільної пам'яті і гіпервізор не зможе забрати пам'яті у запущених машин, оскільки вони активно її використовують.
Для цього випадку в Windows Server 2012 з'явилася технологія Smart Paging, яка дає можливість за нестачі пам'яті для завантаження віртуальної машини використовувати файл підкачки на хості (Smart Paging file).

1) Віртуальна машина була перезавантажена; 2) На хості відсутня доступна фізична пам'ять, необхідна їх запуску; 3) Немає можливості забрати пам'ять у інших віртуальних машин, запущених на цьому хості; 4) Сумарний об'єм пам'яті, що запитується всіма запущеними машинами, перевищує фізичну не більше ніж у два рази.
Smart Paging не спрацює, якщо:
1) Віртуальна машина запускається з вимкненого стану, а не перезавантажена; 2) Бракує пам'яті для вже запущеної віртуальної машини; 3) Віртуальну машину перенесено при відмові одного з вузлів кластера.
Smart Paging — тимчасовий механізм і використовується він тільки в процесі запуску віртуальної машини. Відразу після завантаження операційної системи гіпервізор, використовуючи Memory Balooning, змушує машину скоротити пам'ять до мінімального обсягу. Як тільки машина переходить на власні ресурси, файл підкачки негайно видаляється, використовувати його в процесі роботинеможливо.
Для роботи віртуальні машини мають власний файл підкачки, який і використовують у разі нестачі пам'яті. Даний підхід ефективніший, ніж файл підкачування на хості, оскільки диспетчер пам'яті всередині віртуальної машини краще знає, які процеси можна помістити у файл підкачування, аякі повинні перебувати в оперативній пам'яті. Smart Paging використовуєтьсявиключно для перезавантаження віртуальних машин.
Моніторинг
Моніторинг споживання пам'яті віртуальною машиною потрібно здійснювати із хостової системи. Той самий Task Manager у гостьовій ОС завжди буде показувати пікове значення, а не поточне. Побачити, що фактично виділено пам'яті з гостьової ОС неможливо, для цього потрібно використовувати консоль Hyper-V Manager.
Наприклад візьмемо віртуальну машину TestVM. Як видно з показань Hyper-V Manager, зараз вона споживає всього 512 МБ (Minimum RAM).

У самій віртуальній машині картина інша. Task Manager показує, що машині виділено 4Гб, у тому числі вона споживає 3.8 Гб. Зверніть увагу на непомітний параметр Maximum memory, який показує максимальний об'єм пам'яті, доступний віртуальній машині. Щоправда є він лише у Windows 8 та Server 2012.

Підтримувані операційні системи
Для використання Dynamic Memory потрібна підтримка як хостової, так і гостьової системи. Ось перелік операційних систем, що підтримують Dynamic Memory.
- Microsoft Windows Server 2008 R2 Standard, Enterprise, Datacenter SP1;
- Microsoft Hyper-V Server 2008 R2 SP1;
- Microsoft Windows Server 2012 Standard, Datacenter;
- Microsoft Windows 8 Pro, Enterprise.
Гостьові системи (після встановлення служб інтеграції):
- Windows Server 2003: Standard, Web, Enterprise, Datacenter SP2;
- Windows Server 2008 Standard, Web, Enterprise, Datacenter SP2;
- Windows Server 2008 R2 Standard, Web, Enterprise, Datacenter SP1;
- Windows XP Professional SP3;
- Windows VistaEnterprise, Ultimate SP2;
- Windows 7 Enterprise, Ultimate SP1;
- Windows 8 Pro, Enterprise.
Висновок
Технологія Dynamic Memory дає можливість уявити оперативну пам'ять над вигляді набору мікросхем, бо як вільно розподіляється ресурс. Однак треба розуміти, що не дивлячись на всю гнучкість налаштувань Dynamic Memory не дозволяє виділити ресурсів більше, ніж є фізично, а лише допомагає розподілити наявні ресурси найкращим чином.