Включение CPU Passthrough для виртуальной машины в Nutanix AHV

Иногда виртуальной машине необходимо передать чуть больше процессорных инструкций, чем изначально она получает от гипервизора. Например, при необходимости использовать вложенную виртуализацию (nested virtualization).

Для решения данной задачи имеется специальный параметр cpu_passthrough, который можно активировать для конкретных виртуальных машин.

Использование данного параметра дает виртуальной машине дополнительный функционал за счет расширения набора инструкций, однако, накладывает и ограничения, причем очень серьезные – функция Live Migration для виртуальной машины больше недоступна.

Обратим внимание на доступный функционал процессора гипервизора AHV:

[root@NTNX-7638b1ac-A ~]# cat /proc/cpuinfo
model name      : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
...
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr
pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht
tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon
pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu
pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma
cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic
movbe popcnt tsc_deadline_timer aes xsave
avx f16c rdrand lahf_lm abm 3dnowprefetch ida arat epb pln 
pts dtherm intel_pt spec_ctrl stipb retpoline ssbd 
flush_l1d md_clear tpr_shadow vnmi flexpriority 
ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep 
bmi2 erms invpcid rtm cqm rdseed adx smap xsaveopt cqm_llc cqm_occup_llc

Смотрим на поле Flags, у хоста их 110, включая набор инструкций vmx – Virtual Machine Extensions (vmx для процессоров семейства Intel, svm для AMD, соответственно).

Запустим виртуальную машину и посмотрим, что она получает от гипервизора:

[root@test-passthrough ~]# cat /proc/cpuinfo
model name      : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
...
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr 
pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb 
rdtscp lm constant_tsc nopl eagerfpu pni pclmulqdq ssse3 fma cx16 
pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes 
xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch 
invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 
hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt 
arat md_clear spec_ctrl intel_stibp

75 флагов и нет vmx.

Подключимся к CVM и включим CPU Passthrough для тестовой виртуальной машины в aCLI с помощью параметра cpu_passthrough в значении true:

$ acli
<acropolis> vm.update test-passthrough cpu_passthrough=true
test-passthrough: InvalidVmState: Cannot complete request in state On

Забыл упомянуть, что перед включением функционала необходимо выключить виртуальную машину. Выключаем, пробуем еще раз и включаем обратно:

$ acli
<acropolis> vm.off test-passthrough
<acropolis> vm.update test-passthrough cpu_passthrough=true
test-passthrough: complete
<acropolis> vm.on test-passthrough

Посмотрим вновь на количество флагов. Было 75, стало 84:

[test-passthrough ~]# cat /proc/cpuinfo
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge 
mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb 
rdtscp lm constant_tsc arch_perfmon rep_good nopl nonstop_tsc eagerfpu 
pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt 
tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 
3dnowprefetch invpcid_single ssbd ibrs ibpb stibp tpr_shadow vnmi 
flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms 
invpcid rtm rdseed adx smap xsaveopt arat md_clear spec_ctrl intel_stib

Так же у виртуальной машины доступен флаг vmx, который отсутствовал ранее.

Попробуем мигрировать виртуальную машину на другой хост:

<acropolis> vm.migrate test-passthrough host=10.10.10.11
----- test-passthrough -----
NotSupported: VM cannot be migrated: VM is a nested hypervisor.

Как я говорил выше – миграция машин со включенной опцией cpu_passthrough работать не будет.

Сделано это ограничение, очевидно, чтобы не оказаться в ситуации, когда миграция будет запланирована на хост с процессором не поддерживающим набор инструкций, который ожидает увидеть VM (не понятно только, почему нельзя проверять это и оставлять для миграции только доступные хосты).

Единственный вариант – отключить cpu_passthrough и затем перенести машину.

<acropolis> vm.off test-passthrough
<acropolis> vm.update test-passthrough cpu_passthrough=false
<acropolis> vm.on test-passthrough
<acropolis> vm.migrate test-passthrough host=10.10.10.11
test-passthrough: complete

В качестве заключения:

К использованию cpu_passthrough следует относиться осторожно и не включать без крайней необходимости. Ограничения в Live Migration могут в дальнейшем помешать процедурам обновления и обслуживания кластера.

Leave a Reply

Your email address will not be published. Required fields are marked *