virt-manager: Распределение доступной памяти

У меня есть гипервизор, который использует kvm и virt-manager для обработки виртуальных машин.

Гипервизор имеет 6 Гбайт памяти.

Если я добавлю новую виртуальную машину, я не знаю, сколько памяти все еще свободно.

По крайней мере, диалог virt-manager не показывает это:

Есть ли инструмент, который помогает мне найти подходящее максимальное значение?

Пример:

  • 6 ГБ общей памяти хоста
  • 2 ГБ предоставлено хосту "host-one"
  • ? ГБ для хоста "хост-два".

Выше приведен только простой пример. На наших реальных серверах у нас гораздо больше виртуальных хостов.

Я боюсь отдавать слишком много памяти виртуальным хостам. Это приводит к значительному снижению производительности, если у гипервизора слишком мало. Если бы я выделил "2 хоста" 4 ГБ, то гипервизор был бы "в огне", поскольку у него "нет воздуха для дыхания".

Есть ли инструмент, который может помочь мне решить, сколько памяти доступно?

3 ответа

Как сказано в документации Redhat о чрезмерной загрузке памяти,

"Гостевые виртуальные машины, работающие на гипервизоре KVM, не имеют выделенных блоков физической оперативной памяти, выделенных для них. Вместо этого каждая гостевая виртуальная машина функционирует как процесс Linux, где ядро ​​Linux физической машины хоста выделяет память только по запросу".

Это делает всю ситуацию с определением того, сколько оперативной памяти вы можете / должны выделять каждому хосту, к сожалению, немного нечетко. Одним из инструментов, который вы можете использовать для просмотра выделенной памяти между виртуальными машинами, является virsh и его команда freecell.

Страница man для virsh гласит, что freecell "печатает доступный объем памяти на машине или в ячейке NUMA. Команда freecell может предоставить один из трех различных отображений доступной памяти на машине, в зависимости от указанных параметров...".

Для гипервизоров на основе KVM вы можете использовать команду оболочки виртуальной машины (virsh) в терминале для входа в виртуальную оболочку - ваша подсказка должна измениться со значения по умолчанию на virsh #, Затем вы можете использовать list Команда для отображения списка виртуальных машин на гипервизоре.

Для отображения объема памяти на виртуальную машину (по номеру, указанному list команда), используйте:

virsh # freecell <cell_number> 

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

Это должно дать вам хорошее представление об общем объеме памяти, с которой вы работаете, и о том, сколько выделено каждой виртуальной машине. Если вы решите изменить объем выделенной памяти, virsh также предоставит setmem Команда для изменения выделения памяти для гостевого домена. Он похож на интерфейс, предоставляемый virt-manager, но предоставляет больше возможностей и гибкости. Вы можете найти все параметры и описания команд с man virsh,

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

Вы можете лучше контролировать использование огромных страниц, если отключите анонимные огромные страницы (загрузка с transparent_hugepages=never) и затем вы можете назначить настолько большой пул огромных страниц, сколько захотите (загрузитесь с default_hugepagesz=2M hugepagesz=2M hugepages=2560 на 5 ГБ памяти и оставляя 1 ГБ на хост-ОС).

Вам также необходимо добавить это в определение вашей виртуальной машины.

<memoryBacking>
  <hugepages/>
</memoryBacking>

И чтобы ответить на ваш вопрос, если вы используете огромные страницы, на "сколько памяти" ответит grep ^Huge /proc/meminfo, Вот пример с 60G, зарезервированным для виртуальных машин, и около 600МБ по-прежнему доступны.

> grep ^Huge /proc/meminfo
HugePages_Total:   30000
HugePages_Free:      304
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

Вот моя хакерская версия. Идеи как его улучшить, приветствуются:

Укажите объем оперативной памяти в килобайтах, который необходим каждой виртуальной машине:

hypervisor5:~ # for dom in $(virsh list --all --name); do echo $(virsh dumpxml $dom | sed -nre 's/^.*>([0-9]*)<.currentMemory.*$/\1/p') $dom ; done| sort -n
524288 testfoo
2146304 x131
3121152 y114
3121152 foo
4096000 y123
4194304 mac-test
6144000 x123

Сумма оперативной памяти, используемой виртуальными машинами

hypervisor5:~ # for dom in $(virsh list --all --name); do virsh dumpxml $dom | sed -nre 's/^.*>([0-9]*)<.currentMemory.*$/\1/p' ; done| awk '{s+=$1} END {print s}'
23347200

Доступные физические ВМ:

hypervisor5:~ # cat /proc/meminfo | grep MemTotal
MemTotal:       24797436 kB

Сколько осталось для работы с виртуальной машиной:

hypervisor5:~ # python -c 'print 24797436-23347200'
1450236 (kiB)

... не так много осталось для гипервизора.

Еще раз: идеи, как это улучшить, приветствуются!

Другие вопросы по тегам