AlexFedosenko
Enthusiast
Enthusiast

Resource Pools

Jump to solution

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

Создаю пул ресурсов с именем main. Потом, создаю дочерний для Main, пул с именем Slave. Настройки для всех пулов оставляю по умолчанию. Затем помещаю две виртуальные машины в пул slave. Машины имеют одинаковую конфигу, 1 ядро с частотой 2.4 Ггц и 2 Гб оперативной памяти. Все запускается, все стартует. Если снять галочки expandable reservation в настройках пула main, виртуальные машины не стартуют, ругаясь на ресурсы. Я так понимаю что галочка expandable reservation дает право пулу брать недостающие ресурсы у своего родителя. Для пула main родителем соответственно является root pool или host esxi. И так как мы для пула main не задано reservation то у него нет никаких выделенных специально ему ресурсов а снятые галочки на expandable reservation не дают ему взять эти ресурсы у хоcта, вот и получается отбой на запуск виртуальных машин в дочернем пуле slave. Это все понятно. Интересно другое. Почему, если к примеру для пула Main выставить reservation по процессору и памяти к примеру на 1000 Мгц и 1000 Мб, убрать галочки expandable reservation но оставить галочки на Unlimited для ресурсов, то обе виртуальные машины в пуле Slave запустятся и будут есть по полной ресусры хоста? Т.е. у каждой будет использоваться 2 Гб памяти и полные частоты ядра!

Если я праивльно понимаю логику то она такова, машины находяться в пуле Slave в настройках которого галочки expanbadle reservation стоят, но самому пулу reservation не выделено, в момент запуска в нем машин он запрашивает ресурсы у своего родителя пула Main. Пулу Main в свою очередь назначено reservation в виде 1Гб памяти и 1ГГц процессора, НО запрещено запрашивать недостающие ресусры у родителя, т.е  у Хоста. Откуда при таком положении дел обе машины будут иметь в своем распоряжении 2 Гб оперативной памяти каждая и всю доступную для одного ядра мощьность в Мгц?! У меня все именно так. Вот если уже начать играться с Limit и указать например в любом из этих пулов определенный Limit на ресурсы, то машины будут его придерживаться, а вот если нет, то есть по полной как и указано в их конфигах.

1 Solution

Accepted Solutions
VMadmin4eg
Hot Shot
Hot Shot

AlexFedosenko wrote:

Maxim, спасибо. Скажите правильно ли я понимаю. Эта галочка дает возможность сразу же резервировать для всех машин где она выставлена, всю память что указана у нее в настройках? Если так тогда, получается что нужно ОЧЕНЬ аккуратно с этим работать. И получается при таком подходе в принципе исключено использование такой фичи как запуск виртуальных машин со сконфигурированным кол-вом памяти превышающим физическую память хоста или кластера. Т.е. нужно на столько точно рассчитать кол-во машин в кластере или на хосте и кол-во их выделенной памяти чтобы они никогда и ни при каких обстоятельствах не пересекались. Ведь если физической памяти будет не хвать для резерва, то машина просто не стартанет. .

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

Если есть DRS (ESXi Enterprise), то кластер сам решит где лучше ВМ запускать.

Если нет DRS, то придется аккуратнее рассчитывать ресурсы.

На практике чаще всего ВМ которым надо всю память резервировать пора-тройка штук, остальным достаточно часть памяти зарезервировать исходя из статистики потребления ресурсов и более критичным машинам поставить Shares в high, менее критичным в low. Вручную выставлять Shares VMware не рекомендует.

View solution in original post

22 Replies
ConstantinV
Hot Shot
Hot Shot
Я так понимаю что галочка expandable reservation дает право пулу брать недостающие ресурсы у своего родителя.

да. именно так.

Для пула main родителем соответственно является root pool или host esxi.

или кластер.

И так как мы для пула main не задано reservation то у него нет никаких выделенных специально ему ресурсов а снятые галочки на expandable reservation не дают ему взять эти ресурсы у хоcта, вот и получается отбой на запуск виртуальных машин в дочернем пуле slave.

reservation - это ресурсы, которые не будут отданы никому другому ни при каких обстоятельствах. Проблема в объёмах RAM выделенных в настройках пула.

VCP 4/5, VCAP-DCD 5, VCAP-DCA 5, VCAP-CIA 5, vExpert 2012, 2013, 2014, 2015
0 Kudos
AlexFedosenko
Enthusiast
Enthusiast

Константин, спасибо что откликнулись. Скажите а какие могут быть проблемы с памятью для пула? В настройке пула вообще нельзя выделить память, можно либо задать reservation либо limits. Назначить какое-то кол-во памяти как виртуальной машине нельзя. Если вы говорите что reservation это не выделение памяти пулу, тогда на какой вкладке настроек можно именно выделить какое-то кол-во памяти пулу? И главный вопрос, почему при настройках обоих пулов по умолчанию при создании, НО со снятыми галочками expandable reservation в пуле Main виртуалки не стартуют вообще?!

0 Kudos
ConstantinV
Hot Shot
Hot Shot

reservation это не столько выделение, сколько блокировка этих МБ - как столика в ресторане, туда кроме вас никого не посадят.

limits - это ограничение на объём памяти для данного пула. Всё что выше лимита - уйдёт в своп, чего допускать нельзя.

Когда Вы снимаете галочку expandable, и при это не этом снимаете галочку unlimited, и указываете в лимитах пула объём памяти равный ОЗУ ВМ - она (-и) не запутится, так не хватит памяти на overhead.

На пул нельзя настроить объём памяти, только на ВМ. На пул Вы можете поставить резерв или лимит, внутри пула - тоже самое для ВМ или shares для установки относительного веса.

VCP 4/5, VCAP-DCD 5, VCAP-DCA 5, VCAP-CIA 5, vExpert 2012, 2013, 2014, 2015
0 Kudos
AlexFedosenko
Enthusiast
Enthusiast

Константин, спасибо, вы единственный кто откликается на мои наверное глупые вопросы. Про reservation я понял. Это просто гарантированные ресурсы хоста или кластера удерживаемые под конкретный пул или машину.

1) Скажите, если к примеру создан пул ресурсов и в нем стоит лимит по памяти в 1Гб, так же есть виртуалка которая имеет в своих настройках выделенные 2Гб памяти, то если ее поместить в этот пул и заставить там работать, выделяемая память урежется до 1Гб лимитом а оставшийся 1Гб будет находиться в свопе и работать оттуда? Я правильно понимаю? Т.е. получается что перемещая в пул виртуальные машины с настроенными ресурсами памяти превышающими limit установленный в настройках пула, мы заставляем разницу получаемую по формуле (Совокупная установленная память всех машин перемещенных в пул минус limit выставленный в пуле) СВОПИТЬСЯ? Я сделал такой вывод по вашим словам: "limits - это ограничение на объём памяти для данного пула. Всё что выше лимита - уйдёт в своп, чего допускать нельзя." Или я что-то не так понял?

2) Скажите пожалуйста, когда работает limit по памяти в пуле равный 1Гб оперативы, и машина, имевшая до этого 4 Гб памяти, перемещается в данный пул, 3Гб оперативки отнимается у нее за счет какого механизма? Работает балон? Он забирает у нее "лишнюю" память?

3) Константин, вы пишите "Когда Вы снимаете галочку expandable, и при это не этом снимаете галочку unlimited, и указываете в лимитах пула объём памяти равный ОЗУ ВМ - она (-и) не запутится, так не хватит памяти на overhead." Это да, так и есть. Но почему, если поставить галочки на unlimited, reservation выставить 0 и снять галочки expandable то машина не стартует? И самое интересное, почему при таких же настройках, но только если reservation выставить не 0 а хотя бы 100 мб и 100 мгц по процу, то машина СТАРТУЕТ? И в ее resource Allocation такие параметры как Consumed memory и CPU отображаются так, словно она работает без всякого пула. Т.е. память на полную катушку, столько сколько указано в ее настройках. Можно конечно сказать что выставив в reservation эти несчастные 100 мб оперативы и 100 мгц проца, мы дали ресурсы на overhead, но остальное-то у машины ОТКУДА??? Мы ведь запретили брать ресурсы у хоcта сняв галочки expandable и фактически у машины должны быть как раз эти мизерные 100 мб из reservation!!! Может я не совсем понимаю процесс? Может в таком случае мы видим в счетчике Consumed memory кол-во памяти из свопа? И если так, тогда как могут свопится мегагерцы процессора? Они ведь тоже отображаются на закладке Resource allocation по полной а не 100 мгц.

0 Kudos
VMadmin4eg
Hot Shot
Hot Shot

Вы сваливаете все в одну кучу и сами себя запутываете.

reservation - это сколько физической памяти или процессора выделяется ВМ или пулу. Необходим для обеспечения ВМ минимально необходимыми ресурсами. Как написал Константин это те ресурсы которые ВМ или пул всегда получат, сверх этого ресурсы распределяются на основе Shares (приоритета).

limit - это ограничение на использование физической памяти или процессора. Если ВМ или пул запрашивают больше памяти, то хост начинает использовать механизмы оптимизации использования памяти: balloon, compres, swap.


Если limit потомков превышает лимит родителя, то запускаются только те потомки на которых хватает лимита родителя. Соответственно галочка expandable увеличивает лимит родителя на размер лимита нового потомка или если уже имеющемуся потомку увеличивается лимит. Если лимит у родителя 0 и запрещено его увеличивать, то никто не запустится из потомков т.к. нет для них физических ресурсов и получить их у ВМ не получится.

Если лимит не установлен, ВМ или пул используют максимально доступные ресурсы хоста до сконфигурированных в ВМ.

Пример: хост с 4 ядрами 2Гц и гипертрейдингом. Создаётся ВМ с 2 vCPU и 4Гб памяти. Если есть свободные ресурсы, то эта ВМ будет использовать 4Гц двух физических ядер и 4Гб физической памяти.

AlexFedosenko
Enthusiast
Enthusiast

Уважаемый Maxim, то что вы написали я уяснил. После всего прочтенного у меня вопрос.

1) Вы пишите "Если ВМ или пул запрашивают больше памяти, то хост начинает использовать механизмы оптимизации использования памяти: balloon, compres, swap."

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

0 Kudos
VMadmin4eg
Hot Shot
Hot Shot

В свойства всех ВМ поставить галочку "Reserve all guest memory (All loced)" на закладке Resources. Для этого виртуальное железо должно быть 8 версии и выше.

Или там же выставить резерв памяти равный объёму сконфигурированной памяти.

Пул соответственно нужно сделать расширяемым.

Лимиты вообще VMware категорически не рекомендует использовать.

AlexFedosenko
Enthusiast
Enthusiast

Maxim, спасибо. Скажите правильно ли я понимаю. Эта галочка дает возможность сразу же резервировать для всех машин где она выставлена, всю память что указана у нее в настройках? Если так тогда, получается что нужно ОЧЕНЬ аккуратно с этим работать. И получается при таком подходе в принципе исключено использование такой фичи как запуск виртуальных машин со сконфигурированным кол-вом памяти превышающим физическую память хоста или кластера. Т.е. нужно на столько точно рассчитать кол-во машин в кластере или на хосте и кол-во их выделенной памяти чтобы они никогда и ни при каких обстоятельствах не пересекались. Ведь если физической памяти будет не хвать для резерва, то машина просто не стартанет. . 

0 Kudos
VMadmin4eg
Hot Shot
Hot Shot

AlexFedosenko wrote:

Maxim, спасибо. Скажите правильно ли я понимаю. Эта галочка дает возможность сразу же резервировать для всех машин где она выставлена, всю память что указана у нее в настройках? Если так тогда, получается что нужно ОЧЕНЬ аккуратно с этим работать. И получается при таком подходе в принципе исключено использование такой фичи как запуск виртуальных машин со сконфигурированным кол-вом памяти превышающим физическую память хоста или кластера. Т.е. нужно на столько точно рассчитать кол-во машин в кластере или на хосте и кол-во их выделенной памяти чтобы они никогда и ни при каких обстоятельствах не пересекались. Ведь если физической памяти будет не хвать для резерва, то машина просто не стартанет. .

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

Если есть DRS (ESXi Enterprise), то кластер сам решит где лучше ВМ запускать.

Если нет DRS, то придется аккуратнее рассчитывать ресурсы.

На практике чаще всего ВМ которым надо всю память резервировать пора-тройка штук, остальным достаточно часть памяти зарезервировать исходя из статистики потребления ресурсов и более критичным машинам поставить Shares в high, менее критичным в low. Вручную выставлять Shares VMware не рекомендует.

View solution in original post

AlexFedosenko
Enthusiast
Enthusiast

Огромное спасибо, Maxim. Теперь все понятно. Последний глупый вопрос =).

Если я создам пул ресурсов, в нем укажу reservation по памяти 2Гб и 2Ггц по процессору, при этом укажу limit в 2.1Гб оперативки и 2.1Ггц процессора. То будет ли это означать что я жестко задам всем дочерним объектам существовать только в этом конкретном диапазоне ресурсов, БЕЗ возможности отжирать сверх лимита ресурсы хоста или кластера, за счет использования механизмов оптимизации таких как Balloon? И у машин останется только один путь это свопиться?

При таком раскладе что-то будет меняться если ставить или убирать галочку expandable reservation?

0 Kudos
ConstantinV
Hot Shot
Hot Shot

своп - последний этап. сначала запустится дедупликация памяти, потом балун, потом сжатие, а потом уже своп.

VCP 4/5, VCAP-DCD 5, VCAP-DCA 5, VCAP-CIA 5, vExpert 2012, 2013, 2014, 2015
AlexFedosenko
Enthusiast
Enthusiast

Константин, спасибо, я кстати этого вовсе не знал, теперь хоть буду знать порядок действия хоста или кластера в таких ситуациях. Ну а в моем случае, с такими настройками ведь не должен работать Balloon, я ведь запретил limit-ом получать память от других машин. Или я снова чего-то не недопониманию? У меня как раз в последнем посте стоит вопрос как жестко ограничить рамки ресурсов для дочерних объектов пула и запретить брать больше ресурсов чем лимитировано. Такими настройками как я описал, я хочу просто отрезать кусок ресурсов для пула, reservation - гарантировать а limit - ограничить, и сделать так чтобы машины в пуле получали не меньше но и НЕ БОЛЬШЕ ресурсов чем я хочу. Ну кроме свопа ). Чтобы никаких отъемов баллоном у других машин вне этого пула.

0 Kudos
ConstantinV
Hot Shot
Hot Shot

1. Лимит запрещает брать физическую память хоста, но никак не неактивную память других машин (то есть балун).

2. А зачем вот такие сложности? Выделите в настройках ВМ каждой ВМ объём который ей нужен и всё! Лимиты крайне не рекомендуемая штука для продуктивных машина вещь.

VCP 4/5, VCAP-DCD 5, VCAP-DCA 5, VCAP-CIA 5, vExpert 2012, 2013, 2014, 2015
VMadmin4eg
Hot Shot
Hot Shot

AlexFedosenko wrote:

Чтобы никаких отъемов баллоном у других машин вне этого пула.

Есть хорошая KB'шка на тему технологий работы с памятью: http://kb.vmware.com/kb/2017642

Balloon - это освобождение драйвером из VMware Tools памяти которой ОС не использует. Этот драйвер смотрит что происходит с памятью изнутри ОС и передает данные хосту. Если VMware Tools не установлены, то и балонинга не будет. В балонинге нет ничего страшного.

Так же как и в Shared Memory, т.к. это фактически дедупликация памяти и ОС об этом даже не догадывается и на производительность этот процесс не влияет.

Если у вас есть SSD, то можно настроить Swapping to Host Cache и своп тоже станет не таким страшным.

Из последнего поста не понятно чего вы хотите добиться и главное зачем?

AlexFedosenko
Enthusiast
Enthusiast

Константин, вы пишите "А зачем вот такие сложности? Выделите в настройках ВМ каждой ВМ объём который ей нужен и всё! Лимиты крайне не рекомендуемая штука для продуктивных машина вещь"

Вот как раз я хочу это для того чтобы мне не лезть каждый раз в настройки машины и не менять там память а просто перетаскивать ее мышкой в нужный пул. Так ведь более удобнее и быстрее управлять ресурсами машин. Да и к тому же пулы как я понимаю еще и для этого сделаны. Иначе зачем мне вообще тогда пул? Если я все рассчитаю, выставлю везде руками нужные настройки да и дело с концом =).

Спасибо что отвечаете. Smiley Wink

0 Kudos
AlexFedosenko
Enthusiast
Enthusiast

Максим. В последнем посте я хочу добиться как я уже писал четкое отрезание куска ресурсов определенной машине в определенное время. Зачем?

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

Потому как если учесть то что пишет Константин "Лимит запрещает брать физическую память хоста, но никак не неактивную память других машин (то есть балун)." То получается, что имея машину с 8Гб памяти, перетаскиваем ее в пул где стоят лимиты на 2Гб памяти, эта машина все равно при своей работе будет за счет Баллона сосать память из других, пусть даже не активную. Максим я понятно изъясняюсь? Может я несу бред? Я просто новичок в этом деле, поэтому задаю так много дурацких вопросов.

Спасибо за терпене. Я вам очень благодарен за ответы.

0 Kudos
ConstantinV
Hot Shot
Hot Shot

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

VCP 4/5, VCAP-DCD 5, VCAP-DCA 5, VCAP-CIA 5, vExpert 2012, 2013, 2014, 2015
AlexFedosenko
Enthusiast
Enthusiast

Константин, смотрите, например, программисты решили "запилить" на работающий сервер новую программу. Им нужно узнать сколько эта программа будет есть памяти при ее работе в течении суток. Esxi где сейчас работает этот сервер и другие виртуалки чуток перегружен, т.е. он выплывает как раз за счет Баллона и распределению ресурсов. Вот как раз этому серверу где будут тестить программу, при создании было выделено 22 Гб памяти, но так как он сейчас реально использует только 4, то все его не активные ресурсы отдаются остальным машинам и за счет этого все худо бедно но существует. Но в тоже время программисты не знаю как поведет себя программа и сколько она сожрет памяти за сутки работы. Может ее заглючит и она начнет забивать оперативку по максимум и уходить в бесконечность. А так как наш ESXi перегружен а тут еще эта прога захочет забить все 22 Гб памяти у этого сервера то будет ппц. Можно конечно играться с шарами, но а почему бы не сделать так. Создать пул ресурсов где будет определенный резерв и лимит, не останавливая сервер перетащить его туда и потом тестить программу и уже смотреть как она будет себя вести. Если не забьет всю оперативку до лимита - хорошо а если будет забивать, ну что же, по крайне мере мы лимитами пула не дали сожрать ее всю и наша производственная среда не напряглась больше обычного. Ну а потом после тестов, сервер можно обратно перетащить где он и был.

0 Kudos
ConstantinV
Hot Shot
Hot Shot

Тогда лучше не пул, а в свойствах самой ВМ во вкладке resourses выставить эти лимиты.

VCP 4/5, VCAP-DCD 5, VCAP-DCA 5, VCAP-CIA 5, vExpert 2012, 2013, 2014, 2015