Динамічна пам'ять в 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%, то значить пам'яті сильно не вистачає, і віртуальна машина активно використовує файл підкачки.
На підставі змін навантаження протягом часу балансувальник обчислює порогові значення навантаження - мінімальне і максимальне. Якщо навантаження перевищує максимальне граничне значення - то віртуальній машині додається пам'ять.Якщо ж значення навантаження опускається нижче мінімального порогового значення - це означає, що надлишок пам'яті можна відібрати.
Додавання пам'яті
Якщо потрібно додати пам'яті - то диспетчер пам'яті стека віртуалізації виділяє віртуальній машині додаткову пам'ять .DMVSC, використовуючи технологію гарячого додавання пам'яті (Hot Add RAM) розширює адресний простір віртуальної машини, після чого відповідні віртуальні адреси зіставляються з виділеними фізичними адресами. Зверніть увагу, що для роботи необхідна підтримка Hot Add RAM на рівні гостьовий ОС.
Видалення пам'яті
Для видалення пам'яті використовується механізм Memory Ballooning. Коли приходить команда на видалення пам'яті - DMVSC перевіряє, які області пам'яті на даний момент не використовуються. З них відбирається обсяг, призначений для видалення, і потім ці адреси захоплюються DMVSC в монопольний доступ.Після цього захоплення область пам'яті позначається як Driver Locked і стає недоступна для використання операційною системою. Як тільки пам'ять була захоплена - відповідні віртуальні адреси відв'язувати від фізичних адрес, і відповідні комірки пам'яті можуть бути передані іншим віртуальним машинам.Видалення пам'яті відбувається для системи абсолютно непомітно, вся захоплена пам'ять як і раніше залишається системі видно. Надалі, якщо віртуальній машині потрібно додати пам'ять - відповідне адресний простір звільняється і зв'язується з виділеною областю пам'яті.
Налаштування
Dynamic Memory вперше з'явилася в Windows Server 2008R2, а точніше - з виходом SP1. Ось так безрадісно виглядають настройки пам'яті в Windows Server 2008R2 без встановленого сервіс-пака. Кожній віртуальній машині виділяється фіксований обсяг пам'яті, який визначається параметром Startup RAM.
Після установки SP1 все набагато веселіше