專利名稱:一種使用多隊列技術(shù)的虛擬機(jī)網(wǎng)絡(luò)性能優(yōu)化的實現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明采用基于Virtio的多隊列虛擬化技術(shù),涉及計算機(jī)虛擬化技術(shù)中的IO虛擬化。尤其涉及一種使用多隊列技術(shù)的虛擬機(jī)網(wǎng)絡(luò)性能優(yōu)化的實現(xiàn)方法,它是一種虛擬化網(wǎng)絡(luò)中采用多隊列方法實現(xiàn)虛擬機(jī)和宿主機(jī)之間交互的實現(xiàn)方法,屬于計算機(jī)技術(shù)領(lǐng)域。
背景技術(shù):
早在上個世紀(jì)60年代末70年代初IBM公司就在大型機(jī)上實現(xiàn)了商用的虛擬機(jī),諸多文獻(xiàn)描述了 IBM在OS 360使用的虛擬機(jī)的實現(xiàn)以及經(jīng)典的虛擬機(jī)體系結(jié)構(gòu)并描述了利用虛擬機(jī)監(jiān)控器實現(xiàn)虛擬化的方法。研究人員總結(jié)了第三代計算機(jī)可虛擬性 (Virtualizability):指出可虛擬性主要依賴于計算機(jī)指令集中敏感指令集的存在方式。 同時總結(jié)了可虛擬性的兩個重要定理定理一對于任何通常意義上的第三代計算機(jī),如果該計算機(jī)敏感指令集是特權(quán)指令集的子集,就可以在此計算機(jī)上創(chuàng)建一個虛擬機(jī)監(jiān)控器。定理二 對于任何通常意義上的第三代計算機(jī),如果該計算機(jī)的用戶敏感指令集是特權(quán)指令集的子集,就可以在此計算機(jī)上創(chuàng)建一個混合式(hybrid)的虛擬機(jī)監(jiān)控器。由于大多數(shù)計算機(jī)并不滿足定理一的要求,所以一些文獻(xiàn)放松了要求只要符合定理二的要求就可以利用陷入-模擬的方式(trap-and-emulate)完成虛擬化??商摂M化的關(guān)鍵是對敏感的非特權(quán)指令的處理。對這種指令的不同處理方式引發(fā)了下面幾種不同的虛擬化方式。I)基于二進(jìn)制翻譯的全虛擬化(Full Virtualization with Binary Translation)。這種方式動態(tài)的掃描二進(jìn)制代碼,將敏感指令替換為跳轉(zhuǎn)到相應(yīng)模擬例程。 通過這種方式避免敏感指令的產(chǎn)生。VMware公司已經(jīng)可以提供基于這種方式的商業(yè)化解決方案。這是目前唯一的在IA32/Intel 64體系結(jié)構(gòu)下不需要特殊硬件輔助實現(xiàn)全虛擬化的方式。但這種方案也存在明顯的缺陷由于要動態(tài)的監(jiān)控并即時翻譯二進(jìn)制碼,性能上會有所損失。2)硬件輔助的虛擬化(Hardware Assisted Virtualization)。這種方式通過擴(kuò)展指令集,通過硬件完成傳統(tǒng)虛擬機(jī)監(jiān)控器(Virtual Machine Monitor, VMM)所需要的陷入以及狀態(tài)切換。通過這種方式可以極大地簡化虛擬機(jī)的設(shè)計。但是由于硬件在狀態(tài)切換的時候會保存整個處理器的狀態(tài)并切換地址空間,由此帶來的開銷不可忽略,特別是在虛擬機(jī)與虛擬機(jī)監(jiān)控器頻繁切換的情況下。本發(fā)明專利采用的就是這種方式實現(xiàn)VMM。3)準(zhǔn)虛擬化(Para-virtualization)。這種方式通過靜態(tài)的改寫客戶操作系統(tǒng)源代碼,通過客戶操作系統(tǒng)與虛擬機(jī)監(jiān)控器顯示協(xié)作的方式完成虛擬化策略。開放源代碼的虛擬機(jī)監(jiān)控器Xen就是基于這種技術(shù)。這種技術(shù)通過VM對VMM的感知,避免了傳統(tǒng)陷入-模擬方式效率較低的問題,但需要對客戶操作系統(tǒng)源代碼進(jìn)行修改。10設(shè)備虛擬化在虛擬環(huán)境里,1/0面臨的問題是現(xiàn)實中外設(shè)資源是有限的,為了滿足多個客戶機(jī)操作系統(tǒng)對外設(shè)訪問的需求,VMM必須通過I/O虛擬化的方式復(fù)用有限的外設(shè)資源?,F(xiàn)代計算機(jī)環(huán)境中,I/O設(shè)備種類豐富,不同廠商生產(chǎn)的具有不同編程接口的I/O設(shè)備使I/O 虛擬化的難度相當(dāng)大。根據(jù)不同I/O設(shè)備的特點和用途,虛擬化系統(tǒng)中的I/O設(shè)備可以分為5類 專用設(shè)備(Dedicated Devices) 可分割設(shè)備(Partitioned Devices) 共享設(shè)備(Shared Devices) 偽脫機(jī)設(shè)備(Spooled Devices) 物理不存在的設(shè)備I/O虛擬化作為系統(tǒng)虛擬化的重要組成部分,同樣可按照實現(xiàn)技術(shù)分為軟件I/O 全虛擬化、I/o類虛擬化和硬件輔助I/O全虛擬化。在軟件完全虛擬化、類虛擬化和硬件輔助全虛擬化等虛擬化環(huán)境中,I/O設(shè)備的虛擬化都不盡相同,其核心在于I/o設(shè)備原生驅(qū)動(Legacy Driver)的存放位置以及VMM對 I/O設(shè)備的處理方式。軟件完全虛擬化中,VMM必須模擬設(shè)備硬件,它是在會話的最低級別進(jìn)行模擬的 (例如,網(wǎng)絡(luò)驅(qū)動程序)。盡管在該抽象中模擬很干凈,但它同時也是最低效、最復(fù)雜的。在類虛擬化中,Guest OS和VMM能夠共同合作,讓模擬更加高效。隨著硬件輔助全虛擬化技術(shù)的出現(xiàn),新的處理器通過加入虛擬化的高級指令來讓Guest OS到VMM的切換更加地高效。 此外,硬件也隨著I/O虛擬化的發(fā)展而不斷改進(jìn)。1)1/0全虛擬化軟件完全虛擬化環(huán)境下,一般使用I/O模擬的方式來虛擬化I/O設(shè)備。在I/O虛擬化中,設(shè)備模型用于完成目標(biāo)設(shè)備的模擬,設(shè)備請求的處理和響應(yīng)。設(shè)備模型模擬目標(biāo)設(shè)備的軟件接口,使Guest OS能夠用目標(biāo)設(shè)備的驅(qū)動來驅(qū)動虛擬設(shè)備,進(jìn)而透明地對虛擬設(shè)備進(jìn)行操作。為了模擬目標(biāo)設(shè)備軟件接口,設(shè)備模型也需要同時實現(xiàn)目標(biāo)設(shè)備的功能。這些功能是基于軟件實現(xiàn)的。故設(shè)備模型所模擬的目標(biāo)設(shè)備與宿主機(jī)的硬件不存在直接的關(guān)聯(lián)與對應(yīng)關(guān)系,而是建立在一定的運(yùn)行環(huán)境之上。對于不同結(jié)構(gòu)的虛擬機(jī),其設(shè)備模型的工作方式是類似的VMM捕獲對虛擬設(shè)備地址區(qū)域的讀寫操作、捕獲對設(shè)備的訪問;在真實硬件設(shè)備需要產(chǎn)生中斷時,VMM還必須能觸發(fā)Guest OS的中斷。但是,對于不同結(jié)構(gòu)的虛擬機(jī),設(shè)備模型所運(yùn)行的環(huán)境和位置可以是不同的。VMware Workstation和KVM都采用宿主操作系統(tǒng)結(jié)構(gòu),即它們的VMM運(yùn)行于一個傳統(tǒng)操作系統(tǒng)之上。這類VMM無法獲得對硬件資源的完全控制,因此通常采用軟件模擬的方法來虛擬1/0設(shè)備。Guest OS的1/0操作會被VMM捕獲,并轉(zhuǎn)交給Host OS的一個用戶態(tài)進(jìn)程,該進(jìn)程通過對Host OS的系統(tǒng)調(diào)用來模擬設(shè)備的行為。VMware ESX Server對網(wǎng)卡,磁盤等關(guān)鍵設(shè)備采用了全虛擬化方法。它采用獨立監(jiān)控器模型,VMM直接運(yùn)行于硬件之上,直接操作硬件設(shè)備。Guest OS看到的是一組統(tǒng)一的虛擬1/0設(shè)備。對這些虛擬設(shè)備的每一個1/0操作都會陷入到VMM中,由VMM對1/0指令進(jìn)行解析并映射到實際物理設(shè)備,然后直接控制硬件完成。這種方法能夠獲得較好的性能,對客戶操作系統(tǒng)也完全透明。但是由于VMM需要直接控制各種I/O設(shè)備,其設(shè)計會變的非常復(fù)雜,而且無法應(yīng)對設(shè)備的快速更新。模擬技術(shù)的最大好處就是不需要修改客戶設(shè)備驅(qū)動,但其缺點在于效率很低,模擬的難度大。這種方法最大性能開銷在于處理器模式切換包括Guest OS到VMM的切換, 以及從內(nèi)核帶VMM到用戶態(tài)I/O模擬進(jìn)程的切換。故優(yōu)化上主要策略就是減少模式切換。 為了減少模式切換,VMware Workstation中的許多I/O指令直接在VMM中處理,只有遇到真正會改變物理設(shè)備狀態(tài)的操作(如讀寫磁盤,網(wǎng)絡(luò)數(shù)據(jù)包收發(fā)),才會切換到I/O模擬進(jìn)程中進(jìn)一步處理。2) I/O類虛擬化在完全虛擬化中,I/O驅(qū)動包括Guest OS的硬件驅(qū)動,設(shè)備模擬及VMM中的真實硬件驅(qū)動。而類虛擬化不需要這種冗余的三層結(jié)構(gòu),I/o交互能夠以高于I/O指令級別的抽閑來實現(xiàn)。類虛擬化環(huán)境下,Guest OS的內(nèi)核被修改,原生設(shè)備驅(qū)動從Guest OS中移出,放入了一個經(jīng)過VMM授權(quán)的設(shè)備虛擬機(jī)中(Device VM),其余虛擬機(jī)中Guest OS的I/O請求都交由這個設(shè)備虛擬機(jī)處理。而在Guest OS內(nèi)部,系統(tǒng)為每個虛擬I/O設(shè)備安裝一個特殊驅(qū)動,該驅(qū)動負(fù)責(zé)I/O請求的傳遞。設(shè)備虛擬機(jī)在經(jīng)過VMM授權(quán)后,解析受到的I/O請求并映射到實際物理設(shè)備,最后交給它的原聲設(shè)備驅(qū)動程序來控制硬件完成。目前,基于類虛擬化思想的I/O虛擬化有多種主要的實現(xiàn),如Xen的I/O虛擬化和 Virtio 框架。 3)硬件輔助I/O全虛擬化硬件輔助I/O全虛擬化廣泛應(yīng)用于Xen中。Xen在引入了硬件虛擬化技術(shù)后,其 VMM能夠支持未修改內(nèi)核的Guest OS。盡管未修改內(nèi)核的Guest OS中含有I/O設(shè)備的驅(qū)動程序,但是同類虛擬化一樣,Xen同樣不允許Guest OS直接訪問真實物理硬件,而是通過 VMM單獨授權(quán)的虛擬機(jī)間接訪問。Xen的特權(quán)虛擬機(jī)中采用設(shè)備模型為未修改內(nèi)核的Guest OS提供各種I/O設(shè)備的抽象。虛擬機(jī)內(nèi)的Guest OS借助于這些虛擬設(shè)備來完成虛擬I/O 設(shè)備的訪問,而這些虛擬I/O設(shè)備訪問與實際硬件的交互則通過特權(quán)虛擬機(jī)的設(shè)備驅(qū)動完成。Virtio虛擬化框架Virtio是類虛擬化的VMM中的一組通用模擬設(shè)備的抽象。Virtio由Rusty Russell開發(fā),他當(dāng)時的目的是支持自己的虛擬化解決方案lguest。Virtio允許VMM導(dǎo)出一組通用的模擬設(shè)備,并通過一個通用的應(yīng)用編程接口(API)讓它們變得可用。有了類虛擬化VMM之后,Guest OS能夠?qū)崿F(xiàn)一組通用的接口,在一組后端驅(qū)動程序之后采用特定的設(shè)備模擬。后端驅(qū)動程序不需要是通用的,因為它們只實現(xiàn)前端所需的行為。Virtio API依賴一個簡單的緩沖抽象來封裝Guest OS需要的命令和數(shù)據(jù)。除了 ill立而驅(qū)動程序(在Guest OS中實現(xiàn))和后纟而驅(qū)動程序(在VMM中實現(xiàn))之外,Virtio還定義了兩個層來支持Guest OS到VMM的通信。在頂級(稱為Virtio)的是虛擬隊列接口, 它在概念上將前端驅(qū)動程序附加到后端驅(qū)動程序。驅(qū)動程序可以使用O個或多個隊列,具體數(shù)量取決于需求。例如,Virtio網(wǎng)絡(luò)驅(qū)動程序使用兩個虛擬隊列(一個用于接收,另一個用于發(fā)送),而Virtio塊驅(qū)動程序僅使用一個虛擬隊列。虛擬隊列實際上被實現(xiàn)為跨越 Guest OS和VMM的銜接點。但這可以通過任意方式實現(xiàn),前提是Guest OS和VMM以相同的方式實現(xiàn)它。
發(fā)明內(nèi)容
I 目的本發(fā)明提供了一種使用多隊列技術(shù)的虛擬機(jī)網(wǎng)絡(luò)性能優(yōu)化的實現(xiàn)方法,它主要采用多隊列虛擬化隊列的虛擬化技術(shù),為上層客戶操作系統(tǒng)提供更好更迅速的網(wǎng)絡(luò)服務(wù)。2技術(shù)方案2. I方法概述本發(fā)明專利基于kvm-linux操作系統(tǒng)的虛擬機(jī)模塊kernel based virtual machine,其特點是通過將虛擬機(jī)和宿主機(jī)之間的單虛擬隊列通信改變?yōu)槎鄠€虛擬隊列,使得虛擬機(jī)和宿主機(jī)之間的網(wǎng)絡(luò)數(shù)據(jù)傳輸速度加快。2. 2總體設(shè)計多隊列思路是將發(fā)送/接收隊列并行化,使多個隊列可以同時發(fā)送/接收數(shù)據(jù)。 將單隊列擴(kuò)展成多隊列需要對qemu(涉及kvm的IO虛擬化的模塊之一)、vhost(涉及kvm 的IO虛擬化的模塊之一),客戶機(jī)的virtio-net進(jìn)行修改。因為在初始化完成之后,vhost 與客戶機(jī)之間的通信是通過kvm內(nèi)核模塊進(jìn)行,不需要qemu進(jìn)行任何操作,所以對qemu的修改僅限于vhost和virtio-net初始化、提供給用戶的使用接口。對vhost進(jìn)行多隊列擴(kuò)展關(guān)鍵在于設(shè)計數(shù)據(jù)結(jié)構(gòu),相關(guān)的修改包括了 vhost系統(tǒng)調(diào)用、內(nèi)核線程創(chuàng)建等。客戶機(jī) virtio-net是以網(wǎng)卡驅(qū)動的形式存在的,要實現(xiàn)多隊列,就是要實現(xiàn)多隊列網(wǎng)卡驅(qū)動,對其修改的關(guān)鍵也在于數(shù)據(jù)結(jié)構(gòu)的設(shè)計上,以及隊列選擇機(jī)制,相關(guān)的修改包括virtio-net設(shè)備探測、隊列選擇等。以上三部分的修改不是孤立的,必須作為一個整體考慮qemU需要向 vhost、virtio-net傳遞是否啟用多隊列、隊列數(shù)量等信息,vhost、virtio-net也需要去檢查這些信息;vhost中的隊列與virtio-net中的隊列也是--對應(yīng)的。綜上所述,本發(fā)明一種使用多隊列技術(shù)的虛擬機(jī)網(wǎng)絡(luò)性能優(yōu)化的實現(xiàn)方法,該方法具體步驟如下步驟一對QEMU的網(wǎng)絡(luò)初始化部分進(jìn)行修改,通過修改QEMU,增加對于多隊列的支持。這部分的修改主要涉及以下兩個部分I. QEMU TAP (qemu模塊中和數(shù)據(jù)傳輸有關(guān)的部分)初始化修改數(shù)據(jù)結(jié)構(gòu)使得能夠支持多隊列,修改了對應(yīng)隊列的文件描述符,增加了用于指示描述符個數(shù)的項等。針對于數(shù)據(jù)結(jié)構(gòu)的改變,修改相應(yīng)的函數(shù)以適應(yīng)新的數(shù)據(jù)結(jié)構(gòu)。增加檢測是否啟用多隊列的功能,當(dāng)不啟用多隊列的時候,支持原本的單隊列傳輸。2. Vhost_net (vhost模塊中和網(wǎng)絡(luò)相關(guān)的部分)初始化修改數(shù)據(jù)結(jié)構(gòu)以支持多隊列。調(diào)用修改后的vhost多隊列的ioctl系統(tǒng)調(diào)用,用于創(chuàng)建和控制隊列。步驟二 對vhost多隊列的修改,是為了支持QEMU對多隊列的使用和vhost-net于一個隊列使用一個線程進(jìn)行數(shù)據(jù)傳輸?shù)男薷暮拖到y(tǒng)調(diào)用的修改。I.有關(guān)隊列使用線程的修改在非多隊列情況下,一個vhost_dev (虛擬機(jī)網(wǎng)絡(luò)中的虛擬設(shè)備)對應(yīng)一個內(nèi)核線程,但是現(xiàn)在要實現(xiàn)多隊列,就需要多個內(nèi)核線程。因此需要一個隊列對應(yīng)一個線程。我們主要對以下幾個數(shù)據(jù)結(jié)構(gòu)進(jìn)行重新設(shè)計和修改Vh0St_deV的修改主要針對于內(nèi)核線程和隊列進(jìn)行映射之后,存在一些不再需要的項;vhost_virtqueue中需要指定隊列號,并且對于每一個隊列標(biāo)識它所在的工作隊列;因為前兩個數(shù)據(jù)結(jié)構(gòu)的修改,與其相關(guān)的數(shù)據(jù)結(jié)構(gòu)vhost_poll和vhost_net也要針對于前面的改動而做一些修改。與這些數(shù)據(jù)結(jié)構(gòu)相關(guān)的函數(shù)也需要根據(jù)數(shù)據(jù)結(jié)構(gòu)的修改進(jìn)行相應(yīng)的調(diào)整。2.系統(tǒng)調(diào)用的修改具體修改包括將open中原先初始化隊列的工作移到ioctl中,因為需要QEMU傳遞隊列數(shù)量到內(nèi)核態(tài),open系統(tǒng)調(diào)用無法滿足次要求,而ioctl可以;將release釋放函數(shù)由原來釋放發(fā)送/接收隊列擴(kuò)展成釋放指定個數(shù)中增加初始化隊列的工作,對清理隊列的操作進(jìn)行修改,將清理單隊列變成清理多個隊列。步驟三對vhost-net (vhost模塊中和網(wǎng)絡(luò)相關(guān)的部分)多隊列網(wǎng)卡的修改,使得虛擬網(wǎng)卡支持多隊列的傳輸。具體的修改包括增加feature的支持;向virtio_net_ config數(shù)據(jù)結(jié)構(gòu)中增加用于說明多隊列數(shù)目的項;將virtnet_info數(shù)據(jù)結(jié)構(gòu)中的接收虛擬隊列rvq和發(fā)送虛擬隊列svq單獨作為新的數(shù)據(jù)結(jié)構(gòu)。(3)優(yōu)點及效果通過基于virtio的多隊列的技術(shù),本發(fā)明為kvm虛擬機(jī)的網(wǎng)絡(luò)提供了可靠的優(yōu)化方法,提升了虛擬機(jī)的網(wǎng)絡(luò)傳輸性能。經(jīng)測試,本優(yōu)化方法能夠在保持平均CPU利用率不變的情況下,提升大數(shù)據(jù)包的平均傳輸吞吐量20%以上。本發(fā)明在現(xiàn)有的成熟技術(shù)基礎(chǔ)上進(jìn)行創(chuàng)新,實施不難,具有良好的使用和發(fā)展前景。
圖I未使用多隊列的KVM網(wǎng)絡(luò)函數(shù)及模塊框架2使用多隊列的KVM網(wǎng)絡(luò)函數(shù)及模塊框架3本發(fā)明流程框中符號說明如下圖1、2中的字母符號內(nèi)容都表示函數(shù)名稱。
具體實施例方式見圖I、圖2、圖3,本發(fā)明一種使用多隊列技術(shù)的虛擬機(jī)網(wǎng)絡(luò)性能優(yōu)化的實現(xiàn)方法,該方法具體步驟如下步驟一對QEMU的網(wǎng)絡(luò)初始化部分進(jìn)行修改,通過修改QEMU,增加對于多隊列的支持。這部分的修改主要涉及以下兩個部分I、QEMU TAP (qemu中和數(shù)據(jù)傳輸有關(guān)的部分)初始化修改數(shù)據(jù)結(jié)構(gòu)使得能夠支持多隊列,修改了對應(yīng)隊列的文件描述符,增加了用于指示描述符個數(shù)的項等。針對于數(shù)據(jù)結(jié)構(gòu)的改變,修改相應(yīng)的函數(shù)以適應(yīng)新的數(shù)據(jù)結(jié)構(gòu)。增加檢測是否啟用多隊列的功能,當(dāng)不啟用多隊列的時候,支持原本的單隊列傳輸。2、Vhost_net (vhost模塊中和網(wǎng)絡(luò)相關(guān)的部分)初始化修改數(shù)據(jù)結(jié)構(gòu)以支持多隊列。調(diào)用修改后的vhost多隊列的ioctl系統(tǒng)調(diào)用,用于創(chuàng)建和控制隊列。步驟二 對vhost多隊列的修改,是為了支持QEMU對多隊列的使用和vhost-net 多隊列網(wǎng)卡的支持,主要包括針對于一個隊列使用一個線程進(jìn)行數(shù)據(jù)傳輸?shù)男薷暮拖到y(tǒng)調(diào)用的修改。I、有關(guān)隊列使用線程的修改在非多隊列情況下,一個vhost_dev (虛擬機(jī)網(wǎng)絡(luò)中的虛擬設(shè)備)對應(yīng)一個內(nèi)核線程,但是現(xiàn)在要實現(xiàn)多隊列,就需要多個內(nèi)核線程。因此需要一個隊列對應(yīng)一個線程。我們主要對以下幾個數(shù)據(jù)結(jié)構(gòu)進(jìn)行重新設(shè)計和修改Vh0St_deV的修改主要針對于內(nèi)核線程和隊列進(jìn)行映射之后,存在一些不再需要的項;vhost_virtqueue中需要指定隊列號,并且對于每一個隊列標(biāo)識它所在的工作隊列;因為前兩個數(shù)據(jù)結(jié)構(gòu)的修改,與其相關(guān)的數(shù)據(jù)結(jié)構(gòu)vhost_poll和vhost_net也要針對于前面的改動而做一些修改。與這些數(shù)據(jù)結(jié)構(gòu)相關(guān)的函數(shù)也需要根據(jù)數(shù)據(jù)結(jié)構(gòu)的修改進(jìn)行相應(yīng)的調(diào)整。2、系統(tǒng)調(diào)用的修改具體修改包括將open中原先初始化隊列的工作移到ioctl中,因為需要QEMU傳遞隊列數(shù)量到內(nèi)核態(tài),open系統(tǒng)調(diào)用無法滿足次要求,而ioctl可以;將release釋放函數(shù)由原來釋放發(fā)送/接收隊列擴(kuò)展成釋放指定個數(shù)中增加初始化隊列的工作,對清理隊列的操作進(jìn)行修改,將清理單隊列變成清理多個隊列。步驟三對vhost-net (vhost模塊中和網(wǎng)絡(luò)相關(guān)的部分)多隊列網(wǎng)卡的修改,使得虛擬網(wǎng)卡支持多隊列的傳輸。具體的修改包括增加feature的支持;向virtio_net_ config數(shù)據(jù)結(jié)構(gòu)中增加用于說明多隊列數(shù)目的項;將virtnet_info數(shù)據(jù)結(jié)構(gòu)中的接收虛擬隊列rvq和發(fā)送虛擬隊列svq單獨作為新的數(shù)據(jù)結(jié)構(gòu)。
權(quán)利要求
1. 一種使用多隊列技術(shù)的虛擬機(jī)網(wǎng)絡(luò)性能優(yōu)化的實現(xiàn)方法,其特征在于該方法具體步驟如下步驟一對QEMU的網(wǎng)絡(luò)初始化部分進(jìn)行修改,通過修改QEMU,增加對于多隊列的支持; 這部分的修改涉及以下兩個部分1.qemu模塊中和數(shù)據(jù)傳輸有關(guān)的部分——QEMU TAP初始化修改數(shù)據(jù)結(jié)構(gòu)使得能夠支持多隊列,修改了對應(yīng)隊列的文件描述符,增加了用于指示描述符個數(shù)的項;針對于數(shù)據(jù)結(jié)構(gòu)的改變,修改相應(yīng)的函數(shù)以適應(yīng)新的數(shù)據(jù)結(jié)構(gòu);增加檢測是否啟用多隊列的功能,當(dāng)不啟用多隊列的時候,支持原本的單隊列傳輸;2.vhost模塊中和網(wǎng)絡(luò)相關(guān)的部分-Vhost_net初始化修改數(shù)據(jù)結(jié)構(gòu)以支持多隊列;調(diào)用修改后的vhost多隊列的ioctl系統(tǒng)調(diào)用,用于創(chuàng)建和控制隊列;步驟二 對vhost多隊列的修改,是為了支持QEMU對多隊列的使用和vhost-net多隊列網(wǎng)卡的支持,包括針對于一個隊列使用一個線程進(jìn)行數(shù)據(jù)傳輸?shù)男薷暮拖到y(tǒng)調(diào)用的修改;1.有關(guān)隊列使用線程的修改在非多隊列情況下,一個虛擬機(jī)網(wǎng)絡(luò)中的虛擬設(shè)備vhost_dev對應(yīng)一個內(nèi)核線程,但是現(xiàn)在要實現(xiàn)多隊列,就需要多個內(nèi)核線程,因此需要一個隊列對應(yīng)一個線程;對以下幾個數(shù)據(jù)結(jié)構(gòu)進(jìn)行重新設(shè)計和修改Vh0St_deV的修改針對于內(nèi)核線程和隊列進(jìn)行映射之后,存在一些不再需要的項;vhost_virtqueue中需要指定隊列號,并且對于每一個隊列標(biāo)識它所在的工作隊列;因為前兩個數(shù)據(jù)結(jié)構(gòu)的修改,與其相關(guān)的數(shù)據(jù)結(jié)構(gòu) vhost_poll和vhost_net也要針對于前面的改動而做一些修改;與這些數(shù)據(jù)結(jié)構(gòu)相關(guān)的函數(shù)也需要根據(jù)數(shù)據(jù)結(jié)構(gòu)的修改進(jìn)行相應(yīng)的調(diào)整; ·2.系統(tǒng)調(diào)用的修改具體修改包括將open中原先初始化隊列的工作移到ioctl中,因為需要QEMU傳遞隊列數(shù)量到內(nèi)核態(tài),open系統(tǒng)調(diào)用無法滿足次要求,而ioctl可以;將release釋放函數(shù)由原來釋放發(fā)送/接收隊列擴(kuò)展成釋放指定個數(shù)中增加初始化隊列的工作,對清理隊列的操作進(jìn)行修改,將清理單隊列變成清理多個隊列;步驟三對vhost模塊中和網(wǎng)絡(luò)相關(guān)的部分-vhost-net多隊列網(wǎng)卡的修改,使得虛擬網(wǎng)卡支持多隊列的傳輸;具體的修改包括增加feature的支持;向virtio_net_config 數(shù)據(jù)結(jié)構(gòu)中增加用于說明多隊列數(shù)目的項;將virtnet_info數(shù)據(jù)結(jié)構(gòu)中的接收虛擬隊列 rvq和發(fā)送虛擬隊列svq單獨作為新的數(shù)據(jù)結(jié)構(gòu)。
全文摘要
一種使用多隊列技術(shù)的虛擬機(jī)網(wǎng)絡(luò)性能優(yōu)化的實現(xiàn)方法,它有三大步驟步驟一對QEMU的網(wǎng)絡(luò)初始化部分進(jìn)行修改,通過修改QEMU,增加對于多隊列的支持;步驟二對vhost多隊列的修改,是為了支持QEMU對多隊列的使用和vhost-net多隊列網(wǎng)卡的支持,包括針對于一個隊列使用一個線程進(jìn)行數(shù)據(jù)傳輸?shù)男薷暮拖到y(tǒng)調(diào)用的修改;步驟三對vhost模塊中和網(wǎng)絡(luò)相關(guān)的部分——vhost-net多隊列網(wǎng)卡的修改,使得虛擬網(wǎng)卡支持多隊列的傳輸。本發(fā)明通過設(shè)計和實現(xiàn)虛擬機(jī)到宿主機(jī)的多個虛擬隊列,來實現(xiàn)增加虛擬機(jī)網(wǎng)絡(luò)數(shù)據(jù)流量和吞吐量的目的。該方法構(gòu)思巧妙、科學(xué)合理,在計算機(jī)技術(shù)領(lǐng)域內(nèi)具有良好的使用價值和廣闊的應(yīng)用前景。
文檔編號G06F9/46GK102591715SQ20121000217
公開日2012年7月18日 申請日期2012年1月5日 優(yōu)先權(quán)日2012年1月5日
發(fā)明者肖利民, 許航, 雷松松 申請人:北京航空航天大學(xué)