Безопасно ли "MaxMemory" совершать избыточные коммиты с помощью kvm/libvirt?

Использование Libvirt / KVM в Ubuntu 16.04

Compiled against library: libvirt 1.3.1
Using library: libvirt 1.3.1
Using API: QEMU 1.3.1
Running hypervisor: QEMU 2.5.0

# dpkg -s qemu-kvm | grep Version
Version: 1:2.5+dfsg-5ubuntu10.

Безопасно ли устанавливать "MaxMemory" ( ссылка) выше общей физической памяти хост-машины, если "currentMemory" никогда не превысит фактическую доступную память на хост-машине?

Вообразите ситуацию как:

  1. Хост-машина имеет 8 ГБ ОЗУ
  2. Виртуальная машина настроена с 16 ГБ "MaxMemory" и 4 ГБ "currentMemory"

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

Чтобы процитировать по ссылочной ссылке, "currentMemory" относится к:

Фактическое распределение памяти для гостя.

Кажется, что реальным ограничением использования памяти виртуальной машины является "currentMemory"; однако эта цитата:

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

... что относится к виду MaxMemory подразумевает "во время выполнения", может быть, он может использовать больше, чем currentMemory?

Может кто-то пролить свет на это? Я полагаю, что все это работает так: KVM загружает виртуальную машину и сообщает, что у нее есть "MaxMemory", и вскоре после этого сообщает виртуальной машине, что она может использовать только "currentMemory". Я обеспокоен тем, что там может быть некоторое состояние гонки, когда виртуальной машине может быть разрешено быстро требовать "MaxMemory". Хотя я полагаю, что даже если это произойдет, OOM Killer, скорее всего, просто уничтожит процесс виртуальной машины на хост-компьютере.

Причина, по которой я хочу это сделать, заключается в том, что я могу выполнить миграцию в реальном времени на другие хосты, которые потенциально могут дать 16 ГБ "currentMemory", даже если это невозможно на хост-машине, на которой изначально настроена виртуальная машина.

1 ответ

Решение

Когда гость впервые загрузится, он увидит зарегистрированный объем памяти MaxMemory и теоретически может использовать ее в это время. Когда загрузочный драйвер в гостевой системе загружается, он уменьшает гостевую оперативную память до CurrentMemory. По крайней мере, для гостей Linux, гость никогда не будет касаться всей оперативной памяти, разрешенной MaxMemory, до загрузки драйвера всплывающей подсказки, поэтому вы не должны рисковать давлением памяти на хосте. Некоторые гостевые ОС (по крайней мере, некоторые версии Windows) предпочитают обнулять все страницы ОЗУ при запуске, что может привести к тому, что QEMU будет использовать всю MaxMemory. Кроме того, если в гостевой системе не загружен драйвер всплывающей подсказки, он никогда не уменьшит объем ОЗУ до уровня CurrentMemory. Также, если гость злонамеренный, он может не учитывать уровень CurrentMemory, просто игнорируя всплывающие запросы.

По сути, если вы используете доверенную гостевую систему Linux и в гостевой машине есть драйвер всплывающей подсказки (он должен быть там по умолчанию в любой современной ОС Linux), все будет в порядке.

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