Memory ballooning — техника управления памятью в виртуализированных средах, позволяющая гипервизору отбирать неиспользуемую RAM у одних VM и перераспределять её другим. Основана на «надувании» и «сдувании» специального balloon-драйвера, установленного в гостевой ОС. Когда гипервизор хочет забрать память, balloon надувается — гостевая ОС воспринимает это как нехватку RAM и начинает использовать своп. Гипервизор получает освободившиеся страницы.
Как работает
Balloon-драйвер устанавливается как часть гостевых дополнений: VirtIO Balloon (KVM), VMware Tools (VMware), Integration Services (Hyper-V). При команде «надуть» гипервизор сигнализирует драйверу, тот аллоцирует страницы RAM внутри гостевой ОС — гостевая ОС думает, что их использует приложение. Гипервизор выгружает эти страницы обратно в физический пул. При «сдувании» — страницы возвращаются VM.
Ballooning позволяет реализовать оверкоммит памяти: суммарный объём RAM, выданный всем VM, превышает физическую RAM хоста. Например, 10 VM по 4 ГБ = 40 ГБ виртуальной RAM при 32 ГБ физической. Это работает, пока не все VM одновременно активны.
История
Memory ballooning разработана VMware в начале 2000-х годов. Техника описана в академической работе Карла Уолда (Carl Waldspurger) из VMware в 2002 году. VirtIO Balloon для KVM появился в 2008 году. Сегодня ballooning используется во всех крупных гипервизорах: KVM, VMware ESXi, Hyper-V, Xen.
Ballooning vs другие техники управления памятью
- Ballooning — гостевая ОС активно участвует, cooperating
- Memory swapping — гипервизор принудительно выгружает страницы VM на диск (медленно)
- Transparent page sharing (KSM) — дедупликация одинаковых страниц между VM
- NUMA-aware allocation — размещение VM на NUMA-узле, близком к её физической RAM
На что обращать внимание
Ballooning снижает производительность VM при активном надувании — гостевая ОС начинает своп. На хостинге это означает, что при пиковой нагрузке на соседние VM ваш сервер может замедлиться. Это признак агрессивного оверселлинга. Balloon-драйвер должен быть установлен — без него гипервизор переходит к более жёстким методам (page swapping).
Memory ballooning в практике хостинга
Балунинг памяти критически важен для хостеров с оверкоммитом RAM. Если физический сервер имеет 256 ГБ RAM, а суммарно гостям выделено 400 ГБ, balloon-драйвер забирает память у простаивающих ВМ и отдаёт активным. Balloon-драйвер в Linux — модуль ядра virtio_balloon (встроен с версии 2.6.25). Без balloon-драйвера гипервизор использует swap, что катастрофически снижает производительность.
Ограничения технологии
Балунинг неприменим, когда все ВМ одновременно активны — гипервизор не может отобрать память у занятой ВМ. Для таких сценариев используют NUMA-pinning и строгий резерв ресурсов без оверкоммита. На серверах с ECC-памятью балунинг работает стабильнее: исключаются ошибки передачи страниц памяти между ВМ. Balloon-драйвер работает в паре с гипервизором через VirtIO-интерфейс.