KVM: host vcpu blocked on memory allocation — Решение зависания ВМ KVM
Архитектура ошибки и симптомы сбоя
Критический сбой гипервизора «KVM: host vcpu blocked on memory allocation failure» генерируется подсистемой ядра KVM (Kernel-based Virtual Machine). Ошибка указывает на то, что поток виртуального процессора гостевой ОС (vCPU Thread) запросил выделение или отображение физической страницы памяти хоста (EPT/NPT Page Fault), но аллокатор хоста не смог предоставить память из-за исчерпания свободных страниц или глубокой фрагментации. В результате vCPU блокируется в ядре, а виртуальная машина намертво зависает.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| vCPU Thread | Host Task (qemu-kvm) | Поток хостовой ОС, исполняющий инструкции виртуального процессора. |
| EPT / NPT Fault | Extended Page Tables | Аппаратная трансляция гостевых физических адресов (GPA) в адреса хоста (HPA). |
| Overcommit | Memory Exhaustion | Суммарный объем RAM виртуальных машин превышает физическую память хоста. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Проверка доступности памяти и фрагментации хоста
# Проверка свободной памяти и зон аллокатора на гипервизоре:
cat /proc/buddyinfo
free -h
# Проверка процессов QEMU, потребляющих максимум памяти:
ps aux --sort=-%mem | grep qemu | head -n 5Сценарий 2: Выделение статических HugePages (2MB / 1GB) для виртуальных машин
Использование HugePages исключает накладные расходы на двухуровневые таблицы страниц EPT/NPT:
# Выделение пула HugePages по 2MB (например, 16000 страниц = 32GB):
echo 16000 | sudo tee /proc/sys/vm/nr_hugepages
# Настройка монтирования hugetlbfs в /etc/fstab:
hugetlbfs /dev/hugepages hugetlbfs defaults 0 0Сценарий 3: Тюнинг параметров оверкоммита и компактификации памяти
Отрегулируйте параметры виртуальной памяти гипервизора в /etc/sysctl.d/99-kvm-mem.conf:
cat <<EOF | sudo tee /etc/sysctl.d/99-kvm-mem.conf
# Предотвращение блокировок аллокатора KVM:
vm.overcommit_memory = 1
vm.min_free_kbytes = 2097152
vm.compact_unevictable_allowed = 1
vm.compaction_proactiveness = 50
EOF
sudo sysctl -p /etc/sysctl.d/99-kvm-mem.confСценарий 4: Отключение или тюнинг KSM (Kernel Samepage Merging)
Если дедупликация памяти KSM вызывает задержки при разделении страниц (Copy-on-Write):
# Отключение KSM:
echo 0 | sudo tee /sys/kernel/mm/ksm/runITSTM выполнит комплексный сайзинг кластеров виртуализации, настройку NUMA-pinning, HugePages и устранит любые просадки производительности vCPU.
Частые вопросы (FAQ)
Что происходит с гостевой ОС при блокировке vCPU на хосте?
Внутри гостевой ОС останавливается ход времени (Time Drift), зависают все системные таймеры и прерывания, а ядро гостя через 120 секунд регистрирует ошибку INFO: task blocked for more than 120 seconds или Soft Lockup.
Почему оверкоммит памяти опасен для продуктивных хостов KVM?
Когда суммарная память гостевых машин превышает физическую RAM хоста, ядро начинает сбрасывать гостевую память в Swap хоста. Так как задержка диска в тысячи раз выше RAM, потоки vCPU массово впадают в состояние D-state.
Как привязать память виртуальной машины к конкретному NUMA-узлу?
Используйте утилиту numactl или настройте директивы <numatune> в XML-конфигурации домена libvirt, чтобы память ВМ выделялась строго из локального сокета процессора.
Что такое KVM MMU Shadow Pages?
Это внутренние теневые структуры ядра KVM, используемые для ускорения трансляции адресов памяти гостя. Размер пула теней можно увеличить параметром модуля: options kvm mmu_initial_root_hva_pool=4096.