Страницы

четверг, 29 июля 2010 г.

Динамическая память (Dynamic Memory) приходит в Hyper-V Часть 6.

Представляю перевод последней публикации из серии Dynamic Memory, в данной публикации описано при помощи каких настроек можно управлять Hyper-V Dynamic Memory, а также разобраны примеры описывающие каким образом работает динамическая память. Ссылки на оригиналы и переводы оставльных публикаций есть в конце или на LebedevUM.

Ссылка на оригинал: Virtualization Team Blog


Динамическая память (Dynamic Memory) приходит в Hyper-V Часть 6.


======================================================

Предисловие: Суть этой серии публикаций и дух в котором они написаны, должны показать комплексный подход к вопросам, стоящим перед нашими клиентами, обсуждение сложностей, связанных с управлением памятью, и объяснение почему для решения этих проблем мы выбрали динамическую память Hyper-V (Hyper-V Dynamic Memory). Это не обозначает критику кого-либо или каких-либо технологий, это проведение открытого и прозрачного обсуждения проблем.

======================================================

В нескольких предыдущих публикациях мы рассматривал Страничное распределение (Page Sharing) и Второй уровень подкачки (Second Level Paging). Сегодня давайте будем копать, то что предоставляет динамическая память Hyper-V в Windows Server 2008 R2 SP1, а также в наш бесплатный гипервизор Microsoft Hyper-V Server 2008 R2 SP1. Итак, что же такое динамическая память (Dynamic Memory)?

Динамическая память (Dynamic Memory) - это расширение Hyper-V R2, которое объединяет всю доступную память на физическом хосте и динамически распределяет ее по мере необходимости между запущенными на хосте виртуальными машинами. Это означает, что основываясь на изменениях рабочих нагрузок, виртуальные машины смогут получить новое пространство в памяти без остановок служб, через балансировку динамической памяти (Dynamic Memory Balancing). Одним словом, Динамическая память (Dynamic Memory) - это и есть динамическая память.

Давайте погрузимся в объяснения того как все это работает, начиная с новых настроек динамической памяти (Dynamic memory). Здесь новые настройки доступные для каждой виртуальной машины. Вот изображение:




Динамическая память в глубине.


В Hyper-V (V1 & R2), память статически назначалась виртуальным машинам. Смысл заключается в том, что вы назначаете память виртуальной машине, и когда она включается Hyper-V размещает и предоставляет эту память виртуальной машине. Эта память занимается до тех пор пока виртуальная машина запущена или приостановлена. Когда виртуальная машина сохранена или выключена память освобождается. Ниже представлено изображение, на котором показано назначение памятив Hyper-V V1/R2.


У динамической памяти Hyper-V есть два значения: Startup RAM (Начальный объем памяти) и Maximum RAM (Максимальный объем памяти), выглядит это вот так:


Startup RAM (Начальный объем памяти) это объем памяти во время инициализации/запуска виртуальной машины. Когда виртуальная машина запущена этот объем памяти будет выделен виртуальной машине. В данном примере виртуальная машина будет запускаться с 1 Гб памяти.

Свойство Maximum RAM (Максимальный объем памяти) это максимальный объем памяти до которого гостевая операционная сможет дорасти, в данном случае до 64 Гб памяти (при условии, что операционная система поддерживает такой объем памяти). На основе перечисленных выше настроек, вот пример того, как память будет выделяться в течении рабочего дня.



Как вы можете видеть, рабочая нагрузка динамически выделяет память в зависимости от потребностей.

Далее, давайте посмотрим на Memory Buffer (Буфер памяти).

Memory Buffer (Буфер памяти): В одной из предыдущих публикаций мы обсуждали сложности планирования памяти. Подведя итог, можно сказать что нет идеального решения для каждой рабочей нагрузки, а также решение может меняться в зависимости от масштаба и эксплуатационных требований. Однако, в обратной связи, четко прослеживается, что клиенты всегда чувствуют себя комфортабельней, предоставляя дополнительный объем памяти "на всякий случай".

Мы полностью согласны.

Заключается все в том что вы хотите избежать ситуации, когда рабочая нагрузка нуждается в памяти и Hyper-V начинает ее искать. Вы хотите выделить некоторый объем памяти для такой ситуации, особенно для неравномерных рабочих нагрузок.

Буфер динамической памяти определяет специфику памяти, доступной в виртуальной машине в целях кеширования файлов (например SuperFetch) или свободной памяти. Диапазон таких значений от 5 до 95. Цель буфера памяти заключается в определении процента свободной памяти от текущей используемой памяти. Целевой процент буфера памяти 20%, это значит, что в виртуальной машине, где используется 1 Гб, 250 Мб будут "свободными" (или доступными), общий объем памяти виртуальной машины будет составлять 1,25 Гб. По умолчанию, динамическая память Hyper-V использует значение буфера 20%. Если вы находите это значение слишком консервативным или не достаточно консервативным, вы можете изменить его на лету, пока виртуальная машина запущена без выключения.


Это подводит нас к последней настройке динамической памяти (Dynamic Memory), Memory Priority (Приоритет памяти).

Memory Priority (Приоритет памяти): По умолчанию все виртуальные машины создаются с равным значением приоритета памяти. Однако, вы, скорей всего, захотите изменить приоритет памяти, в зависимости от рабочей нагрузки. Для примера, Я предвижу сценарий, в котором вы захотите установить контроллеру домена больший приоритет памяти, нежели чем серверу печати какого-нибудь отдела. Приоритет памяти - это настройка каждой отдельной виртуальной машины, она указывает на приоритетность виртуальной машины при распределении памяти, относительно других виртуальных машин. По умолчанию приоритет памяти установлен в "Средний". Если вы посчитаете необходимым изменить этот параметр, вы можете сделать это на лету, в тот момент, когда виртуальная машина запущена, без ее остановки.




Динамическая память с течением времени работает с несколькими виртуальными машинами...


Я рассказывал про настройки каждой виртуальной машины и показывал как они будут работать с одной виртуальной машиной, но как динамическая память (Dynamic Memory) будет работать с несколькими виртуальными машинами? Ниже есть пример того, как динамическая память (Dynamic Memory) работает. Я специально хранил этот пример, чтобы избежать путаницы. Предположим, что у меня есть сервер с 8 Гб памяти. Я собираюсь запустить три виртуальные машины, по одной из финансовой службы, отдела продаж и отдела проектирования. Каждой виртуальной машине я дам одинаковые настройки: Sturtup RAM (Начальный объем памяти) = 1 Гб и Maximum RAM (Максимальный объем памяти) = 4 Гб. С такими настройками каждая виртуальная машина будет включаться с 1 Гб памяти и сможет увеличить свой объем памяти до 4 Гб, в случае необходимости.

Запуск виртуальных машин. на графике представленном ниже в левой части можно увидеть три запущенных виртуальных машины. Каждая виртуальная машина использует 1 Гб памяти. В правой же части графика можно видеть общий объем памяти, используемый всей системой ~3 Гб.


15 минут спустя. Виртуальная машина финансовой службы запускает отчеты, в то же время виртуальная машина отдела проектирования делает аналитическую работу. При помощи динамической памяти (Dynamic Memory), виртуальной машине финансовой службы выделено 3 Гб памяти, виртуальной машине отдела проектирования выделноо 2 Гб памяти, а виртуальная машина отдела продаж осталась с 1 Гб. В масштабах все системы, сервер использует 6 Гб из 8 Гб, или 75% от всей физической памяти.


30 минут спустя. Виртуальная машина финансовой службы работает с отчетами, в то время как виртуальная машина отдела проектирования выполняет аналитическую работу. При помощи динамической памяти (Dynamic Memory), виртуальной машине финансовой службы, выделено 2 Гб памяти, виртуальной машине отдела проектирования выделенно 3,5 Гб памяти, виртуальная машина отдела продаж осталась с 1 Гб памяти, и четвертая служебная виртуальная машина запущена с использованием 1 Гб памяти. В масштабах всей системы, сервер теперь использует 7,5 Гб памяти для виртуальных машин из 8 Гб. На данный момент сервер полностью распределил ресурсы памяти и использует ее наиболее эффективно.


И вот теперь вопрос, который я постоянно задаю: "Что теперь? Что если виртуальной машине нужно еще памяти? Нужно ли запускать подкачку на стороне родительской системы?"

Нет.

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



Превышение лимита и аналогии с процессором.


Один из аргументов, который мы регулярно слышим, заключается в том, что нет ничего страшного в превышении лимитов. Клиенты говорят нам, что они берут кучу физических серверов, виртуализуют их и запускают серверы с превышением лимита по количеству процессоров без каких-либо проблем, так почему же должны быть какие-то проблемы с памятью?

Отличная аналогия, но неправильный вывод.

Пример 1: Предположим вы работаете на 8 физических серверах и используете их на 10%, виртуализовав их и запустив эти 10 виртуальных машин на одном выделенном сервере, вы будете использовать его ~85%. В этом примере вы не превышали лимит и сервер до сих пор не использовал 15%.

Вот что такое превышение лимита...

Пример 2: Предположим вы работаете на 8 серверах и используете их на 50%, виртуализуете их и запускаете эти 8 виртуальных машин на одном сервере. Один сервера может максимально использоваться на 100%, но рабочая нагрузка требует использовать его ~400%, производительность будет ужасной. Что бы вы сделали? Конечно же переместили бы виртуальные машины на другие серверы, чтобы избежать превышения лимита. Если сказать короче, то что бы вы делали, чтобы максимизировать использование ресурсов для получения наилучшего распределения ресурсов и производительности.

Это именно то что мы делаем при помощи Hyper-V Dynamic Memory.



Требования клиентов и динамическая память.


Когда речь заходит о виртуализации и памяти, пользователи виртуализации неоднократно предъявляли следующие требования:
  1. Использовать физическую память настолько эффективно и динамично, насколько это возможно, с минимальными потерями производительности. Клиенты вкладываю в виртуализацию хостов, выбирая системы с большими конфигурациями памяти (32 Гб, 64 Гб, 128 Гб и больше) и хотят полностью использовать возможности системы. В то же время они покупают эту память, чтобы предоставить высочайшую производительность и избежать подкачки.
  2. Обеспечить устойчивую производительность и масштабируемость. Один из частых ответов от пользователей виртуализации это то, что они не хотят компонентов, с возможными срывами производительности или переменной производительностью. Это затрудняет управление и увеличивает общую стоимость владения.

Вы получили это. Вот почему мы выбрали динамическую память (Dynamic Memory):
  1. Dynamic Memory, это действительно динамическое решение. Память выделяется виртуальным машинам на лету, на основе политики, без остановки виртуальной машины.
  2. Dynamic Memory позволяет избежать значительных потерь производительности, потому как не добавляет новые уровни подкачки, которые могут существенно повлиять на производительность.
  3. Dynamic Memory использует большие страницы памяти и оптимизирована под использование больших страниц памяти.
  4. Dynamic Memory - это отличное решение для виртуализации серверов и настольных систем (кстати, Dynamic Memory отлично работает с SuperFetch).

Ура,

Jeff Woolsey

Principal Group Program Manager

Windows Server & Cloud, Virtualization

P.S. Здесь ссылки на все публикации из этой серии: