Labs 導(dǎo)讀
大型操作系統(tǒng)(比如Linux)的內(nèi)存管理的內(nèi)容是很豐富的,而內(nèi)存的虛擬化技術(shù)在OS內(nèi)存管理的基礎(chǔ)上又疊加了一層復(fù)雜性,需要對(duì)虛擬內(nèi)存再進(jìn)行虛擬化。本文將從“概述”、“軟硬件解決方案”和“內(nèi)存管理”四個(gè)方面探討內(nèi)存虛擬化技術(shù)。
1、內(nèi)存虛擬化概述
所謂的內(nèi)存虛擬化,即如何在多個(gè)虛擬機(jī)之間共享物理內(nèi)存以及如何進(jìn)行動(dòng)態(tài)分配。在《x86架構(gòu)基礎(chǔ)》一文中已經(jīng)介紹操作系統(tǒng)對(duì)物理服務(wù)器內(nèi)存管理的知識(shí),它的本質(zhì)就是將物理內(nèi)存地址映射到一段線性地址空間,也有叫邏輯地址空間,應(yīng)用程序訪問內(nèi)存物理地址是通過段頁(yè)查詢機(jī)制完成。而這個(gè)線性地址空間或邏輯地址空間本身就是物理內(nèi)存的虛擬化呈現(xiàn)。在虛擬化環(huán)境中,分配給虛擬機(jī)內(nèi)存非常類似于操作系統(tǒng)中關(guān)于線性地址空間的實(shí)現(xiàn)。操作系統(tǒng)負(fù)責(zé)維護(hù)虛頁(yè)號(hào)到實(shí)頁(yè)號(hào)的映射,并將這一 映射信息保存到頁(yè)表(Page Table)。在 x86架構(gòu)的CPU中,內(nèi)存管理單元MMU與TLB這兩個(gè)模塊就負(fù)責(zé)實(shí)現(xiàn)并優(yōu)化虛擬內(nèi)存的性能。詳見《DPDK技術(shù)在電信云中最佳實(shí)踐》系列文章。
一個(gè)操作系統(tǒng)對(duì)其物理內(nèi)存存在兩個(gè)主要的基本認(rèn)識(shí):物理地址從0開始和內(nèi)存地址連續(xù)性(至少在一些大的粒度上連續(xù))。
如上圖所示,而VMM與客戶機(jī)操作系統(tǒng)在對(duì)物理內(nèi)存的認(rèn)識(shí)上存在沖突,這使得真正擁有物理內(nèi)存的VMM必須對(duì)客戶機(jī)操作系統(tǒng)所訪問的內(nèi)存進(jìn)行一定程度的虛擬化。換句話說,就是VMM 負(fù)責(zé)將MMU進(jìn)行虛擬化,為客戶機(jī)操作系統(tǒng)提供一段連續(xù)的“物理”地址空間,而操作系統(tǒng)本身不會(huì)意識(shí)到這種變化,仍能夠?qū)⑻摂M機(jī)虛擬地址(Guest Virtual Address,GVA)映射到虛擬機(jī)物理地址(Guest Physical Address,GPA),但是需要VMM將虛擬機(jī)物理地址映射到物理機(jī)物理地址(Host Physical Address,HPA)。
所以,內(nèi)存虛擬化的本質(zhì)就是把物理機(jī)的真實(shí)物理內(nèi)存統(tǒng)一管理,包裝成多份虛擬的內(nèi)存給若干虛擬機(jī)使用。內(nèi)存虛擬化的核心,在于引入一層新的地址空間---客戶機(jī)物理地址空間,客戶機(jī)以為自己運(yùn)行在真實(shí)的物理地址空間中,實(shí)際上它是通過VMM訪問真實(shí)的物理地址的。在VMM中保存客戶機(jī)地址空間和物理機(jī)地址空間之間的映射表。
虛擬化系統(tǒng)中包括三層內(nèi)存地址空間:虛擬機(jī)虛擬地址GVA、虛擬機(jī)物理地址GPA和物理機(jī)物理地址HPA。因此,原先由MMU完成的線性地址到物理地址的映射已經(jīng)不能滿足,必須由VMM接入來完成這三層地址的映射維護(hù)和轉(zhuǎn)換。
- GVA:指GuestOS提供給其應(yīng)用程序使用的線性地址空間。
- GPA:經(jīng)VMM抽象的,虛擬機(jī)看到的偽物理地址空間。
- HPA:真實(shí)的機(jī)器地址,即地址總線上出現(xiàn)的地址信號(hào)。
為了實(shí)現(xiàn)上述映射和轉(zhuǎn)換關(guān)系,主要有兩種解決方案:軟件解決方案---影子頁(yè)表和硬件解決方案---Intel的EPT和AMD的RVI。
2、內(nèi)存虛擬化軟件解決方案
2.1 MMU半虛擬化(MMU Paravirtualization)
這種方式主要為Xen所用,MMU半虛擬化主要原理是:
- 當(dāng)Guest OS創(chuàng)建新頁(yè)表時(shí),VMM從維護(hù)的空閑內(nèi)存中為其分配頁(yè)面并進(jìn)行注冊(cè)。后續(xù),Guest OS對(duì)該頁(yè)表的寫操作都會(huì)陷入VMM進(jìn)行驗(yàn)證和轉(zhuǎn)換;VMM檢查頁(yè)表中的每一項(xiàng),確保它們只映射到屬于該虛擬機(jī)的機(jī)器頁(yè)面,而且不包含對(duì)頁(yè)表頁(yè)面的可寫映射。
- 然后,VMM會(huì)根據(jù)其維護(hù)的映射關(guān)系PA-MA,將頁(yè)表項(xiàng)中的虛擬機(jī)邏輯地址VA替換為相應(yīng)的機(jī)器地址MA。
- 最后把修改過的頁(yè)表載入MMU,MMU就可以根據(jù)修改過的頁(yè)表直接完成虛擬地址VA到機(jī)器地址MA的轉(zhuǎn)換。
這種方式的本質(zhì)是將映射關(guān)系VA-MA直接寫入Guest OS的頁(yè)表中,以替換原來的映射VA-PA映射關(guān)系。
2.2 影子頁(yè)表
相比較MMU半虛,大部分虛擬化廠商在VMM中還使用了一種稱為影子頁(yè)表(Shadow Page Table)的技術(shù)實(shí)現(xiàn)上述功能。對(duì)于每個(gè)虛擬機(jī)的主頁(yè)表(Primary Page Table),VMM都維持一個(gè)影子頁(yè)表來記錄和維護(hù)GVA與HPA的映射關(guān)系。
影子頁(yè)表包括以下兩種映射關(guān)系,
1)GVA>>>GPA,虛擬機(jī)操作系統(tǒng)負(fù)責(zé)維護(hù)從虛擬機(jī)邏輯地址到虛擬機(jī)物理地址的映射關(guān)系,VMM可以從虛擬機(jī)主頁(yè)表中獲取這種映射關(guān)系。
2)GPA>>>HPA,VMM負(fù)責(zé)維護(hù)從虛擬機(jī)物理地址到物理機(jī)物理地址的映射關(guān)系。
通過這種兩級(jí)映射的方式,VMM為Guest OS的每個(gè)頁(yè)表維護(hù)一個(gè)影子頁(yè)表,并將GVA-HPA的映射關(guān)系寫入影子頁(yè)表,Guest OS的頁(yè)表內(nèi)容保持不變,然后,VMM將影子頁(yè)表寫入MMU。同時(shí),又對(duì)虛擬機(jī)可訪問的內(nèi)存邊界進(jìn)行了有效控制。并且,使用TLB緩存影子頁(yè)表的內(nèi)容可以大大提高虛擬機(jī)問內(nèi)存的速度。
影子頁(yè)表的維護(hù)將帶來時(shí)間和空間上的較大開銷。時(shí)間開銷主要體現(xiàn)在Guest OS構(gòu)造頁(yè)表時(shí)不會(huì)主動(dòng)通知VMM,VMM必須等到Guest OS發(fā)生缺頁(yè)錯(cuò)誤時(shí)(必須Guest OS要更新主頁(yè)表),才會(huì)分析缺頁(yè)原因再為其補(bǔ)全影子頁(yè)表。而空間開銷主要體現(xiàn)在VMM需要支持多臺(tái)虛擬機(jī)同時(shí)運(yùn)行,每臺(tái)虛擬機(jī)的 Guest OS通常會(huì)為其上運(yùn)行的每個(gè)進(jìn)程創(chuàng)建一套頁(yè)表系統(tǒng),因此影子頁(yè)表的空間開銷會(huì)隨著進(jìn)程數(shù)量的增多而迅速增大。
為權(quán)衡時(shí)間開銷和空間開銷,現(xiàn)在一般采用影子頁(yè)表緩存(Shadow Page Table Cache)技術(shù),即VMM在內(nèi)存中維護(hù)部分最近使用過的影子頁(yè)表,只有當(dāng)影子頁(yè)表在緩存中找不到時(shí),才構(gòu)建一個(gè)新的影子頁(yè)表。當(dāng)前主要的虛擬化技術(shù)都采用了影子頁(yè)表緩存技術(shù)。
3、內(nèi)存虛擬化的硬件解決方案
為了解決影子頁(yè)表導(dǎo)致的上述開銷問題,除了使用影子頁(yè)表緩存技術(shù)外(這項(xiàng)技術(shù)雖然能避免時(shí)間上的一部分開銷,但是空間開銷還是實(shí)實(shí)在在存在的), Intel與AMD公司都針對(duì)MMU虛擬化給出了自 的解決方案:Intel公司在Nehalem微架構(gòu)CPU中推出擴(kuò)展頁(yè)表(Extended Page Table,EPT)技術(shù);AMD公司在四核皓龍CPU中推出快速虛擬化索引(Rapid Virtualization Index,RVI)技術(shù)。
RVI與EPT盡管在具體實(shí)現(xiàn)細(xì)節(jié)上有所不同,但是在設(shè)計(jì)理念上卻完全一致:通過在物理MMU中保存兩個(gè)不同的頁(yè)表,使得內(nèi)存地址的兩次映射都在硬件中完成,進(jìn)而達(dá)到提高性能的目的。具體來說,MMU中管理管理了兩個(gè)頁(yè)表,第一個(gè)是GVA >>>GPA,由虛擬機(jī)決定;第二個(gè)是GPA>>>HPA,對(duì)虛擬機(jī)透明,由VMM決定。根據(jù)這兩個(gè)映射頁(yè)表,CPU中的page walker就可以生成最近訪問過key-value鍵值對(duì) ,并緩存在TLB中(類似影子頁(yè)表緩存技術(shù)思路)。
另外,原來在影子頁(yè)表中由VMM維持的GPA>>>HPA映射關(guān)系,則由一組新的數(shù)據(jù)結(jié)構(gòu)擴(kuò)展頁(yè)表(Extended Page Table,也稱為Nested Page Table)來保存。由于GPA >>>HPA的映射關(guān)系非常定,并在虛擬機(jī)創(chuàng)建或修改頁(yè)表時(shí)無(wú)需更新,因此VMM在虛擬機(jī)更新頁(yè)表的時(shí)候無(wú)需進(jìn)行干涉。VMM也無(wú)需參與到虛擬機(jī)上下文切換,虛擬機(jī)可以自己修改GVA >>>GPA的頁(yè)表。
我們以Intel EPT技術(shù)為例說明。Intel EPT是Intel VT-x 提供的內(nèi)存虛擬化支持技術(shù),其基本原理下圖所示。在原有的CR3頁(yè)表地址映射的基礎(chǔ)上,EPT引入EPT頁(yè)表來實(shí)現(xiàn)另一次映射。比如:假設(shè)客戶機(jī)頁(yè)表和EPT頁(yè)表都是4級(jí)頁(yè)表,CPU完成一次地址轉(zhuǎn)換的基本過程如下:
CPU首先查找客戶機(jī)CR3寄存器指向的L4頁(yè)表。客戶機(jī)CR3寄存器給出的是GPA,所以,CPU通過EPT頁(yè)表將客戶機(jī)CR3中的GPA轉(zhuǎn)換為HPA:CPU 首先查找EPT TLB,如果沒有相應(yīng)的記錄,就進(jìn)一步查找EPT頁(yè)表,如果還沒有,CPU則拋出EPT Violation異常交給VMM處理。
CPU獲得L4頁(yè)表地址(指的是HPA)后,CPU根據(jù)GVA和L4頁(yè)表項(xiàng)的內(nèi)容來獲取L3 頁(yè)表項(xiàng)的GPA。如果L4頁(yè)表中GVA對(duì)應(yīng)的表項(xiàng)顯示為“缺頁(yè)”,那么CPU 產(chǎn)生Page Fault,直接交由客戶機(jī)操作系統(tǒng)處理。獲得L3 頁(yè)表項(xiàng)的GPA后,CPU通過查詢EPT頁(yè)表來將L3的GPA轉(zhuǎn)換為HPA。同理,CPU 會(huì)依次完成L2、L1頁(yè)表的查詢,獲得GVA所對(duì)應(yīng)的GPA,然后進(jìn)行最后一次查詢EPT頁(yè)表獲得HPA。
正如上圖所示,CPU需要5次查詢EPT頁(yè)表,每次查詢都需要4次內(nèi)存訪問。這樣,在最壞的情況下總共需要20次內(nèi)存訪問。EPT硬件通過增大EPT TLB 盡量減少內(nèi)存訪問。
4、內(nèi)存虛擬化管理
在虛擬化環(huán)境中,內(nèi)存是保證虛擬機(jī)工作性能的關(guān)鍵因素。如何盡可能提高虛擬機(jī)的性能、提高內(nèi)存利用率、降低虛擬機(jī)上下文切換的內(nèi)存開銷,依然非常復(fù)雜,這就引入了內(nèi)存虛擬化管理的問題。像介紹CPU虛擬化管理一樣,我們還是通過實(shí)例來說明內(nèi)存的虛擬化管理。以VMware的ESX解決方案為例,在沒有出現(xiàn)硬件支持的內(nèi)存虛擬化技術(shù)之前,ESX/ESXi采用影子頁(yè)表來實(shí)現(xiàn)虛擬機(jī)的虛擬地址到物理機(jī)物理地址的快速轉(zhuǎn)換。當(dāng)Intel和AMD公司分別推出了EPT與RIV技術(shù)之后,ESX/ESXi很快轉(zhuǎn)向硬件支持來提高內(nèi)存虛擬化的性能。
4.1 內(nèi)存復(fù)用技術(shù)
在虛擬化內(nèi)存管理 上,ESX/ESXi實(shí)現(xiàn)了主機(jī)內(nèi)存超分配的目標(biāo):即多個(gè)虛擬機(jī)總的內(nèi)存分配量大于物理機(jī)的實(shí)際內(nèi)存容量。如下圖所示,一個(gè)物理內(nèi)存只有4GB的Host,可以同時(shí)運(yùn)行三個(gè)內(nèi)存配置為2GB的虛擬機(jī)。
主機(jī)內(nèi)存超分配功能意味著VMM必須能夠有效地回收虛擬機(jī)中不斷釋放的內(nèi)存,并在有限的內(nèi)存容量中盡能 地提高內(nèi)存利用率。因?yàn)椋琀ost Memory與Guest Memory并不是一一對(duì)應(yīng)的關(guān)系,通過Host Memory超配技術(shù)可以實(shí)現(xiàn)某一個(gè)Host上某一個(gè)虛擬機(jī)內(nèi)存大于主機(jī)內(nèi)存,這一點(diǎn)與CPU虛擬化不一樣。但是,在執(zhí)行超配技術(shù)時(shí),需要考慮主機(jī)性能問題,不能過大。一般的超配限額是主機(jī)內(nèi)存的50%。要實(shí)現(xiàn)主機(jī)內(nèi)存超配,必須通過內(nèi)存復(fù)用技術(shù)實(shí)現(xiàn)。目前常用的內(nèi)存復(fù)用技術(shù)有:零頁(yè)共享技術(shù)、內(nèi)存氣球回收技術(shù)和內(nèi)存置換技術(shù)三種。
4.1.1 零頁(yè)(透明頁(yè))共享技術(shù)
當(dāng)運(yùn)行多個(gè)虛擬機(jī)時(shí),有些內(nèi)存頁(yè)面的內(nèi)容很可能是完全一樣的,比如:什么數(shù)據(jù)都沒有的零頁(yè)。這就為虛擬機(jī)之間甚至在虛擬機(jī)內(nèi)部提供了共享內(nèi)存的可能。例如:當(dāng)幾個(gè)虛擬機(jī)都運(yùn)行相同的操作系統(tǒng)、相同的應(yīng)用程序或者包含相同的用戶數(shù)據(jù)時(shí),那些包含相同數(shù)據(jù)的內(nèi)存頁(yè)面完可以被共享。基于這個(gè)原理,VMM完全可通過回收冗余數(shù)據(jù)的內(nèi)存頁(yè)面,僅維持一個(gè)被多個(gè)虛擬機(jī)共享的內(nèi)存拷貝來實(shí)現(xiàn)這個(gè)功能。
原理如下:用戶進(jìn)程定時(shí)掃描虛擬機(jī)的的內(nèi)存數(shù)據(jù),如果發(fā)現(xiàn)其數(shù)據(jù)內(nèi)容全為零,則通過修改PA to MA映射的形式,把其指向一個(gè)特定的零頁(yè),從而做到在物理內(nèi)存中只保留一份零頁(yè)拷貝,虛擬機(jī)的所有零頁(yè)均指向該頁(yè),從而達(dá)到節(jié)省內(nèi)存資源的目的。當(dāng)零頁(yè)數(shù)據(jù)發(fā)生變動(dòng)時(shí),由Xen動(dòng)態(tài)分配一頁(yè)內(nèi)存出來給虛擬機(jī),使修改后的數(shù)據(jù)有內(nèi)存頁(yè)進(jìn)行存放。因此,對(duì)GuestOS來說,整個(gè)零頁(yè)共享技術(shù)是完全不感知的。
而在VMware的ESX解決方案中,也有同樣的技術(shù)。在VMware ESX/ESXi中,檢測(cè)頁(yè)面數(shù)據(jù)是否冗余是通過散列的方法來實(shí)現(xiàn)的。
首先VMM會(huì)維持一個(gè)全局散列表,其中每個(gè)表項(xiàng)都記錄了一個(gè)物理頁(yè)面數(shù)據(jù)的散列值與頁(yè)號(hào)。當(dāng)對(duì)某一個(gè)虛擬機(jī)進(jìn)行頁(yè)面共享掃描時(shí),VMM會(huì)針對(duì)該虛擬機(jī)物理頁(yè)面的數(shù)據(jù)計(jì)算散列值,并在全局散列表 中進(jìn)行遍歷及匹配是否有相同的散列值的表項(xiàng)。當(dāng)找到了匹配的表項(xiàng),還要對(duì)頁(yè)面數(shù)據(jù)內(nèi)容逐位比較,以避免由于散列沖突而導(dǎo)致的頁(yè)面內(nèi)容不一樣的可能性。一旦確定頁(yè)面數(shù)據(jù)完全一致,則會(huì)修改邏輯地址到物理地址的映射關(guān)系,即將從邏輯地址對(duì)應(yīng)到包含冗余數(shù)據(jù)的物理地址的映射關(guān)系(上圖中虛線所示)改為對(duì)應(yīng)到要被共享物理地址的映射關(guān)系,并回收冗余的物理頁(yè)面。這一過程對(duì)于虛擬機(jī)操作系統(tǒng)是完全透明的。因此,共享頁(yè)面中含有敏感數(shù)據(jù)的部分不會(huì)在虛擬機(jī)之間泄露。
當(dāng)虛擬機(jī)對(duì)共享頁(yè)面發(fā)生寫操作時(shí),通過“寫時(shí)拷貝”( Copy-on-Write)技術(shù)來實(shí)現(xiàn)。
具體來說,任何一個(gè)對(duì)共享頁(yè)面的寫操作都會(huì)引發(fā)頁(yè)面錯(cuò)誤(Minor Page Fault)。當(dāng)VMM捕獲到這個(gè)錯(cuò)誤時(shí),會(huì)給發(fā)起寫操作的虛擬機(jī)創(chuàng)建一個(gè)該頁(yè)面的私有拷貝,并將被寫的邏輯地址映射到這個(gè)私有拷貝頁(yè)面。這樣虛擬機(jī)就可以安全地進(jìn)行寫操作,并且不會(huì)影響到其他共享該頁(yè)面的虛擬機(jī)。相比于對(duì)非共享頁(yè)面的寫操作,盡管這種處理方法的確導(dǎo)致了一些額外的開銷,但是卻在一定程度上提高了內(nèi)存頁(yè)面的利用率。
4.1.2 內(nèi)存氣球回收技術(shù)
內(nèi)存氣球回收技術(shù)也稱為內(nèi)存氣泡技術(shù),基于氣球回收法的內(nèi)存管理機(jī)制與頁(yè)面共享完全不同。在虛擬化環(huán)境中,VMM會(huì)一次性在虛擬機(jī)啟動(dòng)后分配給虛擬機(jī)內(nèi)存,由于虛擬機(jī)并沒有意識(shí)到自己運(yùn)行于 虛擬化平臺(tái)上,之后它會(huì)一直運(yùn)行在分配好的內(nèi)存空間,而不主動(dòng)釋放分配的物理內(nèi)存給其他虛擬機(jī)。因此VMM需要一種機(jī)制使得虛擬機(jī)能夠主動(dòng)釋放空閑內(nèi)存歸還給物理機(jī),再由VMM分配給其他有需求的虛擬機(jī)。并且,在內(nèi)存資源需求緊張時(shí)還能從物理機(jī)中“拿回”自己釋放的那部分內(nèi)存。
原理如下:Hypervisor通過利用預(yù)裝在用戶虛擬機(jī)中的前端驅(qū)動(dòng)程序,“偷取”Guest OS的內(nèi)存貢獻(xiàn)給VMM,以供其他虛擬機(jī)使用,反向時(shí)由VMM“偷取”氣泡中的內(nèi)存給特定虛擬機(jī)使用。內(nèi)存氣泡本質(zhì)是將較為空閑的虛擬機(jī)內(nèi)存釋放給內(nèi)存使用率較高的虛擬機(jī),從而提升內(nèi)存利用率。
在VMware的ESX解決方案中,也有類似的技術(shù)。
在上圖(a)中,VMM有四個(gè)頁(yè)面被映射到虛擬機(jī)的內(nèi)存頁(yè)面空間中,其中左側(cè)兩個(gè)頁(yè)面被應(yīng)用程序占用,而另兩個(gè)被打上星號(hào)的頁(yè)面則是在內(nèi)存空閑列表中。當(dāng)VMM要從虛擬機(jī)中回收內(nèi)存時(shí),比如要回收兩個(gè)內(nèi)存頁(yè)面,VMM就會(huì)將Balloon驅(qū)動(dòng)的目標(biāo)膨脹大小設(shè)置為兩個(gè)頁(yè)面。Balloon驅(qū)動(dòng)獲得了目標(biāo)膨脹值之后,就會(huì)在虛擬機(jī)內(nèi)部申請(qǐng)兩個(gè)頁(yè)面空間的內(nèi)存,并如上圖(b)所示,調(diào)用虛擬機(jī)操系統(tǒng)的接口標(biāo)示這兩個(gè)頁(yè)面被“ 釘住”,即不能再被分配出去。
內(nèi)存申請(qǐng)完畢后,Balloon驅(qū)動(dòng)會(huì)通知VMM這兩個(gè)頁(yè)面的頁(yè)號(hào),這樣VMM就可以找到相應(yīng)的物理頁(yè)號(hào)并進(jìn)行回收。在上(b)中虛線就標(biāo)示了這兩個(gè)頁(yè)面從虛擬機(jī)分配出去的狀態(tài)。
由于被釋放的頁(yè)面在釋放前已經(jīng)在虛擬機(jī)的空閑列表中,因此沒有進(jìn)程會(huì)對(duì)該頁(yè)面進(jìn)行讀寫操作。如果虛擬機(jī)的進(jìn)程接下來要重新訪問這些頁(yè)面,那么VMM可以像平常分配內(nèi)存一樣,再分配新的物理內(nèi)存給這臺(tái)虛擬機(jī)。當(dāng)VMM決定收縮氣球膨脹大小時(shí),通過設(shè)置更小的目標(biāo)膨脹值,balloon驅(qū)動(dòng)會(huì)將已經(jīng)被“釘住” 的頁(yè)面歸還給虛擬機(jī)。
通過氣球回收法,盡管虛擬機(jī)的負(fù)載略微增加,但VMM卻成功地將系統(tǒng)內(nèi)存壓力轉(zhuǎn)移到各個(gè)虛擬機(jī)上。當(dāng)balloon驅(qū)動(dòng)發(fā)起申請(qǐng)內(nèi)存的請(qǐng)求時(shí),由虛擬機(jī)操作系統(tǒng)決定了是否要將虛擬機(jī)物理內(nèi)存換出來滿足balloon驅(qū)動(dòng)的申請(qǐng)內(nèi)存請(qǐng)求。如果虛擬機(jī)有充足的空閑內(nèi)存,那么balloon驅(qū)動(dòng)申請(qǐng)內(nèi)存并不會(huì)對(duì)虛擬機(jī)的性能造成影響;如果虛擬機(jī)內(nèi)存已經(jīng)吃緊,那么就需要由虛擬機(jī)的操作系統(tǒng)決定換出哪些內(nèi)存頁(yè)面,滿足balloon驅(qū)動(dòng)的請(qǐng)求。因此,氣球回收法巧妙地利用了各個(gè)虛擬機(jī)操作系統(tǒng)的內(nèi)存換頁(yè)機(jī)制來確定哪些頁(yè)面要被釋放給物理機(jī),而不是由VMM來決定。
氣球回收法要求虛擬機(jī)操作系統(tǒng)必須安裝balloon驅(qū)動(dòng),在VMware的ESX/ESXi產(chǎn)品中,就是VMware Tool。另外,氣球回收法回收內(nèi)存需要一段時(shí)間,不能馬上滿足系統(tǒng)的需求。
4.1.3 內(nèi)存置換技術(shù)
頁(yè)面共享機(jī)制與氣球回收法都從不同的角度盡可能地提高虛擬機(jī)的內(nèi)存利用率,從虛擬機(jī)中收回可以復(fù)用或者空閑的內(nèi)存。然而這兩種方法都不能在短時(shí)間內(nèi)滿足系統(tǒng)內(nèi)存回收的要求:頁(yè)面共享依賴于頁(yè)面的掃描速度,以及是否有頁(yè)面可共享;氣球回收法則取決于虛擬機(jī)操作系統(tǒng)對(duì)于balloon驅(qū)動(dòng)申請(qǐng)內(nèi)存的響應(yīng)時(shí)間。如果這兩種溫和的方法都不能滿足需求,VMM則會(huì)采取內(nèi)存換出機(jī)制,即強(qiáng)制性地從虛擬機(jī)中奪回內(nèi)存,這就是內(nèi)存置換技術(shù)。
原理如下:通過VMM實(shí)現(xiàn)請(qǐng)頁(yè)功能,這時(shí)Guest OS類似進(jìn)程一樣在VMM缺少內(nèi)存時(shí),能被換出到宿主機(jī)磁盤上,也就是將虛擬機(jī)長(zhǎng)時(shí)間未訪問的內(nèi)存內(nèi)容被置換到存儲(chǔ)中,并建立映射,當(dāng)虛擬機(jī)再次訪問該內(nèi)存內(nèi)容時(shí)再置換回來。該方法也對(duì)虛擬機(jī)透明,即虛擬機(jī)不感知。
具體來說,VMM會(huì)在每個(gè)虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建一個(gè)單獨(dú)的換頁(yè)文件(Swap File)。在必要的時(shí)候,VMM會(huì)主動(dòng)將虛擬機(jī)的物理內(nèi)存頁(yè)面換到這個(gè)換頁(yè)文件上,釋放給其他虛擬機(jī)使用。內(nèi)存換出機(jī)制是VMM需要在短時(shí)間內(nèi)緩解內(nèi)存壓力的一種有效方法,然而這種方法卻很可能嚴(yán)重導(dǎo)致VMM的性能下降。由于VMM對(duì)于虛擬機(jī)的內(nèi)存使用狀態(tài)并不解,且該方法對(duì)虛擬機(jī)透明,強(qiáng)制內(nèi)存換出可能觸發(fā)虛擬機(jī)操作系統(tǒng)內(nèi)部的一些換頁(yè)機(jī)制。舉例來說,虛擬機(jī)操作系統(tǒng)永遠(yuǎn)都不會(huì)將內(nèi)核的內(nèi)存頁(yè)面換出,而VMM并不知道哪些頁(yè)正在被內(nèi)核使用,一旦這些頁(yè)面被換出,會(huì)使得虛擬機(jī)性能嚴(yán)重受損。
4.2 內(nèi)存的回收
接下來以VMware ESX為例,結(jié)合上述三種內(nèi)存復(fù)用技術(shù),介紹內(nèi)存回收機(jī)制。一般來說,ESX會(huì)對(duì)物理機(jī)的空閑內(nèi)存狀態(tài)按照空閑內(nèi)存的百分比設(shè)置四種狀態(tài),分別是:高(6%)、平緩(4%)、繁重(2%)和低(1%)。ESX會(huì)按照這四種狀態(tài)來選擇前述三種內(nèi)存回收機(jī)制。
缺省狀態(tài)下,ESX會(huì)啟用頁(yè)面共享機(jī)制,因?yàn)轫?yè)面共享機(jī)制能以較小的開銷提高內(nèi)存利用率。何時(shí)啟用氣球回收和換頁(yè)則取決于當(dāng)前系統(tǒng)的內(nèi)存狀態(tài)。當(dāng)內(nèi)存狀態(tài)處于“高”,很顯然此時(shí)總的虛擬機(jī)內(nèi)存使用量要小于物理機(jī)的內(nèi)存容量,因此不管虛擬機(jī)的內(nèi)存是否已經(jīng)被過載分配,VMM都不會(huì)使用氣球 或者換頁(yè)的方法回收內(nèi)存。
然而,當(dāng)物理機(jī)空閑內(nèi)存狀態(tài)下降到了“平緩” 狀態(tài),VMM則開始使用氣球回收法。事實(shí)上,氣球回收法是在空閑內(nèi)存的百分比高于“平緩” 的閾值4%之前啟動(dòng)的,這是因?yàn)樵摲椒偸切枰欢螘r(shí)間才能在虛擬機(jī)內(nèi)申請(qǐng)到一些內(nèi)存。通常氣球回收法都能夠及時(shí)將空閑內(nèi)存比的閾值控制在“平緩”狀態(tài)之上。
一旦氣球回收法不能夠及時(shí)回收內(nèi)存,并且空閑內(nèi)存下降到“繁重”狀態(tài),即空閑內(nèi)存比低于2%,那么VMM就會(huì)再啟動(dòng)內(nèi)存換出機(jī)制強(qiáng)制從虛擬機(jī)回收內(nèi)存。使用這種辦法,VMM能夠很快回收內(nèi)存,并將空閑內(nèi)存比控制回“平緩”狀態(tài)。
在最壞的情況下,萬(wàn)一空閑內(nèi)存狀態(tài)低于“低”狀態(tài),即空閑內(nèi)存比低于1%,那么VMM會(huì)繼續(xù)使用內(nèi)存換出法,同時(shí)將那些消耗內(nèi)存值超過內(nèi)存配置值的虛擬機(jī)掛起。
在某些情況下,VMM可能不會(huì)考慮物理機(jī)空閑內(nèi)存狀態(tài),而仍然啟動(dòng)物理機(jī)內(nèi)存回收機(jī)制。比如,即使整個(gè)系統(tǒng)的物理機(jī)空閑內(nèi)存狀態(tài)為“高”,如果某個(gè)虛擬機(jī)的內(nèi)存使用量超過了其指定的內(nèi)存上限,那么VMM會(huì)啟動(dòng)氣球回收法,如有必要,也會(huì)啟動(dòng)內(nèi)存換出機(jī)制從虛擬機(jī)回收內(nèi)存,直到該虛擬機(jī)的內(nèi)存低于指定的內(nèi)存上限。
4.3 內(nèi)存QoS保障
在虛擬化系統(tǒng)中,內(nèi)存虛擬化的QoS保障包括兩個(gè)基本特征:預(yù)留和份額。
內(nèi)存預(yù)留:虛擬機(jī)預(yù)留的最低內(nèi)存。預(yù)留的內(nèi)存會(huì)被VM獨(dú)占。即,一旦內(nèi)存被某個(gè)虛擬機(jī)預(yù)留,即使虛擬機(jī)實(shí)際內(nèi)存使用量不超過預(yù)留量,其它VM也無(wú)法搶占該VM的內(nèi)存空閑資源。即,上述的三種內(nèi)存復(fù)用技術(shù)對(duì)該虛擬機(jī)不生效。
內(nèi)存份額:適用上述三種資源復(fù)用場(chǎng)景,按比例分配內(nèi)存資源。以6G內(nèi)存規(guī)格的主機(jī)為例,假設(shè)其上運(yùn)行有3臺(tái)4G內(nèi)存規(guī)格的虛擬機(jī)VMA,VMB,VMC。內(nèi)存份額分別為20480,20480,40960,那么其內(nèi)存分配比例為1:1:2。當(dāng)三臺(tái)VM內(nèi)部逐步加壓,策略會(huì)根據(jù)三個(gè)虛擬機(jī)的份額按比例分配調(diào)整內(nèi)存資源,最終三臺(tái)虛擬機(jī)獲得的內(nèi)存量穩(wěn)定為1.5G/1.5G/3G。
?同樣需要注意一點(diǎn):內(nèi)存份額只在各虛擬機(jī)發(fā)生資源競(jìng)爭(zhēng)時(shí)生效。如沒有競(jìng)爭(zhēng),則有需求的虛擬機(jī)可獨(dú)占物理內(nèi)存。
但是,內(nèi)存QoS不像CPU QoS一樣設(shè)置上限?,這是因?yàn)榉峙浣o虛擬機(jī)的內(nèi)存大小就是其內(nèi)存上限。
原文地址:https://zhuanlan.51cto.com/art/202112/696129.htm