溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

KVM虛擬化基本原理是什么呢

發(fā)布時間:2021-12-01 15:24:36 來源:億速云 閱讀:168 作者:柒染 欄目:云計算

KVM虛擬化基本原理是什么呢,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

X86 操作系統(tǒng)是設(shè)計在直接運行在裸硬件設(shè)備上的,因此它們自動認為它們完全占有計算機硬件。x86 架構(gòu)提供四個特權(quán)級別給操作系統(tǒng)和應(yīng)用程序來訪問硬件。 Ring 是指 CPU 的運行級別,Ring 0是最高級別,Ring1次之,Ring2更次之…… 就 Linux+x86 來說, 

  • 操作系統(tǒng)(內(nèi)核)需要直接訪問硬件和內(nèi)存,因此它的代碼需要運行在最高運行級別  Ring0上,這樣它可以使用特權(quán)指令,控制中斷、修改頁表、訪問設(shè)備等等。 

  • 應(yīng)用程序的代碼運行在最低運行級別上ring3上,不能做受控操作。如果要做,比如要訪問磁盤,寫文件,那就要通過執(zhí)行系統(tǒng)調(diào)用(函數(shù)),執(zhí)行系統(tǒng)調(diào)用的時候,CPU的運行級別會發(fā)生從ring3到ring0的切換,并跳轉(zhuǎn)到系統(tǒng)調(diào)用對應(yīng)的內(nèi)核代碼位置執(zhí)行,這樣內(nèi)核就為你完成了設(shè)備訪問,完成之后再從ring0返回ring3。這個過程也稱作用戶態(tài)和內(nèi)核態(tài)的切換。

 KVM虛擬化基本原理是什么呢

那么,虛擬化在這里就遇到了一個難題,因為宿主操作系統(tǒng)是工作在 ring0 的,客戶操作系統(tǒng)就不能也在 ring0 了,但是它不知道這一點,以前執(zhí)行什么指令,現(xiàn)在還是執(zhí)行什么指令,但是沒有執(zhí)行權(quán)限是會出錯的。所以這時候虛擬機管理程序(VMM)需要避免這件事情發(fā)生。 虛機怎么通過 VMM 實現(xiàn) Guest CPU 對硬件的訪問,根據(jù)其原理不同有三種實現(xiàn)技術(shù):

1. 全虛擬化

2. 半虛擬化

3. 硬件輔助的虛擬化 

1.1 基于二進制翻譯的全虛擬化(Full Virtualization with Binary Translation)

KVM虛擬化基本原理是什么呢

1.2. 超虛擬化(或者半虛擬化/操作系統(tǒng)輔助虛擬化 Paravirtualization) 

  半虛擬化的思想就是,修改操作系統(tǒng)內(nèi)核,替換掉不能虛擬化的指令,通過超級調(diào)用(hypercall)直接和底層的虛擬化層hypervisor來通訊,hypervisor 同時也提供了超級調(diào)用接口來滿足其他關(guān)鍵內(nèi)核操作,比如內(nèi)存管理、中斷和時間保持。

  這種做法省去了全虛擬化中的捕獲和模擬,大大提高了效率。所以像XEN這種半虛擬化技術(shù),客戶機操作系統(tǒng)都是有一個專門的定制內(nèi)核版本,和x86、mips、arm這些內(nèi)核版本等價。這樣以來,就不會有捕獲異常、翻譯、模擬的過程了,性能損耗非常低。這就是XEN這種半虛擬化架構(gòu)的優(yōu)勢。這也是為什么XEN只支持虛擬化Linux,無法虛擬化windows原因,微軟不改代碼啊。

KVM虛擬化基本原理是什么呢

  而且兩種操作模式可以互相轉(zhuǎn)換。運行在 VMX root operation 模式下的 VMM 通過顯式調(diào)用 VMLAUNCH 或 VMRESUME 指令切換到 VMX non-root operation 模式,硬件自動加載 Guest OS 的上下文,于是 Guest OS 獲得運行,這種轉(zhuǎn)換稱為 VM entry。Guest OS 運行過程中遇到需要 VMM 處理的事件,例如外部中斷或缺頁異常,或者主動調(diào)用 VMCALL 指令調(diào)用 VMM 的服務(wù)的時候(與系統(tǒng)調(diào)用類似),硬件自動掛起 Guest OS,切換到 VMX root operation 模式,恢復(fù) VMM 的運行,這種轉(zhuǎn)換稱為 VM exit。VMX root operation 模式下軟件的行為與在沒有 VT-x 技術(shù)的處理器上的行為基本一致;而VMX non-root operation 模式則有很大不同,最主要的區(qū)別是此時運行某些指令或遇到某些事件時,發(fā)生 VM exit。

也就說,硬件這層就做了些區(qū)分,這樣全虛擬化下,那些靠“捕獲異常-翻譯-模擬”的實現(xiàn)就不需要了。而且CPU廠商,支持虛擬化的力度越來越大,靠硬件輔助的全虛擬化技術(shù)的性能逐漸逼近半虛擬化,再加上全虛擬化不需要修改客戶操作系統(tǒng)這一優(yōu)勢,全虛擬化技術(shù)應(yīng)該是未來的發(fā)展趨勢。

(1)一個 KVM 虛機即一個Linux qemu-kvm 進程,與其他 Linux 進程一樣被Linux 進程調(diào)度器調(diào)度。

(2)KVM 虛機包括虛擬內(nèi)存、虛擬CPU和虛機 I/O設(shè)備,其中,內(nèi)存和 CPU 的虛擬化由 KVM 內(nèi)核模塊負責(zé)實現(xiàn),I/O 設(shè)備的虛擬化由 QEMU 負責(zé)實現(xiàn)。

(3)KVM戶機系統(tǒng)的內(nèi)存是 qumu-kvm 進程的地址空間的一部分。

(4)KVM 虛機的 vCPU 作為 線程運行在 qemu-kvm 進程的上下文中。

支持虛擬化的 CPU 中都增加了新的功能。以 Intel VT 技術(shù)為例,它增加了兩種運行模式:VMX root 模式和 VMX nonroot 模式。通常來講,主機操作系統(tǒng)和 VMM 運行在 VMX root 模式中,客戶機操作系統(tǒng)及其應(yīng)用運行在 VMX nonroot 模式中。因為兩個模式都支持所有的 ring,因此,客戶機可以運行在它所需要的 ring 中(OS 運行在 ring 0 中,應(yīng)用運行在 ring 3 中),VMM 也運行在其需要的 ring 中 (對 KVM 來說,QEMU 運行在 ring 3,KVM 運行在 ring 0)。CPU 在兩種模式之間的切換稱為 VMX 切換。從 root mode 進入 nonroot mode,稱為 VM entry;從 nonroot mode 進入 root mode,稱為 VM exit??梢姡珻PU 受控制地在兩種模式之間切換,輪流執(zhí)行 VMM 代碼和 Guest OS 代碼。

  對 KVM 虛機來說,運行在 VMX Root Mode 下的 VMM 在需要執(zhí)行 Guest OS 指令時執(zhí)行 VMLAUNCH 指令將 CPU 轉(zhuǎn)換到 VMX non-root mode,開始執(zhí)行客戶機代碼,即 VM entry 過程;在 Guest OS 需要退出該 mode 時,CPU 自動切換到 VMX Root mode,即 VM exit 過程??梢?,KVM 客戶機代碼是受 VMM 控制直接運行在物理 CPU 上的。QEMU 只是通過 KVM 控制虛機的代碼被 CPU 執(zhí)行,但是它們本身并不執(zhí)行其代碼。也就是說,CPU 并沒有真正的被虛級化成虛擬的 CPU 給客戶機使用。

主機 Linux 將一個虛擬視作一個 QEMU 進程,該進程包括下面幾種線程:

  • I/O 線程用于管理模擬設(shè)備

  • vCPU 線程用于運行 Guest 代碼

  • 其它線程,比如處理 event loop,offloaded tasks 等的線程

在我的測試環(huán)境中(RedHata Linux 作 Hypervisor):

smp 設(shè)置的值線程數(shù)線程
48

1 個主線程(I/O 線程)、4 個 vCPU 線程、3 個其它線程

6101 個主線程(I/O 線程)、6 個 vCPU 線程、3 個其它線程
 

要將客戶機內(nèi)的線程調(diào)度到某個物理 CPU,需要經(jīng)歷兩個過程:

  1. 客戶機線程調(diào)度到客戶機物理CPU 即 KVM vCPU,該調(diào)度由客戶機操作系統(tǒng)負責(zé),每個客戶機操作系統(tǒng)的實現(xiàn)方式不同。在 KVM 上,vCPU 在客戶機系統(tǒng)看起來就像是物理 CPU,因此其調(diào)度方法也沒有什么不同。

  2. vCPU 線程調(diào)度到物理 CPU 即主機物理 CPU,該調(diào)度由 Hypervisor 即 Linux 負責(zé)。

    KVM 使用標(biāo)準的 Linux 進程調(diào)度方法來調(diào)度 vCPU 進程。Linux 系統(tǒng)中,線程和進程的區(qū)別是 進程有獨立的內(nèi)核空間,線程是代碼的執(zhí)行單位,也就是調(diào)度的基本單位。Linux 中,線程是就是輕量級的進程,也就是共享了部分資源(地址空間、文件句柄、信號量等等)的進程,所以線程也按照進程的調(diào)度方式來進行調(diào)度。

vCPU如何設(shè)置

我們來假設(shè)一個主機有 2 個socket,每個 socket 有 4 個core。主頻2.4G MHZ 那么一共可用的資源是 2*4*2.4G= 19.2G MHZ。假設(shè)主機上運行了三個VM,VM1和VM2設(shè)置為1socket*1core,VM3設(shè)置為1socket*2core。那么VM1和VM2分別有1個vCPU,而VM3有2個vCPU。假設(shè)其他設(shè)置為缺省設(shè)置。

那么三個VM獲得該主機CPU資源分配如下:VM1:25%; VM2:25%; VM3:50%

 假設(shè)運行在VM3上的應(yīng)用支持多線程,那么該應(yīng)用可以充分利用到所非配的CPU資源。2vCPU的設(shè)置是合適的。假設(shè)運行在VM3上的應(yīng)用不支持多線程,該應(yīng)用根本無法同時使用利用2個vCPU. 與此同時,VMkernal層的CPU Scheduler必須等待物理層中兩個空閑的pCPU,才開始資源調(diào)配來滿足2個vCPU的需要。在僅有2vCPU的情況下,對該VM的性能不會有太大負面影響。但如果分配4vCPU或者更多,這種資源調(diào)度上的負擔(dān)有可能會對該VM上運行的應(yīng)用有很大負面影響。

確定 vCPU 數(shù)目的步驟。假如我們要創(chuàng)建一個VM,以下幾步可以幫助確定合適的vCPU數(shù)目

1 了解應(yīng)用并設(shè)置初始值

    該應(yīng)用是否是關(guān)鍵應(yīng)用,是否有Service Level Agreement。一定要對運行在虛擬機上的應(yīng)用是否支持多線程深入了解。咨詢應(yīng)用的提供商是否支持多線程和SMP(Symmetricmulti-processing)。參考該應(yīng)用在物理服務(wù)器上運行時所需要的CPU個數(shù)。如果沒有參照信息,可設(shè)置1vCPU作為初始值,然后密切觀測資源使用情況。

2 觀測資源使用情況

    確定一個時間段,觀測該虛擬機的資源使用情況。時間段取決于應(yīng)用的特點和要求,可以是數(shù)天,甚至數(shù)周。不僅觀測該VM的CPU使用率,而且觀測在操作系統(tǒng)內(nèi)該應(yīng)用對CPU的占用率。特別要區(qū)分CPU使用率平均值和CPU使用率峰值。

     假如分配有4個vCPU,如果在該VM上的應(yīng)用的CPU

  • 使用峰值等于25%, 也就是僅僅能最多使用25%的全部CPU資源,說明該應(yīng)用是單線程的,僅能夠使用一個vCPU (4 * 25% = 1 )

  • 平均值小于38%,而峰值小于45%,考慮減少 vCPU 數(shù)目

  • 平均值大于75%,而峰值大于90%,考慮增加 vCPU 數(shù)目

3 更改vCPU數(shù)目并觀測結(jié)果

每次的改動盡量少,如果可能需要4vCPU,先設(shè)置2vCPU在觀測性能是否可以接受。

KVM 實現(xiàn)客戶機內(nèi)存的方式是,利用mmap系統(tǒng)調(diào)用,在QEMU主線程的虛擬地址空間中申明一段連續(xù)的大小的空間用于客戶機物理內(nèi)存映射。

KVM虛擬化基本原理是什么呢

(2)合并后:

KVM虛擬化基本原理是什么呢

Intel 的 x86 CPU 通常使用4Kb內(nèi)存頁,當(dāng)是經(jīng)過配置,也能夠使用巨頁(huge page): (4MB on x86_32, 2MB on x86_64 and x86_32 PAE)

使用巨頁,KVM的虛擬機的頁表將使用更少的內(nèi)存,并且將提高CPU的效率。最高情況下,可以提高20%的效率!

大頁面和透明大頁面(THP)

x86 CPU 通常會在 4kB 頁面中處理內(nèi)存,但可以使用更大的 2MB 或 1GB 頁面,即 huge page(大頁面)。大頁面內(nèi)存可以支持 KVM 客機部署,通過增加點擊轉(zhuǎn)換后備緩沖器(TLB)的 CPU 緩存以改善性能。

kernel 功能將在 Red Hat Enterprise Linux 7 中默認啟用,大頁面可以大幅提高性能,尤其是對于較大的內(nèi)存和內(nèi)存密集型的負載。Red Hat Enterprise Linux 7 可以通過使用大頁面增加頁面大小,以便有效管理大量內(nèi)存。

過程 7.1. 為客機啟用 1GB 大頁面

  1. Red Hat Enterprise Linux 7.1 系統(tǒng)支持 2MB 或 1GB 大頁面,分配將在啟動或運行時進行。頁面大小均可以在運行時被釋放。例如,在啟動時分配 4 個 1GB 的大頁面和 1,024 個 2MB 的大頁面,請使用以下命令行:

    'default_hugepagesz=1G hugepagesz=1G hugepages=4 hugepagesz=2M hugepages=1024'


    此外,大頁面還可以在運行時分配。運行時分配允許系統(tǒng)管理員選擇從何種 NUMA 模式分配頁面。然而由于內(nèi)存碎片的存在,運行時的頁面分配會比啟動時分配更容易造成分配失敗。以下運行時的分配示例顯示了從 node1 分配 4 個 1GB 的大頁面以及從 node3 分配 1,024 個 2MB 的大頁面:

    # echo 4 > /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages
    # echo 1024 > /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages


  2. 接下來,將 2MB 和 1GB 的大頁面掛載到主機:

    # mkdir /dev/hugepages1G
    # mount -t hugetlbfs -o pagesize=1G none /dev/hugepages1G
    # mkdir /dev/hugepages2M
    # mount -t hugetlbfs -o pagesize=2M none /dev/hugepages2M


默認1GB 大頁面現(xiàn)在對客機不可用。客戶機中要想使用1G大內(nèi)存頁,需要如下配置:

在以下示例中,客機 NUMA 節(jié)點 0-5(不包括 NUMA 節(jié)點 4)將會使用 1 GB 的大頁面,客機 NUMA 節(jié)點 4 將使用 2 MB 的大頁面,無論客機 NUMA 節(jié)點在主機的任何位置。

<memoryBacking>
        <hugepages/>
          <page size="1"> 透明大頁面(THP,transparent huge page)將為性能自動優(yōu)化系統(tǒng)設(shè)置。通過允許所有的空余內(nèi)存被用作緩存以提高性能。一旦 /sys/kernel/mm/transparent_hugepage/enabled 被設(shè)置為 always,透明大頁面將被默認使用。運行以下命令禁用透明大頁面:# echo never > /sys/kernel/mm/transparent_hugepage/enabled 透明大頁面支持不能阻止 hugetlbfs 的使用。但在 hugetlbfs 未使用時,KVM 將使用透明大頁面來替代常規(guī)的 4KB 頁面大小 例子:使用方法,需要三部:mkdir /dev/hugepages mount -t hugetlbfs hugetlbfs /dev/hugepages #保留一些內(nèi)存給巨頁
sysctl vm.nr_hugepages=2048 (使用 x86_64 系統(tǒng)時,這相當(dāng)于從物理內(nèi)存中保留了2048 x 2M = 4GB 的空間來給虛擬機使用) #給 kvm 傳遞參數(shù) hugepages
qemu-kvm - qemu-kvm -mem-path /dev/hugepages 也可以在配置文件里加入:<memoryBacking>
<hugepages/>
</memoryBacking> 驗證方式,當(dāng)虛擬機正常啟動以后,在物理機里查看:cat /proc/meminfo |grep -i hugepages

看完上述內(nèi)容,你們掌握KVM虛擬化基本原理是什么呢的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

kvm
AI