Динамично разпределение на паметта за виртуални машини
Тази кратка бележка е относно използването на балонния драйвер virtio за "гореща" промяна на количеството RAM в системите за гости. Технологията съществува отдавна и е доста лесна за използване, но повдига много интересни въпроси.
Как се използва?
Използването на балонния драйвер е един от основните начини за динамична промяна на количеството RAM, разпределено за виртуална машина. Трябва да се отбележи, че разглежданият механизъм не е аналогичен на горещото включване на паметта и изисква поддръжка от ядрото на операционната система; за това са разработени съответните драйвери за Linux и Windows системи. По-голямата част от дистрибуциите на Linux имат поддръжка на virtio-balloon, активирана по подразбиране. Изтеглянето и инсталирането на драйвери за virtio balloon за Windows е описано тук
За да активирате балониране, трябва да стартирате qemu с опцията -balloon virtio.
Можете да разберете количеството памет, разпределено за виртуалната машина, като използвате командата info balloon в конзолата за наблюдение на qemu
В система за гости (Linux) можете да използвате командата free, за да получите информация за използването на RAM
Командата балон се използва за промяна на количеството RAM
В системата за гости
По същия начин можете да увеличите размера на паметта, но без да надвишавате ограничението, зададено при стартиране (опция -m)
За Windows системи процесът е напълно подобен.

След изрязване на паметта

Как работи?
Драйверът Balloon създава специален процес в ядрото, който по команда от хоста може да промени количеството памет, което консумира. Оставащата памет може да се използва от всички други процеси в системата за гости засобствени нужди.
Ако е необходимо да се намали количеството памет, разпределено за машината, тогава първо процесът на балон се "надува" до необходимия размер и след това позволява на хоста да освободи необходимото количество памет

Увеличаването на обема на паметта става по подобен начин.

При този метод на работа количеството памет, използвано от виртуалната машина, е ограничено от общото количество памет, посочено в параметъра -m.
Трябва да се отбележи, че в текущата реализация на балона драйверът не обръща никакво внимание на количеството свободна памет в системата, така че ако използването на паметта е твърде ограничено, лесно можете да се сблъскате със загуба на производителност (поне поради дискови кешове) или пълно замразяване на машината. Когато няма достатъчно памет, операционната система започва да използва swap, което води до активно използване на диска и значително забавя работата.
Следователно, за да използвате ефективно балонния драйвер, е необходимо по някакъв начин да получите информация за действителното използване на паметта в системата за гости и въз основа на получените данни да вземете решение за ограниченията. В момента се разработва такъв механизъм. Адам Литке Разработи поредица от пачове за qemu и балонния драйвер, които предоставят повече информация за използването на паметта. (Това се прави с помощта на командата info balloon в монитора qemu.) Последните версии на libvirt вече съдържат код, който анализира актуализирания изход на командата info balloon, за да получи информация за RAM на госта. Но според Адам, досега тези пачове съдържат някои проблеми, свързани с взаимодействието с qemu, и в момента се работи активно за финализирането им.
Но сега има няколко начина да получитеинформация от системата за гости. Например, можете да предавате данни за използването на паметта по мрежата (разбира се, в този случай мрежата трябва да бъде конфигурирана във виртуалната машина). Този метод се използва в проекта MoM. След това ще опиша малко по-различен начин за комуникация между хост системата и виртуалната машина, с който можем да контролираме по-ефективно драйвера на балона.
Получаване на информация от системата за гости.
Можете да използвате механизма virtio-serial, за да предавате информация от госта към хоста. Можете да прочетете повече за това тук и тук. За напълно тестов пример за работа с памет ще използваме канал (тръба) между госта и хоста. Връзката е схематично показана на фигурата по-долу.

За да създадете подобен интерфейс на virtio, трябва да създадете два fifo файла и да зададете необходимите параметри на qemu
Сега qemu monitor е достъпен чрез файловете mon.in и mon_out, файловете mem_pipe.in и mem_pipe.out се използват за комуникация със системата за гости чрез създадения канал. Това създава устройството /dev/virtio-ports/mem в гост системата, което се използва за получаване и предаване на съобщения към хост системата.
За да получите информация за потреблението на памет от виртуална машина в системата за гости, ще работи следният прост скрипт (чиито възможности могат да бъдат разширени за неопределено време)
Скриптът изпълнява най-простата задача - при получаване на mem съобщение, той изпраща количеството свободна памет към хост системата (включително "условно свободни" кешове). Нека тестваме скрипта
Получената стойност показва количеството свободна памет в MB. И накрая, можете да конфигурирате виртуалната машина да регулира автоматично количеството памет в зависимост от използването. Скриптът по-долу има огромен брой недостатъци, той е предназначенпредимно за демонстриране на възможностите.
Разбира се, при реални проблеми логиката за управление на паметта трябва да се основава на по-подробни данни за анализ, включително прогнози за нарастване на потреблението на памет и прогнози за по-нататъшно използване, но включването на тези функции е фундаментално осъществимо вече със съществуващите механизми. Трябва да се отбележи, че подобряването на пачовете за балонния драйвер ще позволи получаване на данни за потреблението на памет не от системата за гости, а директно от монитора qemu.