Вы уже знаете, что не так давно вышли окончательные версии платформы Microsoft Windows Server 2008 R2 SP1 и бесплатной ее версии Hyper-V Server 2008 R2 SP1, ориентированной только на задачи виртуализации. Одно из основных нововведений - функции Dynamic Memory для виртуальных машин, позволяющие динамически выделять и распределять оперативную память между ними.
Давайте посмотрим как это работает. Статья основана на заметке "Dynamic Memory Coming to Hyper-V Part 6", которая является частью серии заметок о Dynamic Memory, ссылки на которые размещены в конце статьи.
В первую очередь, Dynamic Memory позволяет выделять виртуальной машине на хосте Hyper-V память динамически, в соответствии с запросами ВМ. То есть, это позволяет не выделять всю возможную для использования ВМ память, а выделить столько, сколько нужно для базовой загрузки и простейшей работы. Во-вторых, посредством Dynamic Memory Balancing происходит перераспределение памяти между работающими виртуальными машинами, что приводит к росту коэффициента консолидации виртуальных машин на хост-сервере Hyper-V R2 до 40% (особенно для VDI-нагрузок).
Давайте посмотрим на экран настроек памяти для виртуальной машины в Hyper-V Manager:
Как мы видим, здесь есть 2 типа настроек выделения памяти виртуальной машине:
Static - в этом случае память виртуальной машине выделяется сразу в указанном объеме, и она сохраняется за ней пока виртуальная машина запущена или находится в состоянии "paused". Как только машина выключается - память высвобождается.
Dynamic - в этом случае есть параметры Startup RAM и Maximum RAM, которые влияют на выделение памяти ВМ в процессе ее работы.
Startup RAM - это объем памяти, который будет физически выделен и закреплен за виртуальной машиной при ее запуске. В данном случае - это 1 ГБ.
Maximum RAM - это максимальное значение памяти, которое может использовать гостевая ОС виртуальной машины (помните, что она должна поддерживать этот объем)
Также под этими параметрами располагается настройка Memory Buffer.
Эта настройка определяет количество памяти, которое потребуется гипервизору на обслуживание виртуальной машины в служебных целях, например, для возможностей SuperFetch. Она может быть задана в процентах от 5 до 95%. То есть, если у вас у виртуальной машины стоит 1 ГБ памяти для гостевой ОС и 20% memory buffer - то у вас будет 250 МБ по его служебные цели. По умолчанию стоит 20% - и это оптимально в большинстве случаев. Для высокопроизводительных и требовательных к быстродействию и памяти нагрузок, возможно, имеет смысл увеличить это значение. Кстати, эта настройка меняется даже у запущенной виртуальной машины, без необходимости ее остановки.
Далее переходим к последней настройке - Memory priority.
Эта настройка в Hyper-V эквивалентна, по-сути, опции Shares в VMware vSphere. Когда виртуальных машин на хосте много, и они начинают бороться за ресурсы, то нужно как-то приоритезировать выделение памяти нуждающимся виртуальным машинам. Memory priority и определяет как они будут ее распределять между собой в условиях борьбы - то есть машина с более высоким приоритетом получает память первой и в объеме пропорциональном приоритету (то есть смотрится отношение ее приоритета к сумме общих приоритетов на хосте Hyper-V).
Теперь, как это работает на практике. У нас есть три виртуальных машины с начальной памятью 1 ГБ (Startup RAM) и максимальной 4 ГБ (Maximum RAM) для каждой. При этом всего на сервере доступно 8 ГБ на все машины. Мы их запускаем - память сразу выделяется в объеме суммы этой Startup RAM (3 ГБ).
Через 15 минут. Finance VM начинает считать отчеты, а Engineering VM - запускает задачу анализа данных. Память машины Finance VM растет до 3 ГБ, машины Engineering VM - до 2 ГБ, при этом нагрузка на Sales VM не изменяется - и ей остается выделено 1 ГБ. Всего на сервере используется 6 ГБ или 75% от общей доступной памяти (8 ГБ):
Через 30 минут. Finance VM продолжает считать отчеты и, в конце концов, заканчивает это дело, высвободив память до 2 ГБ. При это Engineering VM - продолжает анализ данных, доводя используемую память до 3,5 ГБ, почти достигнув максимального предела. И тут мы еще запускаем Service VM с начальной памятью в 1 ГБ. Все используется: 2+3,5+1+1=7.5 ГБ или где-то 94% от 8 ГБ сервера.
Это и есть оптимальное использование ресурсов сервера.
Тут возникает вопрос - а что если виртуальным машинам потребуется еще память? Будет ли это означать, что страницы пойдут в своп, организованный Hyper-V для виртуальной машины?
Во-первых, Dynamic Memory имеет возможность изъять неиспользуемые страницы памяти у виртуальной машины и передать их наиболее нуждающейся ВМ на хосте. Делается это путем запуска высокоприоритетного процесса в простаивающей ВМ, который начинает "выедать" память в ОС этой машины и передавать эти страницы другим ВМ. Но память виртуальной машины ниже Startup RAM никогда не опустится - это ее гарантированный минимум. Остальное распределяется в соответствии с Memory priority при нехватке ресурсов.
Во-вторых, когда на хосте Hyper-V совсем не останется свободной памяти, включется механизм свопирования в гостевой системе, а не на уровне виртуальной машины (то есть, внутри образа ВМ, а не на хранилище с VHD-диском). Делается это потому, что гостевая ОС сама лучше знает, какие страницы ей лучше складывать в своп - и, соответственно, происходят меньшие потери производительности. Естественно, такой ситуации надо избегать - любой диск работает в сотни тысяч раз медленнее памяти.
Ну а теперь полезные ссылки по тому, как работает Dynamic Memory в Hyper-V: