博客 / 詳情

返回

KVM虛擬化系統解決方案(二)--QEMU/KVM的高級功能和用法

【寫在前面】飛騰開發者平台是基於飛騰自身強大的技術基礎和開放能力,聚合行業內優秀資源而打造的。該平台覆蓋了操作系統、算法、數據庫、安全、平台工具、虛擬化、存儲、網絡、固件等多個前沿技術領域,包含了應用使能套件、軟件倉庫、軟件支持、軟件適配認證四大板塊,旨在共享尖端技術,為開發者提供一個涵蓋多領域的開發平台和工具套件。點擊這裏開始你的技術升級之旅吧

image.png

本文分享至飛騰開發者平台《FT-2000+/64 KVM虛擬化系統解決方案--QEMU/KVM的高級功能和用法》

1 介紹

  本文主要以基於arm平台的FT-2000+/64服務器為例介紹qemu/kvm的高級功能和用法。

2 半虛擬化驅動

  在之前的文檔中《FT-2000+/64KVM虛擬化系統解決方案--虛擬化介紹v1.03》我們對半虛擬化有過簡單的介紹,其中virtio技術是最成熟、最廣泛的應用。在既要考慮性能又要考慮可遷移性的情況下,使用virtio無疑是一個很好的選擇。

2.1 virtio基本原理介紹

  virtio最初是由澳大利亞的一個天才程序員Rusty Russell編寫,是一個在Hypervisor之上的抽象API接口,讓客户機知道自己運行在虛擬化環境中,進而根據virtio標準與Hypervisor協作,從而在客户機中達到更好的性能(特別是I/O性能)。目前有很多虛擬機都使用了virtio半虛擬化驅動來提高性能。
  在QEMU/KVM中,virtio的基本結構如下圖所示:

image.png

  關於virtio的具體功能以及實現請參考如下鏈接:https://hhdx.xyz/post/virtio-intro/

2.2 virtio驅動的具體使用

  在《FT-2000+/64KVM虛擬化系統解決方案--KVM虛擬化v1.03》文檔裏面的虛擬化內核配置章節,我們已經有説明,宿主機內核必須要支持相關的virtio驅動才可以在QEMU/KVM框架中使用。下面我們將一一列舉一些常見的可以使用virtio來提高性能的設備。參考地址:https://hhb584520.github.io/kvm_blog/2017/02/17/kvm-virtio.html。

  1) virtio-scsi

  下面是scsi設備使用virtio方式,在libvirt域的配置文件示例:

<controller type='scsi' index='0' model='virtio-scsi'>
    <address type='pci' domain='0x0000' bus='0x03' slot='0x00'function='0x0'/>
</controller>

  2) virtio-net

  下面是網卡設備使用virtio方式,在libvirt域的配置文件示例:

<interface type='bridge'>
    <mac address='52:54:00:3e:ea:a6'/>
    <source bridge='br0'/>
    <model type='virtio'/>
    <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>

  3) virtio-gpu

  下面是顯卡設備使用virtio方式,在libvirt域的配置文件示例:

<video>
    <model type='virtio' heads='1' primary='yes'/>
    <address type='pci' domain='0x0000' bus='0x05' slot='0x00'function='0x0'/>
</video>

  4) virtio-ballon

  下面是mem-balloon使用virtio方式,在libvirt域的配置文件示例:

<memballoon model='virtio'>
    <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</memballoon>

  以上幾個就是主要需要使用virtio的地方,更詳細的用法可以查閲libvirt官方文檔。

  在客户機系統中lspci查看,可以看到virtio設備如下,帶有virtio的就是virtio設備:

image.png

3 內存氣球mem-balloon

  KVM的內存氣球技術使得可以在虛擬機中按照需要調整的內存大小,提升內存的利用率。參考地址:https://www.jianshu.com/p/ce746f327424。

image.png

3.1KVM中ballooning的優劣勢

  KVM中的ballooning在節約和靈活分配內存方面有着明顯的優勢,主要有以下三點:

  1) 節約內存

  2) ballooning對內存的調節很靈活,既可以精細地請求少量內存,也可以粗獷滴請求大量內存。

  3) Hypervisor使用ballooning讓客户機歸還部分內存,從而緩解其內存壓力。而且從氣球中回收的內存也不要求一定要分配給另外的進程。

  另一方面,kvm中ballooning使用不方便,不完善也是存在的:

  1) ballooning需要客户機操作系統加載virtio-balloon驅動。

  2) 如果有大量內存需要從客户機系統中回收,那麼ballooning可能會降低客户機的操作系統性能。

  一方面,內存的減少可能會讓客户機中作為磁盤數據緩存的內存放到氣球中,從而使客户機的磁盤IO訪問增加;另一方面,如果機制處理的不好,也可能讓客户機中正在運行的進程由於內存不足而執行失敗。

  3) 目前還沒有比較自動化、方便的機制來管理ballooning。

  沒有對客户機的有效監控,這可能會不便於在生產環境中大規模自動化部署。

  4) 內存的動態增加或者減少可能會使內存過度碎片化,從而降低內存使用時的性能。另外內存的變化會影響客户機內核對內存的優化。

3.2 ballooning的使用

  在上面virtio驅動章節中,我們介紹了域的libvirt配置文件中關於virtio-memballoon的修改。在做了這一步操作後其實就可以直接使用了。

  查看域的配置文件,客户機中最大內存為4194304KB,也就是4GB。

  下面演示如圖:

image.png

  可以看到客户機中內存:

image.png

  使用setmem命令設置內存,注意這個內存的值只能小於或等於最大內存值。

image.png

  可以看到客户機中內存已經變小了,這時釋放出來的內存又可以被宿主機中其他進程使用了。

4 vhost和 vhost-user

4.1 核態的vhost-net後端以及網卡多隊列

  virtio-net的後端處理程序可以提高網絡吞吐量和降低網絡延遲。

  要想內核支持vhost-net,需要在內核配置中選上相關配置:

image.png

  在虛擬化配置中選上virtio net的支持、virtio-vsock支持以及要想在arm上使用選上cross-endian支持。

  在使用libvirt管理虛擬機時,網絡中的vhost是默認打開的。我們可以用命令查看如下:

image.png

  我們可以看到有一個vhost後端線程正在運行,我們在沒有配置的情況下只有一個vhost隊列用於收發客户機的數據包。其中vhost-2693中的2693是前面啓動客户機的QEMU進程ID。

  假如我們想更改vhost的收發隊列數,可以進行如下操作,修改域的配置文件:

image.png

  只需要添加vhost一行,設置隊列數即可。再次查看,我們可以發下vhost隊列數變為2了,這表明有兩個vhost後端線程在處理客户機網絡數據。

image.png

  進入客户機中,可以用ethtool查看隊列數,可以看到當前虛擬eth0使用的是2個隊列:

image.png

  一般來説,使用vhost-net作為後端處理驅動可以提高網絡性能。不過,對於一些使用vhost-net作為後端的網絡負載類型,可能使其性能不升反降。特別是從宿主機到其客户機之間的UDP流量,如果客户機處理接收數據速度比宿主機發送數據要慢,這時就容易出現性能下降。在這種情況下,使用vhost-net會使UDP的接收緩衝區數據更快地溢出,從而導致更多的數據包丟失。這時我們需要手動在配置文件中關閉vhost,指定後端驅動名稱為"qemu"而不是"vhost"。

image.png

  可以看到已經沒有vhost線程了。

image.png

4.2 用户態的vhost-user作為後端驅動

  vhost-user可以用來解決採用 vhost 的方案時guest 和 host 之間又存在多次的上下文切換和數據拷貝的問題,為了避免這種情況,業界就想出將 vhost 從內核態移到用户態。這就是 vhost-user 的實現。參考地址:https://blog.csdn.net/qq_15437629/article/details/81226901。

5 進程的處理器親和性和vCPU的綁定

  進程的處理器親和性(Processor Affinity),即是 CPU 的綁定設置,是指將進程綁定到特定的一個或多個 CPU上去執行,而不允許調度到其他的 CPU 上。設置進程的處理器親和性帶來的好處是可以減少進程在多個 CPU 之間交換運行帶來的緩存命中失效(cache missing),從該進程運行的角度來看,可能帶來一定程度上的性能提升。換個角度來看,對進程親和性的設置也可能帶來一定的問題,如破壞了原有 SMP 系統中各個 CPU 的負載均衡(load balance),這可能會導致整個系統的進程調度變得低效。儘管 Linux 內核的進程調度算法已經非常高效了,在多數情況下不需要對進程的調度進行干預,不過,在虛擬化環境中有時卻有必要對客户機的 QEMU 進程或線程綁定到固定的邏輯 CPU 上。在libvirt域xml配置中,我們已經簡單介紹怎樣配置vcpu的綁定,下面是在libvirt域中設置cpu綁定的例子,參考地址:https://z.itpub.net/article/detail/442A7C85D11718C195851FBDAF036E4。

image.png

  將vcpu 0\~3分別綁定到宿主機中cpu 4\~7上。

  在宿主機中查看,top -H後,按f鍵,然後選擇Last Used Cpu和Number of Threads,退出,就可以看到正在運行的線程所佔的CPU了。

image.png

  其中CPU 0/KVM就是vCPU0線程,可以看到P那一項,一直都是4,説明vCPU0線程已經綁定了CPU4,一直在CPU4上運行,其他幾個CPU 1/KVM、CPU 2/KVM、CPU 3/KVM也可以看出分別一直綁定在CPU 5 、6、7上。

  總的來説,在KVM環境中,一般不推薦手動設置QEMU進程的處理器親和性來綁定vCPU,但是,在非常瞭解系統硬件架構的基礎上,根據實際應用需求,可以將其綁定在特定CPU上,從而提高客户機的CPU執行效率或者實現CPU資源獨享的隔離性。

6 設備的熱插拔

6.1 磁盤的熱插拔

  首先,需要説明的是,磁盤的熱插拔是指的虛擬磁盤文件的熱插拔,並非指宿主機上的物理磁盤添加到宿主中的熱插拔。

  磁盤的熱插拔可以用attach-disk和detach-disk進行熱插拔的添加和刪除。

  下面我們演示一下,我們先看kvm1中的域xml配置:

image.png

通過以下命令也可以看到只有一塊磁盤:

virsh domblklist kvm1

image.png

6.1.1 在線添加磁盤

  1) 創建一塊新的磁盤:

   qemu-img create -f qcow2 -o lazy_refcounts=on
   /var/lib/libvirt/images/kvm1_add.qcow2 30G

image.png

  2) 啓動虛擬機kvm1:

virsh start kvm1

  3) 進入kvm1客户機中,fdisk -l查看,可以看到只有一塊磁盤。

virsh console kvm1

  4) 退出到宿主機上,添加磁盤:

virsh attach-disk kvm1 /var/lib/libvirt/image/kvm1_add.qcow2 sdb --cache=none --subdriver=qcow2

  如果想永久添加磁盤或者永久刪除磁盤,可以再在後面添加--config即可。

image.png

  5) 再進入kvm1客户機中fdisk -l查看,可以看到已經成功添加了磁盤:

image.png

  這時我們就可以對/dev/sdb進行格式化分區和掛載了。

6.1.2 在線卸載磁盤

  1) 下面我們再進行在線卸載磁盤:

virsh detach-disk kvm1 sdb:

image.png

  2) 通過下面命令可以看到,已經成功卸載掉一塊磁盤了。

virsh domblklist kvm1

  我們可以進入客户機fdisk -l中進一步確認,可以看到/dev/sdb也成功卸載了。

6.2 網卡的熱插拔

  網卡的熱插拔是指,使用模擬的網卡熱插拔,非宿主機上的物理網卡透傳熱插拔。

  下面是我們驗證步驟:

image.png我們先查看kvm1的網卡。

virsh domiflist kvm1:

image.png

  可以看到只有一個虛擬網卡,橋接在br0上,進入客户機中ifconfig -a查看也只有一塊網卡:

image.png

6.2.1 在線添加網卡

  1) 添加網卡。

virsh attach-interface kvm1 --type bridge --source br0:

  2) 查看是否添加成功:

virsh domiflist kvm1

image.png

  可以看到已經新加了一個虛擬網卡vnet1。我們再進入客户機中查看,可以看到已經多一個網卡:

image.png

6.2.2 在線卸載網卡

  1) 下面我們進行卸載網卡操作:

virsh detach-interface kvm1 --type bridge --mac 52:54:00:6d:7b:a3

其中mac後面跟的mac地址是我們新加的網卡mac地址,virsh domiflist kvm1可以看到。

  2) virsh domiflist kvm1再次查看只有一個網卡了:

image.png

  進入客户機中ifconfig -a查看,同樣可以看到網卡已經卸載成功。

  如果想永久添加或者永久卸載網卡,在命令後面添加--config即可。


推薦閲讀

  • KVM虛擬化系統解決方案--KVM虛擬化(基於飛騰FT2000+/64)
  • 虛擬機遷移方案(基於飛騰FT-2000+/64服務器)

歡迎廣大開發者來飛騰開發者平台獲取更多前沿技術文檔及資料

如開發者在使用飛騰產品有任何問題可通過在線工單聯繫我們



版權所有。飛騰信息技術有限公司 2023。保留所有權利。

未經本公司同意,任何單位、公司或個人不得擅自複製,翻譯,摘抄本文檔內容的部分或全部,不得以任何方式或途徑進行傳播和宣傳。

商標聲明

Phytium和其他飛騰商標均為飛騰信息技術有限公司的商標。

本文檔提及的其他所有商標或註冊商標,由各自的所有人擁有。

注意

本文檔的內容視為飛騰的保密信息,您應當嚴格遵守保密任務;未經飛騰事先書面同意,您不得向任何第三方披露本文檔內容或提供給任何第三方使用。

由於產品版本升級或其他原因,本文檔內容會不定期進行更新。除非另有約定,本文檔僅作為使用指導,飛騰在現有技術的基礎上盡最大努力提供相應的介紹及操作指引,但飛騰在此明確聲明對本文檔內容的準確性、完整性、適用性、可靠性的等不作任何明示或暗示的保證。

本文檔中所有內容,包括但不限於圖片、架構設計、頁面佈局、文字描述,均由飛騰和/或其關聯公司依法擁有其知識產權,包括但不限於商標權、專利權、著作權等。非經飛騰和/或其關聯公司書面同意,任何人不得擅自使用、修改,複製上述內容。

user avatar u_15476544 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.