У меня есть гипервизор, который использует 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