每天5分鐘復習OpenStack(五)CPU虛擬化

    KVM 虛擬化之CPU

    虛擬化存在是為了更高效的利用物理機的資源,而虛擬機技術主要是針對三大組件,分別是CPU虛擬化、存儲虛擬化、網絡虛擬化。下面我們分別介紹下三大組件的常用知識。

    CPU 虛擬化

    1.1 CPU虛擬化支持

    KVM 的虛擬化是需要 CPU 硬件支持的。還記得我們在前面的章節講過用命令來查看 CPU
    是否支持KVM虛擬化嗎?

    lscpu |grep -E "(vmx|svm)"
    

    如果有輸出,則證明CPU支持了虛擬化?大部分文檔上都是這么教的,事實的如此嗎?

    其實該命令僅僅限于Intel 和AMD 廠商,這里拿鯤鵬920系列的CPU來舉例

    可以看到這里其實是沒有輸出的,也就證明了上述命令僅僅是針對Inter 和AMD的廠商。
    那鯤鵬是怎么查看是否支持CPU的虛擬化了?
    dmesg |grep kvm

    簡單查看是否支持虛擬化:

    此時的VHE就代表支持CPU虛擬化了

    注:VHE(Virtualization Host Extension support)是armv8.1的新特性,支持type-2的hypervisors這種擴展讓kernel直接跑在el2上。

    可見廠商不一樣,CPU虛擬化的查看方式是不一樣的。

    1.2 cpu 模型

    前面我們了解到使用virsh dumpxml 可以查看虛擬機的詳細的配置信息,

    vcpu標簽,表示客戶機中vCPU的個數,這里為1
    <vcpu placement='static'>1</vcpu
    
    • features標簽,表示Hypervisor為客戶機打開或關閉CPU或其他硬件的特性,這里打開了ACPI、APIC等特性
    • CPU的基礎特性是在cpu標簽中定義的,這里是之前創建客戶機時,libvirt自動檢測了CPU硬件平臺,默認使用了Broadwell-IBRS的CPU給客戶機,Broadwell-IBRS 就是虛擬機的模型。
      下面就是一些常用的模型

    為什么需要模型,模型是干什么用的?

    對于CPU模型的配置,有以下3種模式。

    1. custom模式:就是這里示例中表示的,基于某個基礎的CPU模型,再做個性化的設置。

    2. host-model模式 :根據物理CPU的特性,選擇一個與之最接近的標準CPU型號,如果沒有指定CPU模式,默認也是使用這種模式。xml配置文件為:

    <cpu mode='host-model'/>
    
    1. host-passthrough模式 :直接將物理CPU特性暴露給虛擬機使用,在虛擬機上看到的完全就是物理CPU的型號。xml配置文件為:
    <cpu mode='host-passthrough'/>
    

    默認上面的例子種使用的就是 custom模式,而且在生產環境中大部分的kvm 虛擬化都是這種模式。
    而上面的例子中kvm 使用的模型是Broadwell-IBRS ,該模型在 /usr/share/libvirt/cpu_map.xml 文件中有詳細的描述?;谏鲜瞿P偷奶匦?,我們個性化的開啟和關閉了某些特性

      <cpu mode='custom' match='exact' check='full'>
        <model fallback='forbid'>Broadwell-IBRS</model>
        <feature policy='require' name='md-clear'/>
        <feature policy='require' name='ssbd'/>
        <feature policy='disable' name='hle'/>
        <feature policy='disable' name='rtm'/>
        <feature policy='require' name='spec-ctrl'/>
        <feature policy='require' name='hypervisor'/>
        <feature policy='disable' name='erms'/>
        <feature policy='require' name='xsaveopt'/>
      </cpu>
    

    require 則是開啟了特性,disable 則是關閉了特性。通過對xml 的編輯可以自定義開啟和關閉某些特性。

    為什么要這么做?
    我們想象一下這個場景,在一個大型的kvm虛擬化環境中,CPU的型號是否完全都是一樣的?如果不一樣,那么不同型號的CPU上運行的kvm虛擬機,是否有遷移的需求了?

    答案是肯定的,如果我們選擇host-passthrough模式 ,則虛擬機在不同型號的CPU遷移時肯定是會報錯的。有人就要問了,那我使用host-model不就行了,為什么要custom 了?,CPU型號一致,是否其flag就完全一致了? 答案也是否定的,相同的型號不同的BIOS設置,也會造成cpu的 flag 不一樣。因此大多數的場景KVM 虛擬機默認都是custom ,通過自定義開啟和關閉某些特征,來保證虛擬機在不同類型CPU上能正常遷移。

    實戰

    下面借用我在實際生產過程中踩過坑例子來說明

    下面是nova-compute的報錯日志顯示遷移失敗

    對比cpu的型號發現其完全一致

    下面是flag 對比,發現BIOS開啟了monitor、等功能 造成虛擬機的遷移失敗。

    解決方式:

    1. 關閉物理機,在BIOS頁面關閉一些特性開關,使其flag的標記位一致。
    2. 在遷移過程中,關閉flag 檢查匹配,只檢查基礎flag 。

    [擴展] 在實際的生產環境為了保證穩定行,在不同型號的CPU上,建議是先查看兼容性,如果是支持向下兼容的情況下,可以將虛擬機,在不同型號CPU上進行遷移。

    兼容性判斷

    假如要判斷主機A上的虛擬機向主機B上遷移是否兼容
    判斷步驟
    1、在主機A上獲取 虛擬機使用的cpu features

    virsh domcapabilities > domA.caps
    

    2、 將domA.caps拷貝到主機B上,在主機B上執行如下命令,判斷是否兼容。如果命令行執行結果如下,則表示主機B兼容主機A,主機A上的虛擬機可以遷移到主機B上。

    virsh hypervisor-cpu-compare --error domA.caps
    #CPU described in domA.caps is identical to the CPU provided by hypervisor on the host
    

    如果命令行執行結果如下,則表示主機B不兼容主機A,主機A上的虛擬機不可以遷移到主機B上。

    virsh hypervisor-cpu-compare --error domA.caps
    error: Failed to compare hypervisor CPU with domA.caps
    error: the CPU is incompatible with host CPU: 主機 CPU 不提供所需功能: vmx, pdcm, invtsc
    

    posted @ 2023-10-17 14:30  ALEX_li88  閱讀(102)  評論(0編輯  收藏  舉報
    正能量网站你懂我意思下载,欧美亚洲综合视频,97国产超碰,久在线中文欧美