朱 琛 王 劍 高 翔 毛碧波 李 星
(*計(jì)算機(jī)體系結(jié)構(gòu)國(guó)家重點(diǎn)實(shí)驗(yàn)室(中國(guó)科學(xué)院計(jì)算技術(shù)研究所) 北京 100190)(**中國(guó)科學(xué)院計(jì)算技術(shù)研究所 北京 100190)(***中國(guó)科學(xué)院大學(xué) 北京 100049)(****龍芯中科技術(shù)有限公司 北京 100190)
隨著CPU硬件輔助虛擬化技術(shù)的成熟,虛擬機(jī)技術(shù)得到了廣泛的應(yīng)用[1,2]。KVM(kernel-based virtual machine)是一種主流的基于Linux內(nèi)核的虛擬機(jī)監(jiān)控器(virtual machine monitor, VMM),有著優(yōu)秀的可管理性和性能。配合CPU的硬件輔助虛擬化技術(shù),在運(yùn)算、訪存密集型的應(yīng)用中,能夠達(dá)到宿主機(jī)相近的性能,是目前云計(jì)算使用的主流方案之一。在KVM虛擬機(jī)中,I/O(input/output)虛擬化目前應(yīng)用最廣泛的方式仍是不依賴硬件輔助的軟件模擬。在I/O中斷密集的場(chǎng)景中,軟件模擬的I/O中斷子系統(tǒng)成為影響虛擬機(jī)性能的瓶頸。本文以龍芯KVM虛擬機(jī)[3,4]為例介紹了虛擬I/O中斷子系統(tǒng)的原理,對(duì)虛擬I/O中斷子系統(tǒng)的性能瓶頸進(jìn)行了分析,除了采用常規(guī)方式優(yōu)化外,還在此基礎(chǔ)上嘗試使用多種手段對(duì)其性能進(jìn)行進(jìn)一步的優(yōu)化,取得了較好的優(yōu)化效果。
本文的內(nèi)容如下:第1節(jié)以龍芯的GS464E[5]高性能CPU核為例介紹了I/O虛擬化和I/O中斷虛擬化的基本原理。第2節(jié)分析了I/O中斷子系統(tǒng)的性能瓶頸。第3節(jié)介紹了其他架構(gòu)常用的優(yōu)化方法,并對(duì)其進(jìn)行了驗(yàn)證。第4節(jié)在常規(guī)優(yōu)化方法的基礎(chǔ)上進(jìn)行了進(jìn)一步的優(yōu)化,并對(duì)效果進(jìn)行了初步評(píng)估。第5節(jié)選擇部分I/O中斷密集的磁盤(pán)、網(wǎng)絡(luò)測(cè)試項(xiàng),驗(yàn)證了優(yōu)化的效果。最后在第6節(jié)進(jìn)行了總結(jié)。
I/O虛擬化指的是外設(shè)相關(guān)的虛擬化,因?yàn)閺腃PU的角度來(lái)看,外設(shè)是通過(guò)一組I/O寄存器來(lái)訪問(wèn)的[6]。I/O虛擬化的實(shí)質(zhì)是虛擬機(jī)通過(guò)VMM構(gòu)建的虛擬設(shè)備(以下簡(jiǎn)稱VDEV)復(fù)用有限的宿主機(jī)外設(shè)資源。虛擬設(shè)備為虛擬機(jī)模擬真實(shí)外設(shè)訪問(wèn)的效果,其本身又是宿主機(jī)外設(shè)驅(qū)動(dòng)程序的一個(gè)客戶端,可以通過(guò)宿主機(jī)操作系統(tǒng)提供的API訪問(wèn)真實(shí)物理外設(shè),實(shí)現(xiàn)對(duì)真實(shí)外設(shè)的復(fù)用[7]。
I/O虛擬化以CPU虛擬化技術(shù)為基礎(chǔ)。以龍芯GS464E為例,該處理器有4種運(yùn)行狀態(tài),即根模式用戶態(tài)、根模式內(nèi)核態(tài)、客模式用戶態(tài)、客模式內(nèi)核態(tài)。其中客模式的2個(gè)狀態(tài)是專為虛擬化新增的。4種狀態(tài)在一定條件下會(huì)相互轉(zhuǎn)化,虛擬機(jī)在客模式運(yùn)行,在執(zhí)行部分特權(quán)指令和觸發(fā)特定異常的情況下會(huì)發(fā)生例外陷入根模式內(nèi)核態(tài),其狀態(tài)機(jī)如圖1所示[8]。
圖1 GS464E 模式狀態(tài)機(jī)
虛擬機(jī)在宿主機(jī)操作系統(tǒng)看來(lái)是一個(gè)用戶進(jìn)程。虛擬機(jī)通過(guò)該進(jìn)程獲取宿主機(jī)的CPU、內(nèi)存、外設(shè)等物理硬件資源,并在不同線程之間共享。虛擬機(jī)的每個(gè)虛擬CPU(以下簡(jiǎn)稱VCPU)有一個(gè)獨(dú)立線程,虛擬機(jī)的內(nèi)核和文件系統(tǒng)均在VCPU線程中運(yùn)行。模擬VDEV的QEMU運(yùn)行在根模式用戶態(tài)。負(fù)責(zé)CPU、內(nèi)存虛擬化的KVM則運(yùn)行在根模式內(nèi)核態(tài),是宿主機(jī)內(nèi)核的一部分。會(huì)引起客模式陷入根模式內(nèi)核態(tài)的例外如表1所示。其中I/O虛擬化用到的主要是轉(zhuǎn)譯后備緩沖器(translation lookaside buffer, TLB)例外。
表1 GS464E中陷入根模式的例外
當(dāng)虛擬機(jī)在VCPU線程中訪問(wèn)I/O端口時(shí),由于該地址不在TLB中,引起TLB例外陷入根模式內(nèi)核態(tài),隨后由KVM處理,KVM在判定地址不是內(nèi)存且自己不能模擬后,會(huì)返回QEMU模擬。CPU與外設(shè)的交互手段,除了寄存器訪問(wèn)和I/O中斷之外還有直接存儲(chǔ)器訪問(wèn)(direct memory access, DMA)。虛擬機(jī)中的DMA是QEMU通過(guò)CPU內(nèi)存拷貝模擬的。
I/O中斷虛擬機(jī)是中斷虛擬化的一部分,支持硬件虛擬化輔助的CPU一般都會(huì)提供一定程度的中斷虛擬化輔助。以GS464E處理器核為例,該處理器的協(xié)處理器0(co-processor 0,簡(jiǎn)稱CP0,MIPS中負(fù)責(zé)處理例外的協(xié)處理器)中有用于客模式中斷輔助的相關(guān)寄存器,如表2中所示。
表2 GS464E中的虛擬機(jī)中斷輔助寄存器
其中Guest.Cause.IP(以下簡(jiǎn)稱GCIP)記錄虛擬機(jī)的中斷狀態(tài)。當(dāng)GCIP被置位時(shí),虛擬機(jī)會(huì)陷入客模式管理的例外,跳轉(zhuǎn)到對(duì)應(yīng)中斷向量入口執(zhí)行處理程序。該寄存器不能由軟件直接置位,而是由GuestCtl0.PIP(以下簡(jiǎn)稱GPIP)、GuestCtl2.VIP(以下簡(jiǎn)稱GVIP)和硬件中斷(以下簡(jiǎn)稱HWIP)共同決定的。其中斷邏輯圖如圖2所示。其中的n代表是第幾位,取值范圍為0~7。
圖2 GS464E 客模式中斷邏輯
通過(guò)設(shè)置GPIP和處理器的硬件中斷路由器也可以將特定物理外設(shè)的I/O中斷直接注入給虛擬機(jī),但虛擬機(jī)使用的大部分外設(shè)是軟件模擬的,且GCIP只有8位,一般只有1位用于I/O中斷,因此I/O中斷采用的是軟件注入方式,使用虛擬I/O中斷控制器來(lái)管理多個(gè)虛擬外設(shè)中斷。虛擬I/O中斷控制器行為邏輯上模擬特定的物理I/O中斷控制器,龍芯KVM虛擬機(jī)中使用的虛擬高級(jí)I/O中斷控制器(以下簡(jiǎn)稱VIOAPIC)模擬自龍芯7A橋片內(nèi)置的高級(jí)I/O中斷控制器。VIOAPIC自身也是一個(gè)虛擬外設(shè)。虛擬機(jī)I/O中斷是VCPU和虛擬外設(shè)之間的一種同步手段。當(dāng)虛擬外設(shè)發(fā)生了需要與VCPU線程同步的事件時(shí),會(huì)將該請(qǐng)求通知VIOAPIC。VIOAPIC會(huì)根據(jù)中斷觸發(fā)邏輯置位GVIP寄存器。龍芯KVM虛擬機(jī)中斷結(jié)構(gòu)如圖3所示。客模式中斷被置位后,虛擬機(jī)會(huì)直接跳轉(zhuǎn)到客模式內(nèi)核對(duì)應(yīng)的例外入口處理。
圖3 龍芯KVM虛擬機(jī)中斷結(jié)構(gòu)圖
從硬件結(jié)構(gòu)上看,I/O中斷控制器之后還有用于多核中斷分發(fā)的中斷路由器也需要模擬。在這里為了簡(jiǎn)化,將其看成是VIOAPIC的一部分,不單獨(dú)分列。
VIOAPIC有中斷線和中斷消息(MSI)2種觸發(fā)邏輯,兩者在虛擬機(jī)中都是軟件模擬,沒(méi)有本質(zhì)區(qū)別。本文使用中斷線模式,后續(xù)的優(yōu)化方法對(duì)MSI和中斷線2種模式都有效。虛擬I/O中斷控制器不直接涉及真實(shí)外設(shè),如果不考慮中斷注入延遲導(dǎo)致的外設(shè)空閑,可以認(rèn)為其只消耗CPU資源。
一個(gè)I/O中斷從虛擬設(shè)備發(fā)出請(qǐng)求,到最終處理完畢可以分成2個(gè)階段:中斷注入和中斷響應(yīng)。在宿主機(jī)和虛擬機(jī)都以1.2 G 龍芯3A3000單核運(yùn)行并屏蔽其他中斷的情況下,使一個(gè)虛擬設(shè)備連續(xù)觸發(fā)I/O中斷,分別測(cè)試虛擬機(jī)以不處理直接返回和正常I/O中斷響應(yīng)流程2種方式完成100萬(wàn)次循環(huán)所需的時(shí)間再除以循環(huán)次數(shù),以此來(lái)估算中斷注入和中斷響應(yīng)所需的時(shí)間。測(cè)試結(jié)果顯示,100萬(wàn)次中斷注入耗時(shí)2.68 s,以此估算一次完整中斷注入流程實(shí)測(cè)需要約3 217個(gè)時(shí)鐘周期。而一次中斷注入加一次中斷響應(yīng)流程則耗時(shí)76.48 s,需要約91 769個(gè)時(shí)鐘周期。減去中斷注入流程消耗的時(shí)鐘周期,一次中斷響應(yīng)需要88 552個(gè)時(shí)鐘周期。因此影響I/O中斷子系統(tǒng)性能的主要是中斷響應(yīng)。
虛擬I/O中斷響應(yīng)與宿主機(jī)I/O中斷響應(yīng)在客模式運(yùn)行的代碼是完全一致的,CPU的主要行為區(qū)別是I/O寄存器的訪問(wèn)。一次I/O中斷處理流程需要8次訪問(wèn)VIOAPIC的寄存器,如果增加1次冗余的寄存器讀取,一次中斷響應(yīng)流程增加約6 886個(gè)時(shí)鐘周期。以此估算,訪問(wèn)VIOAPIC的寄存器消耗了中斷響應(yīng)流程62.2%的時(shí)間,是影響虛擬I/O中斷子系統(tǒng)性能的主要因素。
龍芯7A的中斷響應(yīng)流程如圖4所示。流程圖中的(A)、(B)、(C)、(D)步驟均有對(duì)I/O寄存器的訪問(wèn)。其中(A)、(B)、(D)中訪問(wèn)的是VIOAPIC的寄存器,(C)中訪問(wèn)的是VDEV的寄存器。
圖4 龍芯7A I/O中斷響應(yīng)流程圖
虛擬機(jī)中斷處理的數(shù)據(jù)流圖如圖5所示。圖中的(A)、(B)、(C)、(D)與流程圖中的符號(hào)相對(duì)應(yīng)。數(shù)據(jù)流圖中的粗線表示會(huì)引發(fā)CPU例外或狀態(tài)切換的動(dòng)作,其中實(shí)線代表訪問(wèn)VIOAPIC的寄存器,虛線代表訪問(wèn)的VDEV的寄存器。本文中后續(xù)數(shù)據(jù)流圖的含義也與此相同。由于(C)中對(duì)VDEV寄存器的訪問(wèn)不是本文的重點(diǎn),且沒(méi)有變化,后續(xù)的數(shù)據(jù)流圖略去了這一部分。
圖5 7A I/O中斷處理流程數(shù)據(jù)流圖
從圖5可知,VCPU對(duì)VIOAPIC的一次寄存器訪問(wèn)需要經(jīng)過(guò)VCPU->KVM->QEMU->KVM->VCPU的流程,其中每個(gè)步驟都需要保存恢復(fù)CPU的若干狀態(tài)信息和線程信息,這是模擬開(kāi)銷大的主要原因。
優(yōu)化I/O模擬的常用優(yōu)化方法是將I/O外設(shè)放到KVM中模擬,在KVM中模擬VIOAPIC,中斷注入?yún)^(qū)別不大,但在中斷響應(yīng)流程中,VCPU訪問(wèn)VIOAPIC的寄存器,KVM可以直接將數(shù)據(jù)返回給VCPU,不需要再經(jīng)過(guò)QEMU,模擬流程簡(jiǎn)化為VCPU->KVM->VCPU。經(jīng)測(cè)試,訪問(wèn)一次KVM中模擬的VIOAPIC寄存器的開(kāi)銷約為2 265個(gè)時(shí)鐘周期,一次完整的I/O中斷響應(yīng)消耗大約37 985個(gè)時(shí)鐘周期,比在QEMU中模擬減少了57%的CPU開(kāi)銷,訪問(wèn)中斷控制器的寄存器耗時(shí)占比從62.2%下降到47.7%。優(yōu)化后的數(shù)據(jù)流圖如圖6所示。
圖6 在KVM中模擬VIOAPIC的數(shù)據(jù)流圖
雖然在KVM中模擬VIOAPIC明顯提升了I/O中斷響應(yīng)的速度,但其中仍有近一半的耗時(shí)用于訪問(wèn)VIOAPIC的寄存器,還有繼續(xù)優(yōu)化的空間。
龍芯GS464E對(duì)寄存器訪問(wèn)的操作都是用普通訪存指令完成的。在中斷響應(yīng)過(guò)程中,VCPU對(duì)寄存器的讀是為了獲取中斷控制器的狀態(tài),這些狀態(tài)在中斷產(chǎn)生前就已經(jīng)到達(dá)了KVM。可以提前將其保存到虛擬機(jī)可以訪問(wèn)的內(nèi)存中,避免VCPU陷入根模式模擬。部分寫(xiě)寄存器由于涉及到GCIP的狀態(tài)同步,仍需要被KVM捕獲。VCPU通過(guò)0xe010000000~0xe010000fff的地址訪問(wèn)VIOAPIC的寄存器。而在0xe010000000~0xe01000ffff的地址空間沒(méi)有任何內(nèi)存或其他設(shè)備。因此可以將寄存器的值填入一個(gè)4 kB的物理內(nèi)存頁(yè)中,將該頁(yè)映射到虛擬機(jī)的0xe010000000~0xe01000ffff地址,并將該頁(yè)在虛擬機(jī)頁(yè)表中設(shè)置為只讀屬性,這樣就能實(shí)現(xiàn)VCPU直接讀取內(nèi)存獲得寄存器的值,而對(duì)相關(guān)地址的寫(xiě)會(huì)陷入KVM。
虛擬機(jī)的頁(yè)表填入過(guò)程需要4個(gè)地址:虛擬機(jī)虛擬地址(guest virtual address, GVA),虛擬機(jī)物理地址(guest physical address, GPA),宿主機(jī)虛擬地址(host virtual address, HVA),宿主機(jī)物理地址(host physical address, HPA)。GS464E的虛擬機(jī)和宿主機(jī)共用頁(yè)表項(xiàng),虛擬機(jī)和宿主機(jī)的頁(yè)表項(xiàng)用2個(gè)輔助標(biāo)識(shí)MID和VPID區(qū)分,其中MID區(qū)分宿主機(jī)和虛擬機(jī),VPID區(qū)分是哪一個(gè)虛擬機(jī)。虛擬機(jī)的頁(yè)表項(xiàng)只保存GVA到HPA的對(duì)應(yīng)關(guān)系。
內(nèi)核中利用MIPS的非緩存物理地址窗口訪問(wèn)寄存器[9],如0xe010000000對(duì)應(yīng)的訪問(wèn)地址就是0x90000e010000000,即內(nèi)核訪問(wèn)的GVA。修改后虛擬機(jī)中斷響應(yīng)的數(shù)據(jù)流圖如圖7所示。在頁(yè)表項(xiàng)沒(méi)有被換出的情況下,對(duì)VIOAPIC寄存器的讀操作都不需要陷入KVM,直接訪問(wèn)內(nèi)存,只有寄存器寫(xiě)操作需要陷入KVM模擬。需要說(shuō)明的是,GS464E中虛擬機(jī)訪問(wèn)地址的緩存屬性不受MIPS的非緩存和緩存窗口的約束,而是由頁(yè)表屬性決定的。
圖7 使用只讀頁(yè)表優(yōu)化后的中斷響應(yīng)數(shù)據(jù)流圖
優(yōu)化后的一次完整I/O中斷響應(yīng)流程消耗大約23 227個(gè)時(shí)鐘周期,較單純的KVM模擬減少了38.9%,I/O中斷控制器的寄存訪問(wèn)消耗占比進(jìn)一步下降到了29.2%左右。這一優(yōu)化不需要改動(dòng)虛擬機(jī),保持了虛擬機(jī)內(nèi)核和宿主機(jī)內(nèi)核的兼容性。
在I/O虛擬化中,在保持虛擬機(jī)用戶態(tài)程序和宿主機(jī)完全兼容的情況下,通過(guò)修改少量?jī)?nèi)核態(tài)邏輯使其更適合虛擬化環(huán)境的方法,被稱為類虛擬化。通過(guò)分析本文認(rèn)為類虛擬化的方法也適用于VIOAPIC的優(yōu)化。在中斷線模式下VIOAPIC 3個(gè)最核心寄存器是中斷請(qǐng)求寄存器(interrupt request register, IRR),中斷狀態(tài)寄存器(interrupt status register, ISR)和中斷屏蔽寄存器(interrupt mask register, MASK),其三者的邏輯關(guān)系為:
ISR=IRR&(~MASK)
其中中斷響應(yīng)過(guò)程中VCPU主要訪問(wèn)ISR和MASK寄存器,IRR寄存器由VDEV更改。如果有任何新的中斷請(qǐng)求VIOAPIC會(huì)先更新IRR,再根據(jù)上述邏輯關(guān)系更新ISR最終更新目標(biāo)VCPU所運(yùn)行的物理CPU的GVIP寄存器。而對(duì)于VCPU來(lái)說(shuō),只能通過(guò)MASK來(lái)更新ISR。
I/O中斷響應(yīng)過(guò)程中,VCPU更新MASK主要有2個(gè)作用:即屏蔽中斷和解除中斷的屏蔽。
由于GCIP是VIOAPIC軟件注入的,只需確保下次VIOAPIC更新GVIP時(shí),MASK的值能夠被VIOAPIC正確得知即可,因此屏蔽中斷不需要同步操作。解除中斷的屏蔽會(huì)實(shí)時(shí)更新ISR,需要同步操作。
可以將MASK拆解為2個(gè)不同的寄存器:MASK和UNMASK。VCPU訪問(wèn)MASK寄存器屏蔽I/O中斷,使用UNMASK寄存器解除屏蔽。其中MASK虛擬機(jī)訪問(wèn)的是一個(gè)VCPU可讀寫(xiě)的內(nèi)存地址,TLB命中時(shí)不需要陷入。而UNMASK會(huì)按照常規(guī)的寄存器模擬,MASK寫(xiě)1代表該位的中斷被屏蔽,UNMASK寫(xiě)1代表該位的中斷被解除屏蔽。當(dāng)IRR發(fā)生變化更新ISR時(shí)的邏輯關(guān)系仍為ISR=IRR&(~MASK),但在VCPU寫(xiě)UNMASK寄存器陷入KVM后,VIOAPIC會(huì)按照如下步驟:
(1)MASK = MASK&(~UNMASK)
(2)ISR=IRR&(~MASK)
完成對(duì)MASK、UNMASK和ISR寄存器的同步操作。需要注意的是,同時(shí)只能有一個(gè)線程更新ISR或訪問(wèn)MASK和UNMASK,因此需要在虛擬機(jī)和KVM中使用鎖進(jìn)行保護(hù)。優(yōu)化后的數(shù)據(jù)流圖如圖8所示。
圖8 采用類虛擬化方法優(yōu)化后的數(shù)據(jù)流圖
和4.1節(jié)中的只讀頁(yè)表優(yōu)化一樣,VIOAPIC相關(guān)寄存器的狀態(tài)放在讀頁(yè)中,MASK寄存器放在新增的寫(xiě)頁(yè)中。MASK更新時(shí),先從內(nèi)存寫(xiě)頁(yè)中讀出舊值,再與新的需要屏蔽的中斷位取或后重新寫(xiě)回內(nèi)存。修改后的響應(yīng)過(guò)程VCPU只在解除屏蔽時(shí)寫(xiě)UNMASK寄存器需要陷入KVM。經(jīng)測(cè)試優(yōu)化后一次完整中斷所需的時(shí)鐘周期約為18 647個(gè)時(shí)鐘周期,其中訪問(wèn)VIOAPIC的寄存器消耗了約12.1%的時(shí)鐘周期,連續(xù)處理100萬(wàn)個(gè)中斷耗時(shí)從76.5 s縮短到18.4 s,吞吐量提升了超過(guò)3倍,相較于單純的KVM模擬,也提升了近1倍。
MSI模式的I/O中斷也可以用這種方法優(yōu)化,只是優(yōu)化的寄存器邏輯略有不同,在這里不作贅述。
為了驗(yàn)證優(yōu)化后的模擬I/O中斷控制器,本研究選擇了I/O中斷密集的部分磁盤(pán)、網(wǎng)絡(luò)測(cè)試項(xiàng),測(cè)試優(yōu)化前和優(yōu)化后的效果,其中只讀頁(yè)表優(yōu)化和中斷處理邏輯優(yōu)化都是以將中斷控制器放置在KVM中模擬為基礎(chǔ)的。測(cè)試環(huán)境如表3所示。
表3 龍芯KVM測(cè)試環(huán)境
磁盤(pán)測(cè)試中比較了龍芯平臺(tái)優(yōu)化前后的性能。網(wǎng)絡(luò)測(cè)試不僅比較了龍芯優(yōu)化前后的性能,還與商用計(jì)算機(jī)的KVM虛擬機(jī)進(jìn)行了簡(jiǎn)單的效率對(duì)比。選擇網(wǎng)絡(luò)測(cè)試與商用計(jì)算機(jī)進(jìn)行對(duì)比是因?yàn)榫W(wǎng)絡(luò)測(cè)試在虛擬機(jī)和宿主機(jī)使用地址轉(zhuǎn)換模式(NAT)連接時(shí),并不需要通過(guò)真實(shí)外設(shè)交互,全過(guò)程只涉及軟件,可以屏蔽由于外設(shè)性能差距帶來(lái)的干擾。而測(cè)試所用的netpef TCP_RR和TCP_CRR測(cè)試項(xiàng)經(jīng)性能分析工具分析在虛擬機(jī)和宿主機(jī)使用NAT連接時(shí)95%以上的時(shí)鐘周期都用于中斷邏輯模擬,對(duì)比的商用計(jì)算機(jī)使用AMD的FX8300處理器,該處理器的單核同頻性能與GS464E相當(dāng)[10]。為了測(cè)試方便,將核心數(shù)和核心頻率設(shè)置為與3A3000相同,測(cè)試分值就可以直接反映I/O中斷模擬的效率。具體測(cè)試環(huán)境如表4所示(以下將對(duì)比的商用計(jì)算機(jī)簡(jiǎn)稱FX8300)。
表4 商用計(jì)算機(jī)KVM測(cè)試環(huán)境
磁盤(pán)測(cè)試中使用dd命令循環(huán)將0寫(xiě)入文件,源數(shù)據(jù)使用/dev/zero,文件數(shù)據(jù)塊大小從8 kB到10 MB,測(cè)試使用iflag=direct參數(shù),循環(huán)次數(shù)為10 GB/塊大小。測(cè)試結(jié)果如表5所示,結(jié)果的單位為MB/s。本節(jié)中測(cè)試欄中的KVM代表在KVM中實(shí)現(xiàn)VIOAPIC。
表5 磁盤(pán)性能測(cè)試結(jié)果
在磁盤(pán)測(cè)試中,數(shù)據(jù)塊較小時(shí)的優(yōu)化效果明顯。以8 kB數(shù)據(jù)塊為例,相對(duì)于原始成績(jī),通用優(yōu)化的提升幅度最大,提升了171.6%,而只讀頁(yè)表優(yōu)化和類虛擬化優(yōu)化在通用優(yōu)化的基礎(chǔ)上又分別提升了9.72%和15.97%,相對(duì)于原始成績(jī)則提升了198.1%和215.1%。在16 kB、128 kB的測(cè)試中的結(jié)果也與之相似,但在1 MB、10 MB的測(cè)試中,優(yōu)化前后的性能沒(méi)有明顯變化。這是因?yàn)樘摂M機(jī)與半虛擬化的磁盤(pán)設(shè)備主要通過(guò)環(huán)形緩沖區(qū)進(jìn)行交互,在環(huán)形緩沖區(qū)未阻塞時(shí)不需要使用I/O中斷同步[11]。數(shù)據(jù)塊較大時(shí),每次拷貝VCPU的準(zhǔn)備時(shí)間長(zhǎng),磁盤(pán)寫(xiě)入的時(shí)間也較長(zhǎng),交互次數(shù)少,環(huán)形緩沖區(qū)很少出現(xiàn)阻塞。小塊數(shù)據(jù)拷貝時(shí),虛擬機(jī)和虛擬外設(shè)交互頻繁,環(huán)形緩沖區(qū)經(jīng)常阻塞。
網(wǎng)絡(luò)測(cè)試中,虛擬機(jī)與宿主機(jī)使用NAT方式連接。使用Netperf中的TCP_RR、TCP_CRR方式測(cè)試,server運(yùn)行在宿主機(jī)上。測(cè)試結(jié)果如表6所示。
表6 網(wǎng)絡(luò)性能測(cè)試對(duì)比
通過(guò)網(wǎng)絡(luò)測(cè)試的結(jié)果可知,優(yōu)化前龍芯的I/O中斷效率明顯低于FX8300,測(cè)試成績(jī)僅為FX8300的73.6%~80%。在同樣使用KVM模擬I/O中斷控制邏輯的情況下,龍芯的模擬效率超過(guò)了FX8300,測(cè)試成績(jī)達(dá)到了FX8300的104.2%~111.7%,在使用只讀頁(yè)表和類虛擬化優(yōu)化后,模擬效率又有了進(jìn)一步的提高。在使用只讀頁(yè)表時(shí),達(dá)到了FX8300的120%~125.6%。使用類虛擬化優(yōu)化方法時(shí),達(dá)到了FX8300的127.1%~128.9%。
與優(yōu)化前相比,龍芯KVM在中斷較為頻繁的測(cè)試項(xiàng)目中,性能提升了60.9%~215.1%,其中最主要的是在KVM中模擬VIOAPIC帶來(lái)的性能提升,占到了其中的52%~78%。另外22%~48%的性能提升是只讀頁(yè)表和類虛擬化優(yōu)化帶來(lái)的。
I/O中斷模擬的效率較低是I/O虛擬化中普遍存在的問(wèn)題。雖然半虛擬化I/O設(shè)備通過(guò)使用環(huán)形緩沖區(qū)能夠有效地減少虛擬機(jī)I/O中斷的次數(shù),但在部分場(chǎng)景下虛擬機(jī)仍會(huì)觸發(fā)較多的虛擬I/O中斷,影響性能和用戶體驗(yàn)。尤其在面對(duì)萬(wàn)兆網(wǎng)卡等高速I(mǎi)/O外設(shè)時(shí),虛擬機(jī)將會(huì)面臨更大的I/O中斷壓力。如果虛擬機(jī)使用傳統(tǒng)的模擬I/O中斷,部分場(chǎng)景下會(huì)損失40%左右的峰值性能[12]。為I/O中斷虛擬化添加硬件輔助,可以有效地提升虛擬機(jī)的I/O中斷性能,相對(duì)于純軟件模擬有性能優(yōu)勢(shì)[13]。在沒(méi)有硬件輔助的情況下,通過(guò)模擬流程和處理邏輯的優(yōu)化,也可以較大幅度地提升I/O中斷的性能。
本研究一方面參照其他架構(gòu)的優(yōu)化方法在KVM中實(shí)現(xiàn)I/O中斷子系統(tǒng)的模擬,并驗(yàn)證了其有效性;另一方面探索讓虛擬機(jī)直接使用內(nèi)存讀取I/O寄存器數(shù)據(jù),優(yōu)化虛擬機(jī)中斷處理邏輯,進(jìn)一步提升了虛擬機(jī)處理I/O中斷的性能。實(shí)測(cè)虛擬機(jī)的I/O中斷吞吐率有了較大的提升,一次I/O中斷的處理事件縮短了80%。對(duì)于部分I/O中斷較頻繁的場(chǎng)景,龍芯KVM虛擬機(jī)的性能有了成倍的提高。優(yōu)化后的I/O中斷吞吐量能夠滿足龍芯虛擬機(jī)使用半虛擬化設(shè)備時(shí)的需求。其中將I/O寄存器映射到內(nèi)存只讀頁(yè)、優(yōu)化虛擬中斷控制器邏輯的優(yōu)化方法也可以用到其他架構(gòu)的虛擬機(jī)上。