Определение простыми словами
Memory Ballooning — это способ гипервизора управлять памятью между несколькими виртуальными машинами в режиме реального времени. Внутри каждой гостевой ОС работает специальный драйвер-«баллон». Когда хосту не хватает RAM, гипервизор просит баллон «надуться» — драйвер выделяет память внутри гостя и передаёт её обратно хосту. Когда давление спадает, баллон «сдувается» и память возвращается виртуальной машине.
Технология позволяет запускать на физическом сервере больше виртуальных машин, чем позволяет установленная RAM, за счёт того, что не все гости используют свой лимит одновременно. Это называется overcommit памяти.
Сравнение
| Механизм | Принцип | Недостаток |
|---|---|---|
| Memory Ballooning | Драйвер в гостевой ОС возвращает страницы хосту | Требует установки guest tools / virtio-balloon |
| KSM (Kernel Same-page Merging) | Хост объединяет одинаковые страницы памяти разных VM | Нагрузка на CPU; уязвимость к side-channel атакам |
| Memory Swapping | Страницы RAM вытесняются на диск (swap) | Резкое падение производительности при активном свопе |
Кейсы использования
- Overcommit на dev/test стендах: 10 VM с лимитом 4 ГБ каждая на хосте с 16 ГБ — баллонирование удерживает суммарное потребление в пределах физической RAM, пока нагрузки не пересекаются.
- Ночная консолидация ресурсов: В часы низкой нагрузки гипервизор (KVM, Proxmox VE) отбирает неиспользуемую память и отдаёт её активным VM.
- VDI-среды: Сотни рабочих столов одновременно используют разные объёмы RAM; баллон выравнивает пиковое потребление.
- Негативный пример: Продакшн база данных (PostgreSQL, MySQL) с настроенным большим shared_buffers — гипервизор «надул» баллон в момент пиковых запросов, отобрал 2 ГБ буферного пула. Результат: деградация запросов, резкий рост latency. Для таких VM баллонирование следует отключать или ставить жёсткий минимум (min_balloon).
Технические детали
В KVM баллон реализован через драйвер virtio-balloon. Проверить текущее состояние и управлять им можно через virsh:
# Посмотреть текущее потребление памяти VM
virsh dommemstat vm-name
# Установить целевой объём памяти 1 ГБ (в килобайтах)
virsh setmem vm-name 1048576 --live
# Установить минимальный гарантированный объём 512 МБ
virsh setmem vm-name 524288 --config
# Проверить, загружен ли модуль virtio_balloon в гостевой Linux
lsmod | grep virtio_balloon
# Принудительно выгрузить баллон (вернуть память гостю)
echo 0 | sudo tee /sys/bus/virtio/drivers/virtio_balloon/*/target_kb
В Proxmox VE параметр Balloon выставляется в настройках VM (вкладка Memory). Значение 0 отключает механизм полностью. Для гостей Windows необходимо установить VirtIO Win Drivers, иначе драйвер баллона не загрузится и гипервизор не сможет управлять памятью динамически.
Важный параметр ядра хоста: vm.overcommit_memory. При значении 1 ядро разрешает любые аллокации, что в связке с баллонированием позволяет агрессивный overcommit, но повышает риск OOM-killer на хосте.
🔥 Где это применяется
Частые вопросы
Нужно ли что-то устанавливать в гостевую ОС для Memory Ballooning?
Да. В Linux требуется модуль ядра virtio_balloon (входит в стандартное ядро начиная с версии 2.6.27). В Windows — драйвер из пакета VirtIO Win Drivers. Без драйвера гипервизор не сможет динамически изменять выделенную память.
Чем Memory Ballooning отличается от обычного overcommit памяти?
Overcommit — это политика гипервизора разрешать VM запрашивать больше RAM, чем есть физически. Memory Ballooning — конкретный механизм реализации: драйвер в гостевой ОС активно возвращает неиспользуемые страницы хосту, а не просто откладывает аллокацию.
Безопасно ли включать баллонирование на продакшн-серверах?
Зависит от приложения. Для stateless-сервисов — допустимо. Для баз данных, кэш-серверов (Redis, Memcached) или Java-приложений с фиксированным heap — не рекомендуется: отъём памяти в пиковый момент вызывает деградацию. Устанавливайте min_balloon равным реальному рабочему объёму VM.
Как проверить, работает ли баллон на работающей VM в KVM?
Выполните virsh dommemstat <имя_vm> на хосте. Поля actual и unused покажут текущий размер баллона и свободную память внутри гостя. Если unused близко к нулю при высоком actual — баллон не активен или гость использует всю выделенную RAM.