Назад | Перейти на главную страницу

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

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

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

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

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

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

Пример:

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

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

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

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

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

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

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

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

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

virsh # freecell <cell_number> 

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

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

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

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

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)

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

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

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

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

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

<memoryBacking>
  <hugepages/>
</memoryBacking>

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

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