你建立的OpenStack高效能虛擬機器能實現“零損耗”麼?
使用預設引數建立的虛擬機器,虛擬機器的VCPU在物理CPU不同核心之間動態排程,另外,由於Linux還可能會將軟中斷,記憶體交換等程序排程到虛擬機器正在使用的物理核心上,這些因素導致這些虛擬機器相對於物理機的計算效能可能會產生較大的抖動,不能滿足一些對計算SLA要求很嚴格的業務,比如,很多金融業務就要求99.999%的請求處理時間延時不得高於1毫秒。
高效能虛擬機器
為了減少 Linux 和 Hypervisor 對虛擬機器的影響,讓虛擬機器的效能接近物理機,一般可以採用如下優化手段:
1.CPU 綁核(pin):將虛擬 CPU 和物理 CPU 逐一繫結起來,這樣不同虛擬機器的VCPU各自執行在不同的物理核心上,不會相互影響。
2.CPU隔離(isolate):將虛擬機器使用的物理 CPU 從 Linux 隔離出來,Linux Kernel 不再排程任何應用甚至是任何系統程序到這些 CPU 上,儘量讓這些CPU 100%為虛擬機器使用。
3.CPU拓撲(Topology): CPU 分配儘量不要跨 NUMA ,如果必須要跨NUMA,將 NUMA 拓撲結構呈現給 Guest OS ,同時也把 SMT 拓撲結構呈現給 Guest OS 。
OpenStack 環境
1.OpenStack Mitaka:Mitaka 現在執行的很好, 新版本的 Cell 機制甚至會導致一些不可預料的結果,我們一直沒有冒險去做升級投入。
2.CentOS 7.3:OpenStack Mitaka 在 CentOS 7.4 的 repo 裡面已經找不到了,應該是停止支援了,由於擔心一些不必要的包依賴問題,我們繼續使用 CentOS 7.3 。
3.QEMU: CentOS 7預設的qemu 1.5版本非常老,會導致compute節點的resource_tracker不能上報numa_topology到controller節點,導致NUMATopologyFilter無法排程,所以必須升級到2.6。
升級qemu到2.6
計算節點配置
使用numactl檢視下主機的numa拓撲結構,比如下面的輸出說明 cpu 0-3 在一個numa node上,而 cpu 4-7 在另一個 numa node 上:
numactl --hardware
比如,我們希望將2,3, 6,7隔離出來,專門給虛擬機器用,儘量讓Linux不要將任何使用者程序和系統程序排程到這些cpu上。
首先,編輯/etc/nova/nova.conf, 配置這臺主機能用來建立VM的cpu為2,3,6,7:
vcpu_pin_set=2,3,6,7
然後,編輯/boot/grub/grub.conf:
grub.conf
1.isolcpus:不要將任何應用和系統程序(softirq, swap.……)排程到指定的CPU上;
2.nohzfull: 指定的CPU上沒有時鐘中斷;
3.rcunocbs:不要在指定的CPU上排程執行rcb callbacks;
最後,重啟主機生效。
控制節點配置
修改/etc/nova/nova.conf, 將排程過濾器NUMATopologyFilter加入到scheduler_default_filters:
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,CoreFilter,NUMATopologyFilter
然後,重啟nova-scheduler服務
systemctl restart openstack-nova-scheduler.service
建立支援cpu pin的flavor:
openstack flavor set m1.large --property hw:cpu_policy=dedicated --property hw:cpu_thread_policy=require
CPU-POLICY :
1.shared: (預設)VCPU會在PCPU上任意漂移;
2.dedicated: VCPU會繫結在指定的PCPU上;
3.CPU-THREAD-POLICY :
4.prefer: (預設) VCPU會優先選擇同一核心上的超執行緒。
5.isolate: VCPU會選用不同核心的超執行緒。
6.require: VCPU優先選擇同一核心上的超執行緒,如果主機的BIOS超執行緒沒有開啟,就會報告失敗。
除了hw:cpu_policy和hw:cpu_thread_policy,這裡還可以定義hw:numa_nodes,hw:numa_cpus.N,hw:numa_mem.N等NUMA策略。
用指定的flavor建立虛擬機器:
openstack server create --image cirros --nic net-id=provider-net --flavor m1.large instance-001
驗證
在計算節點上使用virsh dumpxml domID觀察虛擬機器,輸出的xml應該包括類似下面的內容:
virsh dumpxml