1. 程式人生 > >Libvirt支援的三種CPU模式與熱遷移(by Joshua)

Libvirt支援的三種CPU模式與熱遷移(by Joshua)

版權宣告:可以任意轉載,轉載時請務必以超連結形式標明文章原始出處和作者資訊及本版權宣告 (作者:張華 發表於:2018-03-09)

問題

原始的nova配置(cpu_mode=”host-passthrough”)導致無法熱遷移,改成(cpu_mode=”custom”, cpu_model=”kvm64”)之後解決了熱遷移問題但是巢狀虛擬化又不好便了,接著又改成(cpu_mode=’host-model’)但熱遷移仍然失敗。有兩全其美的方法嗎?

解決辦法

1, working solution was to create a custom CPU definition in /usr/share/libvirt/cpu_map.xml called SandyBridge-vmx, which contained the full feature flags for that CPU, not just the subset that differs from Westmere/etc., and includes the needed 'vmx' feature for nested kvm
<model
name='SandyBridge-vmx'>
<vendor name='Intel'/> <feature name='aes'/> <feature name='apic'/> <feature name='avx'/> <feature name='clflush'/> <feature name='cmov'/> <feature name='cx16'/> <feature name='cx8'/> <feature name='de'/> <feature name='fpu'
/>
<feature name='fxsr'/> <feature name='lahf_lm'/> <feature name='lm'/> <feature name='mca'/> <feature name='mce'/> <feature name='mmx'/> <feature name='msr'/> <feature name='mtrr'/> <feature name='nx'/> <feature name='pae'/> <feature name='pat'
/>
<feature name='pclmuldq'/> <feature name='pge'/> <feature name='pni'/> <feature name='popcnt'/> <feature name='pse'/> <feature name='pse36'/> <feature name='rdtscp'/> <feature name='sep'/> <feature name='sse'/> <feature name='sse2'/> <feature name='sse4.1'/> <feature name='sse4.2'/> <feature name='ssse3'/> <feature name='syscall'/> <feature name='tsc'/> <feature name='tsc-deadline'/> <feature name='x2apic'/> <feature name='xsave'/> <feature name='vmx'/> </model> 2, And in /etc/nova/nova.conf, we use: $ sudo grep ^cpu_m /etc/nova/nova.conf cpu_mode = custom cpu_model = SandyBridge-vmx

理論

Libvirt主要支援三種 CPU mode:

  1. host-passthrough: libvirt 令 KVM 把宿主機的 CPU 指令集全部透傳給虛擬機器。因此虛擬機器能夠最大限度的使用宿主機 CPU 指令集,故效能是最好的。但是在熱遷移時,它要求目的節點的 CPU 和源節點的一致。
  2. host-model: libvirt 根據當前宿主機 CPU 指令集從配置檔案 /usr/share/libvirt/cpu_map.xml 選擇一種最相配的 CPU 型號。在這種 mode 下,虛擬機器的指令集往往比宿主機少,效能相對 host-passthrough 要差一點,但是熱遷移時,它允許目的節點 CPU 和源節點的存在一定的差異。
  3. custom: 這種模式下虛擬機器 CPU 指令集數最少,故效能相對最差,但是它在熱遷移時跨不同型號 CPU 的能力最強。此外,custom 模式下支援使用者新增額外的指令集。
  4. 三種mode的效能排序是:host-passthrough > host-model > custom
  5. 三種mode的熱遷移通用性是: custom > host-model > host-passthrough

實際環境中多采用Intel E5系列的CPU,但是該系列的CPU也有多種型號,常見的有Xeon,Haswell,IvyBridge,SandyBridge等等。即使是host-model,在這些不同型號的CPU之間熱遷移虛擬機器也可能失敗。所以從熱遷移的角度,在選擇 host-mode時:

  • 需要充分考慮既有宿主機型別,以後採購擴容時,也需要考慮相同問題
  • 除非不存在熱遷移的場景,否則不應用選擇host-passthrough
  • host-model下不同型號的 CPU 最好能以aggregate hosts劃分,在遷移時可以使用aggregate filter來匹配相同型號的物理機
openstack aggregate create Broadwell
openstack aggregate create Haswell
openstack aggregate set --property cpu=broadwell Broadwell
openstack aggregate set --property cpu=haswell Haswell
opentack aggregate add host <host1> Haswell
openstack flavor set --property aggregate_instance_extra_specs:cpu=broadwell <flavor1>
openstack flavor set --property aggregate_instance_extra_specs:cpu=haswell <flavor2>
  • 如果CPU型號過多,且不便用aggregate hosts劃分,建議使用custom mode

Reference

其他 - 虛機為什麼慢

虛機使用”stress-ng -c 1 –cpu-ops 2500”測試時慢, 原因是Spectre v2導致, 禁用它, OK.

<cpu mode='host-model'> 
<model fallback='allow'/> 
<topology sockets='1' cores='1' threads='1'/> 
<feature policy='disable' name='spec-ctrl'/> 
</cpu> 

<cpu mode='custom' match='exact' check='partial'>
<model fallback='allow'>Broadwell-IBRS</model>
<feature policy='disable' name='spec-ctrl'/> 
</cpu>

備用連結

https://zhhuabj.github.io/2018/03/09/Libvirt%E6%94%AF%E6%8C%81%E7%9A%84%E4%B8%89%E7%A7%8DCPU%E6%A8%A1%E5%BC%8F%E4%B8%8E%E7%83%AD%E8%BF%81%E7%A7%BB-by-Joshua/