Назад | Перейти на главную страницу

Как сохранить важные виртуальные машины в памяти, не отключая свопинг?

Хост VM -> Xenon E5-2440 с памятью 48G ... Все работает под управлением CentOS6.5 (2.6.32-431)

У меня есть 4 гостевые виртуальные машины, каждая с 2 ГБ памяти. Их образы дисков - это локальные файлы. На хост-машине также работает малоиспользуемый сервер NFS, но не более того. (swappiness = 0) Примерно через день, когда буферный кеш вырастет почти до 40 ГБ, некоторые из этих виртуальных машин почти полностью заменены на диск. (просматривается через: grep VmSwap / proc / PID / status)

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

Я, безусловно, полностью за то, чтобы мои гостевые виртуальные машины использовали файл подкачки разумного размера и позволяли ОС определять баланс между буферным кешем и подкачкой, но в моем случае это не работает для хост-машины.

Есть ли возможность предотвратить снижение скорости отклика виртуальных машин, кроме отключения подкачки на хост-машине? Попытаться использовать cgroups или просто отключить файл подкачки для этого варианта использования?

Вы можете заблокировать страницы в памяти в более поздних версиях libvirt: -

http://libvirt.org/formatdomain.html#elementsMemoryBacking

Осторожный: Это не появляется при использовании Fedora 19 в качестве гипервизора, тем не менее, согласно журналу изменений для последней версии RPM (я могу найти) для EL6.5 libvirt, она существует;

  • 18 июля 2013 г., Иржи Денемарк - 0.10.2-21
    • conf: Избегайте NULL deref для состояния домена pmsuspended (rhbz # 822306)
    • libvirt: определение типов событий сбоя домена (rhbz # 822306)
    • qemu: Рефакторинг processWatchdogEvent (rhbz # 822306)
    • qemu: выставить qemuProcessShutdownOrReboot () (rhbz # 822306)
    • qemu: реализовать события oncrash при панике гостя (rhbz # 822306)
    • qemu: Реализовать события coredump oncrash при панике гостя (rhbz # 822306)
    • conf: устранена утечка памяти при разборе узлов XML порта nat (rhbz # 851455)
    • security_manager: Исправить сравнение (rhbz # 984793)
    • qemu: предотвращение сбоя libvirtd без конфигурации гостевого агента (rhbz # 984821)
    • qemu: исправить двойное освобождение от возвращенного массива JSON в qemuAgentGetVCPUs () (rhbz # 984821)
    • qemu_agent: добавлена ​​поддержка добавления массивов к командам (rhbz # 924400)
    • Добавлена ​​поддержка блокировки страниц памяти домена (rhbz # 947118)
    • qemu: реализовать поддержку блокировки страниц памяти домена (rhbz # 947118)
    • qemu: Проверить наличие поддержки -realtime mlock = on | off (rhbz # 947118)
    • qemu: Переместить вычисление лимита памяти в функцию многократного использования (rhbz # 947118)
    • util: Новый virCommandSetMax (MemLock | Процессы | Файлы) (rhbz # 947118)
    • qemu: установить RLIMIT_MEMLOCK, когда используется резервное копирование / блокировка памяти (rhbz # 947118)
    • Добавить протокол Gluster в качестве поддерживаемой серверной части сетевого диска (rhbz # 849796)
    • qemu: добавлена ​​поддержка серверной части сетевого хранилища на основе протокола gluster. (rhbz # 849796)
    • tests: Добавить тесты для поддержки сетевых дисков на основе протокола gluster (rhbz # 849796)

Вот пошаговые инструкции для решения Мэтью:

  1. Выключите виртуальную машину
  2. virt-xml $VMNAME --edit --memorybacking locked=on
  3. systemctl restart libvirtd (не уверен, нужно ли это)
  4. Запустить виртуальную машину

где $VMNAME это имя виртуальной машины.

Я успешно прошел ситуацию, когда раньше моя виртуальная машина полностью выгружалась. Теперь процесс qemu виртуальной машины не имеет использования подкачки и реагирует.

Предостережение: согласно документация libvirt, вся память qemu будет заблокирована, она может непредсказуемо вырасти и нужно установить hard_limit для защиты хост-системы (виртуальная машина будет отключена, если необходимо оставаться в пределах лимита).

Изменить: упрощенный шаг 2 (был virsh edit $VMNAME и добавить <memoryBacking><locked/></memoryBacking> после <domain type='kvm'>)

Вы можете использовать cgroups и настроить swappiness для cgroup

http://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt

http://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt

Виртуальный процессор KVM - это просто поток на хосте, поэтому им можно управлять, как и любым другим процессом.