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