在 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ò)程:
客戶機(jī)的設(shè)備驅(qū)動(dòng)程序發(fā)起 I/O 請(qǐng)求操作請(qǐng)求
KVM 模塊中的 I/O 操作捕獲代碼攔截這次 I/O 請(qǐng)求
經(jīng)過(guò)處理后將本次 I/O 請(qǐng)求的信息放到 I/O 共享頁(yè) (sharing page)碉咆,并通知用戶空間的 QEMU 程序抖韩。
QEMU 程序獲得 I/O 操作的具體信息之后,交由硬件模擬代碼來(lái)模擬出本次 I/O 操作疫铜。
完成之后茂浮,QEMU 將結(jié)果放回 I/O 共享頁(yè),并通知 KMV 模塊中的 I/O 操作捕獲代碼块攒。
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ò)模式包括:
默認(rèn)用戶模式(User);
基于網(wǎng)橋(Bridge)的模式混聊;
基于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)文的入方向,步驟:
網(wǎng)絡(luò)數(shù)據(jù)從 Host 上的物理網(wǎng)卡接收标沪,到達(dá)網(wǎng)橋榄攀;
由于 eth0 與 tap1 均加入網(wǎng)橋中,根據(jù)二層轉(zhuǎn)發(fā)原則金句,br0 將數(shù)據(jù)從 tap1 口轉(zhuǎn)發(fā)出去檩赢,即數(shù)據(jù)由 Tap設(shè)備接收;
Tap 設(shè)備通知對(duì)應(yīng)的 fd 數(shù)據(jù)可讀违寞;
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 的原理:
它使得:
多個(gè)虛機(jī)共享主機(jī)網(wǎng)卡 eth0
QEMU 使用標(biāo)準(zhǔn)的 tun/tap 將虛機(jī)的網(wǎng)絡(luò)橋接到主機(jī)網(wǎng)卡上
每個(gè)虛機(jī)看起來(lái)有一個(gè)直接連接到主機(jī)PCI總線上的私有 virtio 網(wǎng)絡(luò)設(shè)備
需要在虛機(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)核配置即可。
原理:
KVM 發(fā)送請(qǐng)求給 VM 讓其歸還一定數(shù)量的內(nèi)存給KVM汁咏。
VM 的 virtio_balloon 驅(qū)動(dòng)接到該請(qǐng)求亚斋。
VM 的驅(qū)動(dòng)是客戶機(jī)的內(nèi)存氣球膨脹,氣球中的內(nèi)存就不能被客戶機(jī)使用攘滩。
VM 的操作系統(tǒng)歸還氣球中的內(nèi)存給VMM
KVM 可以將得到的內(nèi)存分配到任何需要的地方帅刊。
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ì):
網(wǎng)絡(luò)流量非常大
虛機(jī)同時(shí)有非常多的網(wǎng)絡(luò)連接,包括虛擬機(jī)之間的弓柱、虛機(jī)到主機(jī)的沟堡、虛機(jī)到外部系統(tǒng)的等
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/