深入淺出KVM(三) 丨 I/O 全虛擬化和準(zhǔn)虛擬化

在 QEMU/KVM 中坛猪,客戶機(jī)可以使用的設(shè)備大致可分為三類(lèi):

1. 模擬設(shè)備:完全由 QEMU 純軟件模擬的設(shè)備奈应。

2. Virtio 設(shè)備:實(shí)現(xiàn) VIRTIO API 的半虛擬化設(shè)備舆逃。

3. PCI 設(shè)備直接分配 (PCI device assignment) 重斑。

1. 全虛擬化 I/O 設(shè)備

KVM 在 IO 虛擬化方面慎框,傳統(tǒng)或者默認(rèn)的方式是使用 QEMU 純軟件的方式來(lái)模擬 I/O 設(shè)備膜毁,包括鍵盤(pán)、鼠標(biāo)张足、顯示器触创,硬盤(pán) 和 網(wǎng)卡 等。模擬設(shè)備可能會(huì)使用物理的設(shè)備为牍,或者使用純軟件來(lái)模擬哼绑。模擬設(shè)備只存在于軟件中。

1.1 原理

過(guò)程:

  1. 客戶機(jī)的設(shè)備驅(qū)動(dòng)程序發(fā)起 I/O 請(qǐng)求操作請(qǐng)求

  2. KVM 模塊中的 I/O 操作捕獲代碼攔截這次 I/O 請(qǐng)求

  3. 經(jīng)過(guò)處理后將本次 I/O 請(qǐng)求的信息放到 I/O 共享頁(yè) (sharing page)碉咆,并通知用戶空間的 QEMU 程序抖韩。

  4. QEMU 程序獲得 I/O 操作的具體信息之后,交由硬件模擬代碼來(lái)模擬出本次 I/O 操作疫铜。

  5. 完成之后茂浮,QEMU 將結(jié)果放回 I/O 共享頁(yè),并通知 KMV 模塊中的 I/O 操作捕獲代碼块攒。

  6. KVM 模塊的捕獲代碼讀取 I/O 共享頁(yè)中的操作結(jié)果励稳,并把結(jié)果放回客戶機(jī)。

注意:當(dāng)客戶機(jī)通過(guò)DMA (Direct Memory Access)訪問(wèn)大塊I/O時(shí)囱井,QEMU 模擬程序?qū)⒉粫?huì)把結(jié)果放進(jìn)共享頁(yè)中,而是通過(guò)內(nèi)存映射的方式將結(jié)果直接寫(xiě)到客戶機(jī)的內(nèi)存中共趣避,然后通知KVM模塊告訴客戶機(jī)DMA操作已經(jīng)完成庞呕。

這種方式的優(yōu)點(diǎn)是可以模擬出各種各樣的硬件設(shè)備;其缺點(diǎn)是每次 I/O 操作的路徑比較長(zhǎng),需要多次上下文切換住练,也需要多次數(shù)據(jù)復(fù)制地啰,所以性能較差。

1.2 QEMU 模擬網(wǎng)卡的實(shí)現(xiàn)

Qemu 純軟件的方式來(lái)模擬I/O設(shè)備讲逛,其中包括經(jīng)常使用的網(wǎng)卡設(shè)備亏吝。Guest OS啟動(dòng)命令中沒(méi)有傳入的網(wǎng)絡(luò)配置時(shí),QEMU默認(rèn)分配 rtl8139 類(lèi)型的虛擬網(wǎng)卡類(lèi)型盏混,使用的是默認(rèn)用戶配置模式蔚鸥,這時(shí)候由于沒(méi)有具體的網(wǎng)絡(luò)模式的配置,Guest的網(wǎng)絡(luò)功能是有限的许赃。 全虛擬化情況下止喷,KVM虛機(jī)可以選擇的網(wǎng)絡(luò)模式包括:

  1. 默認(rèn)用戶模式(User);

  2. 基于網(wǎng)橋(Bridge)的模式混聊;

  3. 基于NAT(Network Address Translation)的模式弹谁;

分別使用的 qemu-kvm 參數(shù)為:

  • -net user[,vlan=n]:使用用戶模式網(wǎng)絡(luò)堆棧,這樣就不需要管理員權(quán)限來(lái)運(yùn)行.如果沒(méi)有指 定-net選項(xiàng),這將是默認(rèn)的情況.-net tap[,vlan=n][,fd=h]

  • -net nic[,vlan=n][,macaddr=addr]:創(chuàng)建一個(gè)新的網(wǎng)卡并與VLAN n(在默認(rèn)的情況下n=0)進(jìn)行連接。作為可選項(xiàng)的項(xiàng)目,MAC地址可以進(jìn)行改變.如果 沒(méi)有指定-net選項(xiàng),則會(huì)創(chuàng)建一個(gè)單一的NIC.

  • -net tap[,vlan=n][,fd=h][,ifname=name][,script=file]:將TAP網(wǎng)絡(luò)接口 name 與 VLAN n 進(jìn)行連接,并使用網(wǎng)絡(luò)配置腳本文件進(jìn)行 配置句喜。默認(rèn)的網(wǎng)絡(luò)配置腳本為/etc/qemu-ifup预愤。如果沒(méi)有指定name,OS 將會(huì)自動(dòng)指定一個(gè)。fd=h可以用來(lái)指定一個(gè)已經(jīng)打開(kāi)的TAP主機(jī)接口的句柄咳胃。

網(wǎng)橋模式是目前比較簡(jiǎn)單植康,也是用的比較多的模式,下圖是網(wǎng)橋模式下的 VM的收發(fā)包的流程拙绊。

如圖中所示向图,紅色箭頭表示數(shù)據(jù)報(bào)文的入方向,步驟:

  1. 網(wǎng)絡(luò)數(shù)據(jù)從 Host 上的物理網(wǎng)卡接收标沪,到達(dá)網(wǎng)橋榄攀;

  2. 由于 eth0 與 tap1 均加入網(wǎng)橋中,根據(jù)二層轉(zhuǎn)發(fā)原則金句,br0 將數(shù)據(jù)從 tap1 口轉(zhuǎn)發(fā)出去檩赢,即數(shù)據(jù)由 Tap設(shè)備接收;

  3. Tap 設(shè)備通知對(duì)應(yīng)的 fd 數(shù)據(jù)可讀违寞;

  4. fd 的讀動(dòng)作通過(guò) tap 設(shè)備的字符設(shè)備驅(qū)動(dòng)將數(shù)據(jù)拷貝到用戶空間贞瞒,完成數(shù)據(jù)報(bào)文的前端接收。

(引用自 http://luoye.me/2014/07/17/netdev-virtual-1/

1.3 RedHat Linux 6 中提供的模擬設(shè)備

  • 模擬顯卡:提供2塊模擬顯卡趁曼。

  • 系統(tǒng)組件:

  • ntel i440FX host PCI bridge

  • PIIX3 PCI to ISA bridge

  • PS/2 mouse and keyboard

  • EvTouch USB Graphics Tablet

  • PCI UHCI USB controller and a virtualized USB hub

  • Emulated serial ports

  • EHCI controller, virtualized USB storage and a USB mouse

  • 模擬的聲卡:intel-hda

  • 模擬網(wǎng)卡:e1000军浆,模擬 Intel E1000 網(wǎng)卡;rtl8139挡闰,模擬 RealTeck 8139 網(wǎng)卡乒融。

  • 模擬存儲(chǔ)卡:兩塊模擬 PCI IDE 接口卡掰盘。KVM 限制每個(gè)虛擬機(jī)最多只能有4塊虛擬存儲(chǔ)卡。還有模擬軟驅(qū)赞季。

注意:RedHat Linux KVM 不支持 SCSI 模擬忘伞。

在不顯式指定使用其它類(lèi)型設(shè)備的情況下展氓,KVM 虛機(jī)將使用這些默認(rèn)的虛擬設(shè)備估蹄。比如上面描述的默認(rèn)情況下 KVM 虛機(jī)默認(rèn)使用rtl8139網(wǎng)卡始锚。比如,在 RedHat Linxu 6.5 主機(jī)上啟動(dòng)KVM RedHat Linux 6.4 虛機(jī)后撒遣,登錄虛機(jī)邮偎,查看 pci 設(shè)備,可以看到這些模擬設(shè)備:

當(dāng)使用 “-net nic,model=e1000” 指定網(wǎng)卡model 為 e1000 時(shí)愉舔,

1.4 qemu-kvm 關(guān)于磁盤(pán)設(shè)備和網(wǎng)絡(luò)的主要選項(xiàng)

| 類(lèi)型 | 選項(xiàng) |
| 磁盤(pán)設(shè)備(軟盤(pán)钢猛、硬盤(pán)、CDROM等) |

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">-****drive option[,option[,option[,...]]]:定義一個(gè)硬盤(pán)設(shè)備轩缤;可用子選項(xiàng)有很多命迈。
file=/path/to/somefile:硬件映像文件路徑;
if=interface:指定硬盤(pán)設(shè)備所連接的接口類(lèi)型火的,即控制器類(lèi)型壶愤,如ide、scsi馏鹤、sd征椒、mtd、floppy湃累、pflash及virtio等勃救;
index=index:設(shè)定同一種控制器類(lèi)型中不同設(shè)備的索引號(hào),即標(biāo)識(shí)號(hào)治力;
media=media:定義介質(zhì)類(lèi)型為硬盤(pán)(disk)還是光盤(pán)(cdrom)蒙秒; format=format:指定映像文件的格式,具體格式可參見(jiàn)qemu-img命令宵统;
-boot [order=drives][,once=drives][,menu=on|off]:定義啟動(dòng)設(shè)備的引導(dǎo)次序晕讲,每種設(shè)備使用一個(gè)字符表示;不同的架構(gòu)所支持的設(shè)備及其表示字符不盡相同马澈,在x86 PC架構(gòu)上瓢省,a、b表示軟驅(qū)痊班、c表示第一塊硬盤(pán)勤婚,d表示第一個(gè)光驅(qū)設(shè)備,n-p表示網(wǎng)絡(luò)適配器涤伐;默認(rèn)為硬盤(pán)設(shè)備(-boot order=dc,once=d)</pre>

對(duì)于網(wǎng)卡來(lái)說(shuō)蛔六,你可以使用 modle 參數(shù)指定虛擬網(wǎng)絡(luò)的類(lèi)型荆永。 RedHat Linux 6 所支持的虛擬網(wǎng)絡(luò)類(lèi)型有:

2. 準(zhǔn)虛擬化 (Para-virtualizaiton) I/O 驅(qū)動(dòng) virtio

在 KVM 中可以使用準(zhǔn)虛擬化驅(qū)動(dòng)來(lái)提供客戶機(jī)的I/O 性能废亭。目前 KVM 采用的的是 virtio 這個(gè) Linux 上的設(shè)備驅(qū)動(dòng)標(biāo)準(zhǔn)框架国章,它提供了一種 Host 與 Guest 交互的 IO 框架。

2.1 virtio 的架構(gòu)

KVM/QEMU 的 vitio 實(shí)現(xiàn)采用在 Guest OS 內(nèi)核中安裝前端驅(qū)動(dòng) (Front-end driver)和在 QEMU 中實(shí)現(xiàn)后端驅(qū)動(dòng)(Back-end)的方式豆村。前后端驅(qū)動(dòng)通過(guò) vring 直接通信液兽,這就繞過(guò)了經(jīng)過(guò) KVM 內(nèi)核模塊的過(guò)程,達(dá)到提高 I/O 性能的目的掌动。

純軟件模擬的設(shè)備和 Virtio 設(shè)備的區(qū)別:virtio 省去了純模擬模式下的異常捕獲環(huán)節(jié)四啰,Guest OS 可以和 QEMU 的 I/O 模塊直接通信。

使用 Virtio 的完整虛機(jī) I/O流程:

Host 數(shù)據(jù)發(fā)到 Guest:

1. KVM 通過(guò)中斷的方式通知 QEMU 去獲取數(shù)據(jù)粗恢,放到 virtio queue 中

2. KVM 再通知 Guest 去 virtio queue 中取數(shù)據(jù)柑晒。

2.2 Virtio 在 Linux 中的實(shí)現(xiàn)

Virtio 是在半虛擬化管理程序中的一組通用模擬設(shè)備的抽象。這種設(shè)計(jì)允許管理程序通過(guò)一個(gè)應(yīng)用編程接口 (API)對(duì)外提供一組通用模擬設(shè)備眷射。通過(guò)使用半虛擬化管理程序匙赞,客戶機(jī)實(shí)現(xiàn)一套通用的接口,來(lái)配合后面的一套后端設(shè)備模擬妖碉。后端驅(qū)動(dòng)不必是通用的涌庭,只要它們實(shí)現(xiàn)了前端所需的行為。因此欧宜,Virtio 是一個(gè)在 Hypervisor 之上的抽象API接口坐榆,讓客戶機(jī)知道自己運(yùn)行在虛擬化環(huán)境中,進(jìn)而根據(jù) virtio 標(biāo)準(zhǔn)與 Hypervisor 協(xié)作冗茸,從而客戶機(jī)達(dá)到更好的性能席镀。

  • 前端驅(qū)動(dòng):客戶機(jī)中安裝的驅(qū)動(dòng)程序模塊

  • 后端驅(qū)動(dòng):在 QEMU 中實(shí)現(xiàn),調(diào)用主機(jī)上的物理設(shè)備夏漱,或者完全由軟件實(shí)現(xiàn)豪诲。

  • virtio 層:虛擬隊(duì)列接口,從概念上連接前端驅(qū)動(dòng)和后端驅(qū)動(dòng)麻蹋。驅(qū)動(dòng)可以根據(jù)需要使用不同數(shù)目的隊(duì)列跛溉。比如 virtio-net 使用兩個(gè)隊(duì)列,virtio-block只使用一個(gè)隊(duì)列扮授。該隊(duì)列是虛擬的芳室,實(shí)際上是使用 virtio-ring 來(lái)實(shí)現(xiàn)的。

  • virtio-ring:實(shí)現(xiàn)虛擬隊(duì)列的環(huán)形緩沖區(qū)

Linux 內(nèi)核中實(shí)現(xiàn)的五個(gè)前端驅(qū)動(dòng)程序:

  • 塊設(shè)備(如磁盤(pán))

  • 網(wǎng)絡(luò)設(shè)備

  • PCI 設(shè)備

  • 氣球驅(qū)動(dòng)程序(動(dòng)態(tài)管理客戶機(jī)內(nèi)存使用情況)

  • 控制臺(tái)驅(qū)動(dòng)程序

Guest OS 中刹勃,在不使用 virtio 設(shè)備的時(shí)候堪侯,這些驅(qū)動(dòng)不會(huì)被加載。只有在使用某個(gè) virtio 設(shè)備的時(shí)候荔仁,對(duì)應(yīng)的驅(qū)動(dòng)才會(huì)被加載伍宦。每個(gè)前端驅(qū)動(dòng)器具有在管理程序中的相應(yīng)的后端的驅(qū)動(dòng)程序芽死。

以 virtio-net 為例,解釋其原理:

(1)virtio-net 的原理:

它使得:

  1. 多個(gè)虛機(jī)共享主機(jī)網(wǎng)卡 eth0

  2. QEMU 使用標(biāo)準(zhǔn)的 tun/tap 將虛機(jī)的網(wǎng)絡(luò)橋接到主機(jī)網(wǎng)卡上

  3. 每個(gè)虛機(jī)看起來(lái)有一個(gè)直接連接到主機(jī)PCI總線上的私有 virtio 網(wǎng)絡(luò)設(shè)備

  4. 需要在虛機(jī)里面安裝 virtio驅(qū)動(dòng)

(2)virtio-net 的流程:

總結(jié) Virtio 的優(yōu)缺點(diǎn):

  • 優(yōu)點(diǎn):更高的IO性能次洼,幾乎可以和原生系統(tǒng)差不多关贵。

  • 缺點(diǎn):客戶機(jī)必須安裝特定的 virtio 驅(qū)動(dòng)。一些老的 Linux 還沒(méi)有驅(qū)動(dòng)支持卖毁,一些 Windows 需要安裝特定的驅(qū)動(dòng)揖曾。不過(guò),較新的和主流的OS都有驅(qū)動(dòng)可以下載了亥啦。Linux 2.6.24+ 都默認(rèn)支持 virtio炭剪。可以使用 lsmod | grep virtio 查看是否已經(jīng)加載翔脱。

2.3 使用 virtio 設(shè)備 (以 virtio-net 為例)

使用 virtio 類(lèi)型的設(shè)備比較簡(jiǎn)單奴拦。較新的 Linux 版本上都已經(jīng)安裝好了 virtio 驅(qū)動(dòng),而 Windows 的驅(qū)動(dòng)需要自己下載安裝届吁。

(1)檢查主機(jī)上是否支持 virtio 類(lèi)型的網(wǎng)卡設(shè)備

(2)指定網(wǎng)卡設(shè)備model 為 virtio错妖,啟動(dòng)虛機(jī)

(點(diǎn)擊圖片放大)

(3)通過(guò) vncviewer 登錄虛機(jī),能看到被加載了的 virtio-net 需要的內(nèi)核模塊

(4)查看 pci 設(shè)備

其它 virtio 類(lèi)型的設(shè)備的使用方式類(lèi)似 virtio-net瓷产。

2.4 vhost-net (kernel-level virtio server)

前面提到 virtio 在宿主機(jī)中的后端處理程序(backend)一般是由用戶空間的QEMU提供的站玄,然而如果對(duì)于網(wǎng)絡(luò) I/O 請(qǐng)求的后端處理能夠在在內(nèi)核空間來(lái)完成,則效率會(huì)更高濒旦,會(huì)提高網(wǎng)絡(luò)吞吐量和減少網(wǎng)絡(luò)延遲株旷。在比較新的內(nèi)核中有一個(gè)叫做 “vhost-net” 的驅(qū)動(dòng)模塊,它是作為一個(gè)內(nèi)核級(jí)別的后端處理程序尔邓,將virtio-net的后端處理任務(wù)放到內(nèi)核空間中執(zhí)行晾剖,減少內(nèi)核空間到用戶空間的切換,從而提高效率梯嗽。

根據(jù) KVM 官網(wǎng)的 這篇文章(http://www.linux-kvm.org/page/UsingVhost)齿尽,vhost-net 能提供更低的延遲(latency)(比 e1000 虛擬網(wǎng)卡低 10%),和更高的吞吐量(throughput)(8倍于普通 virtio灯节,大概 7~8 Gigabits/sec )循头。

vhost-net 與 virtio-net 的比較:

vhost-net 的要求:

  • qemu-kvm-0.13.0 或者以上

  • 主機(jī)內(nèi)核中設(shè)置 CONFIG_VHOST_NET=y 和在虛機(jī)操作系統(tǒng)內(nèi)核中設(shè)置 CONFIG_PCI_MSI=y (Red Hat Enterprise Linux 6.1 開(kāi)始支持該特性)

  • 在客戶機(jī)內(nèi)使用 virtion-net 前段驅(qū)動(dòng)

  • 在主機(jī)內(nèi)使用網(wǎng)橋模式,并且啟動(dòng) vhost_net

qemu-kvm 命令的 -net tap 有幾個(gè)選項(xiàng)和 vhost-net 相關(guān)的: -net tap,[,vnet_hdr=on|off][,vhost=on|off][,vhostfd=h][,vhostforce=on|off]

  • vnet_hdr =on|off:設(shè)置是否打開(kāi)TAP設(shè)備的“IFF_VNET_HDR”標(biāo)識(shí)炎疆】睿“vnet_hdr=off”表示關(guān)閉這個(gè)標(biāo)識(shí);“vnet_hdr=on”則強(qiáng)制開(kāi)啟這個(gè)標(biāo)識(shí)形入,如果沒(méi)有這個(gè)標(biāo)識(shí)的支持全跨,則會(huì)觸發(fā)錯(cuò)誤。IFF_VNET_HDR是tun/tap的一個(gè)標(biāo)識(shí)亿遂,打開(kāi)它則允許發(fā)送或接受大數(shù)據(jù)包時(shí)僅僅做部分的校驗(yàn)和檢查浓若。打開(kāi)這個(gè)標(biāo)識(shí)渺杉,可以提高virtio_net驅(qū)動(dòng)的吞吐量。

  • vhost=on|off:設(shè)置是否開(kāi)啟vhost-net這個(gè)內(nèi)核空間的后端處理驅(qū)動(dòng)挪钓,它只對(duì)使用MIS-X中斷方式的virtio客戶機(jī)有效是越。

  • vhostforce=on|off:設(shè)置是否強(qiáng)制使用 vhost 作為非MSI-X中斷方式的Virtio客戶機(jī)的后端處理程序。

  • vhostfs=h:設(shè)置為去連接一個(gè)已經(jīng)打開(kāi)的vhost網(wǎng)絡(luò)設(shè)備诵原。

vhost-net 的使用實(shí)例:

(1)確保主機(jī)上 vhost-net 內(nèi)核模塊被加載了

(2)啟動(dòng)一個(gè)虛擬機(jī)英妓,在客戶機(jī)中使用 -net 定義一個(gè) virtio-net 網(wǎng)卡,在主機(jī)端使用 -netdev 啟動(dòng) vhost

(3)在虛擬機(jī)端绍赛,看到 virtio 網(wǎng)卡使用的 TAP 設(shè)備為 tap0。

4)在宿主機(jī)中看 vhost-net 被加載和使用了辑畦,以及 Linux 橋 br0吗蚌,它連接物理網(wǎng)卡 eth1 和 客戶機(jī)使用的 TAP 設(shè)備 tap0

一般來(lái)說(shuō),使用 vhost-net 作為后端處理驅(qū)動(dòng)可以提高網(wǎng)絡(luò)的性能纯出。不過(guò)蚯妇,對(duì)于一些網(wǎng)絡(luò)負(fù)載類(lèi)型使用 vhost-net 作為后端,卻可能使其性能不升反降暂筝。特別是從宿主機(jī)到其中的客戶機(jī)之間的UDP流量箩言,如果客戶機(jī)處理接受數(shù)據(jù)的速度比宿主機(jī)發(fā)送的速度要慢,這時(shí)就容易出現(xiàn)性能下降焕襟。在這種情況下陨收,使用vhost-net將會(huì)是UDP socket的接受緩沖區(qū)更快地溢出,從而導(dǎo)致更多的數(shù)據(jù)包丟失鸵赖。故這種情況下务漩,不使用vhost-net,讓傳輸速度稍微慢一點(diǎn)它褪,反而會(huì)提高整體的性能饵骨。

使用 qemu-kvm 命令行,加上“vhost=off”(或沒(méi)有vhost選項(xiàng))就會(huì)不使用vhost-net茫打,而在使用libvirt時(shí)居触,需要對(duì)客戶機(jī)的配置的XML文件中的網(wǎng)絡(luò)配置部分進(jìn)行如下的配置,指定后端驅(qū)動(dòng)的名稱(chēng)為“qemu”(而不是“vhost”)老赤。

2.6 virtio-balloon

另一個(gè)比較特殊的 virtio 設(shè)備是 virtio-balloon轮洋。通常來(lái)說(shuō),要改變客戶機(jī)所占用的宿主機(jī)內(nèi)存诗越,要先關(guān)閉客戶機(jī)砖瞧,修改啟動(dòng)時(shí)的內(nèi)存配置,然后重啟客戶機(jī)才可以實(shí)現(xiàn)嚷狞。而 內(nèi)存的 ballooning (氣球)技術(shù)可以在客戶機(jī)運(yùn)行時(shí)動(dòng)態(tài)地調(diào)整它所占用的宿主機(jī)內(nèi)存資源块促,而不需要關(guān)閉客戶機(jī)荣堰。該技術(shù)能夠:

  • 當(dāng)宿主機(jī)內(nèi)存緊張時(shí),可以請(qǐng)求客戶機(jī)回收利用已分配給客戶機(jī)的部分內(nèi)存竭翠,客戶機(jī)就會(huì)釋放部分空閑內(nèi)存振坚。若其內(nèi)存空間不足,可能還會(huì)回收部分使用中的內(nèi)存斋扰,可能會(huì)將部分內(nèi)存換到交換分區(qū)中渡八。

  • 當(dāng)客戶機(jī)內(nèi)存不足時(shí),也可以讓客戶機(jī)的內(nèi)存氣球壓縮传货,釋放出內(nèi)存氣球中的部分內(nèi)存屎鳍,讓客戶機(jī)使用更多的內(nèi)存。

目前很多的VMM问裕,包括 KVM, Xen逮壁,VMware 等都對(duì) ballooning 技術(shù)提供支持。其中粮宛,KVM 中的 Ballooning 是通過(guò)宿主機(jī)和客戶機(jī)協(xié)同來(lái)實(shí)現(xiàn)的窥淆,在宿主機(jī)中應(yīng)該使用 2.6.27 及以上版本的 Linux內(nèi)核(包括KVM模塊),使用較新的 qemu-kvm(如0.13版本以上)巍杈,在客戶機(jī)中也使用 2.6.27 及以上內(nèi)核且將“CONFIG_VIRTIO_BALLOON”配置為模塊或編譯到內(nèi)核忧饭。在很多Linux發(fā)行版中都已經(jīng)配置有“CONFIG_VIRTIO_BALLOON=m”,所以用較新的Linux作為客戶機(jī)系統(tǒng)筷畦,一般不需要額外配置virtio_balloon驅(qū)動(dòng)词裤,使用默認(rèn)內(nèi)核配置即可。

原理:

  1. KVM 發(fā)送請(qǐng)求給 VM 讓其歸還一定數(shù)量的內(nèi)存給KVM汁咏。

  2. VM 的 virtio_balloon 驅(qū)動(dòng)接到該請(qǐng)求亚斋。

  3. VM 的驅(qū)動(dòng)是客戶機(jī)的內(nèi)存氣球膨脹,氣球中的內(nèi)存就不能被客戶機(jī)使用攘滩。

  4. VM 的操作系統(tǒng)歸還氣球中的內(nèi)存給VMM

  5. KVM 可以將得到的內(nèi)存分配到任何需要的地方帅刊。

  6. KM 也可以將內(nèi)存返還到客戶機(jī)中。

優(yōu)勢(shì)和不足:

在QEMU monitor中漂问,提供了兩個(gè)命令查看和設(shè)置客戶機(jī)內(nèi)存的大小赖瞒。

  • (qemu) info balloon #查看客戶機(jī)內(nèi)存占用量(Balloon信息)

  • (qemu) balloon num #設(shè)置客戶機(jī)內(nèi)存占用量為numMB

使用實(shí)例:

(1)啟動(dòng)一個(gè)虛機(jī),內(nèi)存為 2048M蚤假,啟用 virtio-balloon

(點(diǎn)擊圖片放大)

(2)通過(guò) vncviewer 進(jìn)入虛機(jī)栏饮,查看 pci 設(shè)備

(3)看看內(nèi)存情況,共 2G 內(nèi)存

(4)進(jìn)入 QEMU Monitor磷仰,調(diào)整 balloon 內(nèi)存為 500M

(5)回到虛機(jī)袍嬉,查看內(nèi)存,變?yōu)?500 M

2.7 RedHat 的 多隊(duì)列 Virtio (multi-queue)

目前的高端服務(wù)器都有多個(gè)處理器,虛擬使用的虛擬CPU數(shù)目也不斷增加伺通。默認(rèn)的 virtio-net 不能并行地傳送或者接收網(wǎng)絡(luò)包箍土,因?yàn)?virtio_net 只有一個(gè)TX 和 RX 隊(duì)列。而多隊(duì)列 virtio-net 提供了一個(gè)隨著虛機(jī)的虛擬CPU增加而增強(qiáng)網(wǎng)絡(luò)性能的方法罐监,通過(guò)使得 virtio 可以同時(shí)使用多個(gè) virt-queue 隊(duì)列吴藻。

它在以下情況下具有明顯優(yōu)勢(shì):

  1. 網(wǎng)絡(luò)流量非常大

  2. 虛機(jī)同時(shí)有非常多的網(wǎng)絡(luò)連接,包括虛擬機(jī)之間的弓柱、虛機(jī)到主機(jī)的沟堡、虛機(jī)到外部系統(tǒng)的等

  3. virtio 隊(duì)列的數(shù)目和虛機(jī)的虛擬CPU數(shù)目相同。這是因?yàn)槎嚓?duì)列能夠使得一個(gè)隊(duì)列獨(dú)占一個(gè)虛擬CPU矢空。

注意:對(duì)隊(duì)列 virtio-net 對(duì)流入的網(wǎng)絡(luò)流工作得非常好航罗,但是對(duì)外發(fā)的數(shù)據(jù)流偶爾會(huì)降低性能。打開(kāi)對(duì)隊(duì)列 virtio 會(huì)增加中的吞吐量妇多,這相應(yīng)地會(huì)增加CPU的負(fù)擔(dān)伤哺。 在實(shí)際的生產(chǎn)環(huán)境中需要做必須的測(cè)試后才確定是否使用。

在 RedHat 中者祖,要使用多隊(duì)列 virtio-net,在虛機(jī)的 XML 文件中增加如下配置:

然后在主機(jī)上運(yùn)行下面的命令:

2.8 Windows 客戶機(jī)的 virtio 前端驅(qū)動(dòng)

Windows 客戶機(jī)下的 virtio 前端驅(qū)動(dòng)必須下載后手工安裝绢彤。 RedHat Linux 官網(wǎng)上說(shuō)明了在 Windows 客戶機(jī)內(nèi)安裝virtio 驅(qū)動(dòng)的方法七问。

作者:劉世民(sammyliu)
博客:http://www.cnblogs.com/sammyliu/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茫舶,隨后出現(xiàn)的幾起案子械巡,更是在濱河造成了極大的恐慌,老刑警劉巖饶氏,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讥耗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疹启,警方通過(guò)查閱死者的電腦和手機(jī)古程,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喊崖,“玉大人挣磨,你說(shuō)我怎么就攤上這事』缍” “怎么了茁裙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)节仿。 經(jīng)常有香客問(wèn)我晤锥,道長(zhǎng),這世上最難降的妖魔是什么廊宪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任矾瘾,我火速辦了婚禮女轿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霜威。我一直安慰自己谈喳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布戈泼。 她就那樣靜靜地躺著婿禽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪大猛。 梳的紋絲不亂的頭發(fā)上扭倾,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音挽绩,去河邊找鬼膛壹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唉堪,可吹牛的內(nèi)容都是我干的模聋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼唠亚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼链方!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起灶搜,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祟蚀,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后割卖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體前酿,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年鹏溯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了罢维。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剿涮,死狀恐怖言津,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情取试,我是刑警寧澤悬槽,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站瞬浓,受9級(jí)特大地震影響初婆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一磅叛、第九天 我趴在偏房一處隱蔽的房頂上張望屑咳。 院中可真熱鬧,春花似錦弊琴、人聲如沸兆龙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)紫皇。三九已至,卻和暖如春腋寨,著一層夾襖步出監(jiān)牢的瞬間聪铺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工萄窜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铃剔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓查刻,卻偏偏與公主長(zhǎng)得像键兜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穗泵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1. KVM 介紹 1.0 虛擬化簡(jiǎn)史 其中蝶押,KVM 全稱(chēng)是 基于內(nèi)核的虛擬機(jī)(Kernel-based Virt...
    51reboot閱讀 3,374評(píng)論 1 14
  • ****1. 為什么需要 CPU 虛擬化**** X86 操作系統(tǒng)是設(shè)計(jì)在直接運(yùn)行在裸硬件設(shè)備上的,因此它們自動(dòng)認(rèn)...
    51reboot閱讀 4,213評(píng)論 0 8
  • 一.虛擬化技術(shù)的介紹 (1)虛擬化技術(shù)類(lèi)型: 1.主機(jī)虛擬化:xen,kvm.virtualbox.openv2....
    楠人幫閱讀 1,962評(píng)論 0 5
  • KVM與QEMU 網(wǎng)絡(luò)虛擬化屬于IO虛擬化火欧,KVM模塊本身不提供任何設(shè)備模擬,模塊在初始化的時(shí)候會(huì)創(chuàng)建特殊設(shè)備文件...
    cb9e58ff5a37閱讀 1,784評(píng)論 0 3
  • 虛擬化技術(shù)概覽KVM簡(jiǎn)介KVM的管理操作 一茎截、虛擬化技術(shù)概覽 (一)虛擬化技術(shù)類(lèi)型: 主機(jī)虛擬化:xen, kvm...
    哈嘍別樣閱讀 1,803評(píng)論 0 5