Заметки о Windows и других программных продуктах Microsoft...

Динамическая память в Hyper-V: принцип работы и настройка

Динамическая память в 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.

настройки памяти в Server 2008R2 без SP1

 

После установки 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 — определяет приоритет виртуальной машины при распределении памяти в случае ее нехватки. Именно этот параметр определяет, у кого память будет в первую очередь отобрана, и кому в первую очередь будет добавлена. До тех пор, пока у сервера имеется свободная память – веса виртуальных машин не играют никакой роли. Но как только память подходит к концу и нужно ее перераспределить – система отбирает память у виртуальных машин с наименьшим приоритетом, и отдает тем, у кого приоритет наиболее высокий.

настройки памяти в Server 2008R2 SP1

 

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 2012

 

Примечание: Если быть точным, то в Server 2008R2 технически все же есть возможность с помощью WMI/PowerShell выставить минимальное значение памяти меньше, чем стартовое. Если интересно, то вот здесь есть описание и текст скрипта.

Smart Paging

Чуть выше я писал, что если система не сможет выделить объем памяти Startup RAM, то виртуальная машина не запустится. Это не совсем так.

Возможность настроить минимальное значение динамической памяти ниже стартового позволяет нам иметь большее количество одновременно запущенных машин на узле. Это конечно здорово, но что произойдёт в случае использования машинами всей памяти, если одну из машин потребуется перезагрузить? Для перезагрузки машине требуется выделить стартовое значение памяти, которое может быть выше минимального. При этом на хосте может не быть нужного количества свободной памяти и гипервизор не сможет забрать памяти у запущенных машин, так как все они активно ее используют.

Для этого случая в Windows Server 2012 появилась технология Smart Paging, которая дает возможность при недостатке памяти для загрузки виртуальной машины использовать файл подкачки на хосте (Smart Paging file).

Smart Paging в Server 2012

 

Smart Paging вещь неоднозначная. Хотя он и обеспечивает гарантированный запуск виртуальных машин при отсутствии доступной физической памяти, при этом значительно понижается производительность, ведь скорости доступа к диску в разы меньше, чем к оперативной памяти. Поэтому использование смарт-пейджинга сильно ограничено. Smart Paging нельзя включить принудительно, он активируется только при совпадении нескольких факторов:

1) Виртуальная машина была перезагружена;
2) На хосте отсутствует доступная физическая память, необходимая для их запуска;
3) Нет возможности забрать память у других виртуальных машин, запущенных на этом хосте;
4) Суммарный запрашиваемый всеми запущенными машинами объём памяти превышает физическую не более чем в два раза.

Smart Paging не сработает, если:

1) Виртуальная машина запускается из выключенного состояния, а не была перезагружена;
2) Не хватает памяти для уже запущенной виртуальной машины;
3) Виртуальная машина перенесена при отказе одного из узлов кластера.

Примечание: Если честно, то с использованием смарт-пейджинга на кластерах ситуация мне не совсем ясна. Где то говорится о том, что при переносе машин с одного узла кластера на другой он не работает, а где то наоборот — что Smart Paging предназначен как раз для работы в кластерах. В данный момент у меня нет возможности собрать кластер и проверить это на практике, так что утверждать, где правда, не возьмусь.

Smart Paging — механизм временный и используется он только в процессе запуска виртуальной машины. Сразу после загрузки операционной системы гипервизор, используя Memory Balooning, заставляет машину сократить память до минимального объёма. Как только машина переходит на собственные ресурсы, файл подкачки немедленно удаляется, использовать его в процессе работы невозможно.

Для работы виртуальные машины имеют свой собственный файл подкачки, который и используют в случае нехватки памяти.  Данный подход более эффективен, чем файл подкачки на хосте, так как диспетчер памяти внутри виртуальной машины лучше знает, какие процессы можно поместить в файл подкачки, а какие должны находится в оперативной памяти. Smart Paging используется исключительно для перезагрузки виртуальных машин.

Мониторинг

Мониторинг потребления памяти виртуальной машиной нужно осуществлять из хостовой системы. Тот же Task Manager в гостевой ОС всегда будет показывать пиковое значение, а не текущее. Увидеть, сколько фактически выделено памяти из гостевой ОС невозможно, для этого нужно использовать консоль Hyper-V Manager.

Для примера возьмем виртуальную машину TestVM. Как видно из показаний Hyper-V Manager, на данный момент она потребляет всего 512 МБ (Minimum RAM).

мониторинг потребляемой памяти в Hyper-V manager

 

В самой же виртуальной машине картина другая. 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 Vista Enterprise, Ultimate SP2;
  • Windows 7 Enterprise, Ultimate SP1;
  • Windows 8 Pro, Enterprise.

 

Заключение

Технология Dynamic Memory дает возможность представить оперативную память не в виде набора микросхем, а как свободно распределяемый ресурс. Однако надо понимать, что не смотря на всю гибкость настроек Dynamic Memory не позволяет выделить ресурсов больше, чем есть физически, а всего лишь помогает распределить имеющиеся ресурсы наилучшим образом.

Ну вот и все, что я хотел рассказать о динамической памяти. Надеюсь эта статья поможет вам в нелегком деле виртуализации 🙂

 
 
Комментарии
Eugene Leitan

Спасибо за статью!
Хотелось добавить, что мониторинг можно еще осуществлять при помощи счетчиков.

http://blogs.technet.com/b/chrisavis/archive/2013/03/06/monitoring-dynamic-memory.aspx

Если говорить о мониторинге, то в Hyper-V есть такая вещь как Resource Metering.

Роман

Windows 7 Enterprise, Ultimate SP1;

А в Pro версии нет такого?

Что то у меня «Windows XP Professional SP3» совсем не хочет брать доп.память уже на XPхе ошибки валятся что слишком мало памяти а больше она не берёт, хотя брать ещё есть что.

Возможно дело в ограничениях самой XP, все таки 32 бита.

Кирилл, а как использование динамической памяти скажется на общей производительности виртуалки, не будет подтормаживать при уменьшении\увеличении ОЗУ? Сейчас делаю терминальный сервер для 1С7.7, пользователей около 20, на ВМ могу выделить максимум 5 Гб. На хосте всего 8 Гб и + 2 еще 2 ВМ, вот думаю поможет тут динамическая память или нет.

На производительности сказаться не должно. А в случае дефицита ОЗУ использование динамического выделения памяти однозначно поможет.

Поставил 2016 датац. Памяти 16 ГБ. Включил Hyper-V. Установил 2 вирт.машины с 2008 R2 SP1 std. Установил 2012 R2 Integration Services 6.3.9600.18398. Указал для каждой одинаковые параметры памяти. RAM — 6144, Min — 4096, Max — 8192. Buffer — 20%. Weight — одинаковый. Машины стартовали. Начал тестить приложения в первой. В итоге в первой Visible Memory увеличилась до 7,7 ГБ. И посыпались сообщения про нехватку памяти при запуске любого приложения — приложения совсем не запускаличь! Хотя свободных в ней было больше 3 ГБ. Пришлось перегружать первую виртуалку. Есть какие-то реальные практические рекомендации по настройке. В гугле пересмотрел кучу. В теории всё должно просто идеально работать.

При распределении памяти надо не забывать и о хосте. Начиная с Server 2012 система автоматически резервирует некий объем памяти, эта память недоступна для виртуальных машин.
Посмотреть реальное количество памяти, которая доступна виртуальным машинам, можно с помощью счетчика производительности Hyper-V Dynamic Memory Balancer – Available Memory.

Leave a Reply to Роман