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