99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

StratoVirt 中的 balloon 設(shè)備介紹

openEuler ? 來源:openEuler ? 作者:openEuler ? 2021-12-21 14:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

StratoVirt 是計算產(chǎn)業(yè)中面向云數(shù)據(jù)中心的企業(yè)級虛擬化 VMM,實現(xiàn)了一套架構(gòu)統(tǒng)一支持虛擬機、容器、Serverless 三種場景。StratoVirt 在輕量低噪、軟硬協(xié)同、Rust 語言級安全等方面具備關(guān)鍵技術(shù)競爭優(yōu)勢。

背景介紹:

通常,在同一臺服務(wù)器上存在著不同的用戶,而多數(shù)用戶對內(nèi)存的使用情況是一種間斷性的使用。也就是說用戶對內(nèi)存的使用率并不是很高。在服務(wù)器這種多用戶的場景中,如果很多個用戶對于內(nèi)存的使用率都不高的話,那么會存在服務(wù)器實際占用的內(nèi)存并不飽滿這樣一種情況。實際上各個用戶使用內(nèi)存的分布圖可能如下圖所示(黃色部分表示 used 部分,綠色部分表示 free 的部分)。

解決方案:

為了解決上述服務(wù)器上內(nèi)存使用率低的問題,可以將虛擬機中暫時不用的內(nèi)存回收回來給其他虛擬機使用。而當(dāng)被回收內(nèi)存的虛擬機需要內(nèi)存時,由 host 再將內(nèi)存歸還回去。有了這樣的內(nèi)存伸縮能力,服務(wù)器便可以有效提高內(nèi)存的使用率。在 StratoVirt 中,我們使用 balloon 設(shè)備來對虛擬機中的空閑內(nèi)存進行回收和釋放。下面詳細(xì)了解一下 StratoVirt 中的 balloon 設(shè)備。

balloon 設(shè)備簡介:

由于 StratoVirt 只是負(fù)責(zé)為虛擬機分配內(nèi)存,只能感知到每個虛擬機總的內(nèi)存大小。但是在每個虛擬機中如何使用內(nèi)存,內(nèi)存剩余多少。StratoVirt 是無法感知的,也就無法得知該從虛擬機中回收多少內(nèi)存了。為此,需要在虛擬機中放置一個“氣球(balloon)”設(shè)備。該設(shè)備通過 virtio 半虛擬化框架來實現(xiàn)前后端通信。當(dāng) Host 端需要回收虛擬機內(nèi)部的空閑內(nèi)存時,balloon 設(shè)備“充氣”膨脹,占用虛擬機內(nèi)部內(nèi)存。而將占用的內(nèi)存交給 Host 使用。如果虛擬機的空閑內(nèi)存被回收后,虛擬機內(nèi)部由于業(yè)務(wù)要求突然需要內(nèi)存時。位于虛擬機內(nèi)部的 balloon 設(shè)備可以選擇“放氣”縮小。釋放出更多的內(nèi)存空間給虛擬機使用。

balloon 實現(xiàn):

balloon 的具體代碼實現(xiàn)位于 StratoVirt 項目的/virtio/src/balloon.rs 文件中,相關(guān)細(xì)節(jié)可閱讀代碼理解。代碼架構(gòu)如下:

virtio
├──Cargo.toml
└──src
├──balloon.rs
├──block.rs
├──console.rs
├──lib.rs
├──net.rs
├──queue.rs
├──rng.rs
├──vhost
│├──kernel
││├──mod.rs
││├──net.rs
││└──vsock.rs
│└──mod.rs
├──virtio_mmio.rs
└──virtio_pci.rs

由于 balloon 是一個 virtio 設(shè)備,所以在前后端通信時也使用了 virtio 框架提供的 virtio queue。當(dāng)前 StratoVirt 支持兩個隊列:inflate virtio queue(ivq)和 deflate virtio queue(dvq)。這兩個隊列分別負(fù)責(zé) balloon 設(shè)備的“充氣”和“放氣”。

氣球的充放氣時,前后端的信息是通過一個結(jié)構(gòu)體來傳遞。

structVirtioBalloonConfig{
///NumberofpageshostwantsGuesttogiveup.
pubnum_pages:u32,
///Numberofpageswe'veactuallygotinballoon.
pubactual:u32,
}

因此后端向前端要內(nèi)存的時候,只需要修改這個結(jié)構(gòu)體中的 num_pages 的數(shù)值,然后通知前端。前端讀取配置結(jié)構(gòu)體中的 num_pages 成員。并與本身結(jié)構(gòu)體中的 actual 對比,判斷是進行 inflate 還是 deflate。

inflate

如果是 inflate,那么虛擬機以 4k 頁為單位去申請?zhí)摂M機內(nèi)存,并將申請到的內(nèi)存地址保存在隊列中。然后通過 ivq 將保存了分配好的頁面地址的數(shù)組分批發(fā)往后端處理(virtio queue 隊列長度最大 256,也就是一次最多只能傳輸 1M 內(nèi)存信息,對于大于 1M 的內(nèi)存只能分批傳輸)。后端通過得到信息后,找到相應(yīng)的 MemoryRegion,將對應(yīng)的 page 標(biāo)記為”WILLNEED“。然后通知前端,完成配置。

deflate

如果是 deflate 則從保存申請到的內(nèi)存地址隊列中彈出一部分內(nèi)存的地址。通過 dvq 分批次傳輸給后端處理。后端將 page 標(biāo)記為“DONTNEED"。

下面結(jié)合代碼進行說明:

定義 BalloonIoHandler 結(jié)構(gòu)體作為處理 balloon 事件的主體。

structBalloonIoHandler{
///Thefeaturesofdriver.
driver_features:u64,
///Addressspace.
mem_space:Arc,
///Inflatequeue.
inf_queue:Arc>,
///InflateEventFd.
inf_evt:EventFd,
///Deflatequeue.
def_queue:Arc>,
///DeflateEventFd.
def_evt:EventFd,
/*省略*/
}

其中包含上述的兩個 virtio 隊列inf_queue和def_queue,以及對應(yīng)的觸發(fā)事件描述符(EventFd)inf_evt和def_evt。兩個隊列均使用了Mutex鎖,保證了隊列在同一時刻只有一個使用者對該隊列進行操作。保證了多線程共享的數(shù)據(jù)安全。

fnprocess_balloon_queue(&mutself,req_type:bool)->Result<()>{
letqueue=ifreq_type{
&mutself.inf_queue
}else{
&mutself.def_queue
};//獲得對應(yīng)的隊列
letmutunlocked_queue=queue.lock().unwrap();
whileletOk(elem)=unlocked_queue
.vring
.pop_avail(&self.mem_space,self.driver_features)
{
matchRequest::parse(&elem){
Ok(req)=>{
if!self.mem_info.has_huge_page(){
//進行內(nèi)存標(biāo)記
req.mark_balloon_page(req_type,&self.mem_space,&self.mem_info);
}
/*省略*/
}
Err(e)=>{
/*省略錯誤處理*/
}
}
}
/*省略*/
}

當(dāng)相應(yīng)的EventFd被觸發(fā)后process_balloon_queue函數(shù)將會被調(diào)用。通過判斷請求類型確定是“充氣”還是”放氣“,然后再從相應(yīng)的隊列中取數(shù)據(jù)進行內(nèi)存標(biāo)記。其中while let是 Rust 語言提供的一種循環(huán)模式匹配機制。借助該語法可以將隊列中 pop 出來的所有數(shù)據(jù)遍歷取出到elem中。

內(nèi)存標(biāo)記及優(yōu)化:

標(biāo)記內(nèi)存在mark_balloon_page函數(shù)中進行實現(xiàn),起初的實現(xiàn)思路為:將虛擬機傳送過來的地址逐個進行標(biāo)記。即,從隊列中取出一個元素,轉(zhuǎn)化為地址后立即進行標(biāo)記。后來經(jīng)過測試發(fā)現(xiàn):balloon 設(shè)備在對頁地址進行一頁一頁標(biāo)記內(nèi)存時花費時間巨大。而同時也發(fā)現(xiàn)通過虛擬機傳回來的地址中有大段的連續(xù)內(nèi)存段。于是通過改變標(biāo)記方法:由原來的一頁一頁標(biāo)記改為將這些連續(xù)的內(nèi)存統(tǒng)一標(biāo)記。大大節(jié)省了標(biāo)記時間。下面代碼為具體實現(xiàn):

fnmark_balloon_page(
&self,
req_type:bool,
address_space:&Arc,
mem:&BlnMemInfo,
){
letadvice=ifreq_type{
libc::MADV_DONTNEED
}else{
libc::MADV_WILLNEED
};
/*略*/
foriovinself.iovec.iter(){
letmutoffset=0;
letmuthvaset=Vec::new();
whileletSome(pfn)=iov_to_buf::(address_space,iov,offset){
offset+=std::()asu64;
letgpa:GuestAddress=GuestAddress((pfnasu64)<addr,
None=>{
/*略*/
}
};
//將hva地址保存在hvaset的vec中
hvaset.push(hva);
}
//對hvaset進行從小到大排序。
hvaset.sort_by_key(|&b|Reverse(b));
/*略*/
//將hvaset中連續(xù)的內(nèi)存段進行標(biāo)記
whileletSome(hva)=hvaset.pop(){
iflast_addr==0{
free_len+=1;
start_addr=hva;
}elseifhva==last_addr+BALLOON_PAGE_SIZE{
free_len+=1;
}else{
memory_advise(
start_addras*constlibc::c_voidas*mut_,
(free_len*BALLOON_PAGE_SIZE)asusize,
advice,
);
free_len=1;
start_addr=hva;
}

ifcount_iov==iov.iov_len{
memory_advise(
start_addras*constlibc::c_voidas*mut_,
(free_len*BALLOON_PAGE_SIZE)asusize,
advice,
);
}
count_iov+=std::()asu64;
last_addr=hva;
}
/*略*/
}
}
}

首先將 virtio 隊列中的地址全部取出,并保存在 vec 中,然后將該 vec 進行從小到大的排序。有利于快速找出連續(xù)的內(nèi)存段并進行標(biāo)記。由于 hvaset 中的地址是按照從小到大排列的,因此可以從頭開始遍歷 hvaset,遇到不連續(xù)的地址后將前面的連續(xù)段進行標(biāo)記。這樣就完成了由原來逐頁標(biāo)記到連續(xù)內(nèi)存段統(tǒng)一標(biāo)記的優(yōu)化。

經(jīng)過測試,StratoVirt 的 balloon 速度也有了極大的提高。

原文標(biāo)題:StratoVirt 基于 Rust 的 balloon 功能實踐

文章出處:【微信公眾號:openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9787

    瀏覽量

    87910
  • 虛擬機
    +關(guān)注

    關(guān)注

    1

    文章

    966

    瀏覽量

    29336
  • 數(shù)據(jù)安全
    +關(guān)注

    關(guān)注

    2

    文章

    725

    瀏覽量

    30431

原文標(biāo)題:StratoVirt 基于 Rust 的 balloon 功能實踐

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    SNMP協(xié)議在設(shè)備監(jiān)控的使用

    介紹,并提供使用SNMP進行網(wǎng)絡(luò)管理的基本指南。 1.簡介 SNMP(Simple Network Management Protocol)是一個基于互聯(lián)網(wǎng)協(xié)議族(IP)的網(wǎng)絡(luò)管理標(biāo)準(zhǔn),用于在IP網(wǎng)絡(luò)的管理節(jié)點與被管理節(jié)點之間進行通信,以實現(xiàn)對網(wǎng)絡(luò)
    的頭像 發(fā)表于 06-27 11:48 ?130次閱讀
    SNMP協(xié)議在<b class='flag-5'>設(shè)備</b>監(jiān)控<b class='flag-5'>中</b>的使用

    YAGEO與Pulse產(chǎn)品在物聯(lián)網(wǎng)設(shè)備的應(yīng)用

    隨著物聯(lián)網(wǎng)(IoT)技術(shù)的快速發(fā)展,設(shè)備之間的高效、可靠連接成為關(guān)鍵課題。在物聯(lián)網(wǎng)系統(tǒng),集成連接器模塊、功率器件與保護器件的協(xié)同應(yīng)用,不僅能確保數(shù)據(jù)與電力傳輸?shù)姆€(wěn)定性,還能提升系統(tǒng)的安全性與耐用性
    的頭像 發(fā)表于 04-25 15:00 ?543次閱讀

    不同設(shè)備電源濾波器接線方式的差異

    本文闡述了電源濾波器在不同設(shè)備的重要性,并針對家用電器、工業(yè)設(shè)備、醫(yī)療設(shè)備以及通信設(shè)備分別介紹
    的頭像 發(fā)表于 03-28 17:16 ?374次閱讀
    不同<b class='flag-5'>設(shè)備</b><b class='flag-5'>中</b>電源濾波器接線方式的差異

    電源設(shè)備噪聲濾波器的作用介紹

    在電源設(shè)備這片關(guān)鍵領(lǐng)域中,噪聲濾波器扮演著不可或缺的守護者角色,肩負(fù)著保障電源純凈、穩(wěn)定運行以及與之相連電子設(shè)備正常工作的重任,其作用體現(xiàn)在多個關(guān)鍵層面。 電源設(shè)備的輸入源往往并非理想的純凈電源
    的頭像 發(fā)表于 02-04 11:48 ?494次閱讀

    芯科科技Z-Wave設(shè)備測試工具介紹

    本篇技術(shù)博文將介紹SiliconLabs(芯科科技)提供的Z-Wave設(shè)備測試工具,通過使用一個舊的Z-Wave DUT項目來測試Z-Wave設(shè)備,以確保設(shè)備可以正常工作。
    的頭像 發(fā)表于 01-17 09:39 ?602次閱讀
    芯科科技Z-Wave<b class='flag-5'>設(shè)備</b>測試工具<b class='flag-5'>介紹</b>

    電源管理技術(shù)在移動設(shè)備的應(yīng)用

    隨著移動設(shè)備的普及,電源管理技術(shù)在確保設(shè)備續(xù)航能力和性能方面發(fā)揮著關(guān)鍵作用。本文將介紹電源管理技術(shù)在移動設(shè)備的幾種典型應(yīng)用,并分析其優(yōu)勢和
    的頭像 發(fā)表于 01-13 14:38 ?741次閱讀

    工控主板在數(shù)控機床設(shè)備的應(yīng)用

    工控主板作為數(shù)控機床的核心組件之一,發(fā)揮著至關(guān)重要的作用。以下是工控主板在數(shù)控機床設(shè)備應(yīng)用的詳細(xì)介紹
    的頭像 發(fā)表于 01-09 15:33 ?533次閱讀

    IO模塊助力PLC,全面提升水處理設(shè)備能效

    隨著我國環(huán)保事業(yè)的不斷發(fā)展,水處理技術(shù)在工業(yè)、生活等領(lǐng)域發(fā)揮著越來越重要的作用。如何提高中水處理設(shè)備的能效,成為行業(yè)關(guān)注的焦點。本文將為您介紹明達技術(shù)高效解決方案——利用自主研發(fā)的分布式IO模塊配合PLC,實現(xiàn)
    的頭像 發(fā)表于 12-16 14:57 ?437次閱讀
    IO模塊助力PLC,全面提升<b class='flag-5'>中</b>水處理<b class='flag-5'>設(shè)備</b>能效

    大型設(shè)備的小型電機

    電子發(fā)燒友網(wǎng)站提供《大型設(shè)備的小型電機.pdf》資料免費下載
    發(fā)表于 09-29 10:02 ?0次下載
    大型<b class='flag-5'>設(shè)備</b><b class='flag-5'>中</b>的小型電機

    思科設(shè)備常用的巡檢命令介紹

    思科(Cisco)設(shè)備在網(wǎng)絡(luò)領(lǐng)域具有廣泛的應(yīng)用,其可靠性和功能強大使其成為許多企業(yè)網(wǎng)絡(luò)基礎(chǔ)設(shè)施的核心。然而,確保這些設(shè)備始終高效運行,定期進行巡檢是必不可少的。這篇文章將詳細(xì)介紹思科設(shè)備
    的頭像 發(fā)表于 08-12 18:16 ?1176次閱讀

    Juniper設(shè)備常用的巡檢命令介紹

    在網(wǎng)絡(luò)管理設(shè)備巡檢是確保網(wǎng)絡(luò)設(shè)備運行正常、性能最佳的重要環(huán)節(jié)。Juniper Networks設(shè)備廣泛應(yīng)用于各類網(wǎng)絡(luò)環(huán)境,其特有的JUNOS操作系統(tǒng)提供了一系列強大而實用的命令工具
    的頭像 發(fā)表于 08-12 18:14 ?1357次閱讀

    華為設(shè)備的OSPF命令詳解

    OSPF網(wǎng)絡(luò)。這篇文章將詳細(xì)介紹華為設(shè)備的OSPF命令,包括基本配置、路由策略、鄰居關(guān)系和故障排除等方面,幫助讀者全面了解和掌握這些命令。
    的頭像 發(fā)表于 08-12 18:13 ?3422次閱讀

    華為設(shè)備的BGP命令詳解

    的主要路由協(xié)議,用于在不同自治系統(tǒng)(AS)之間交換路由信息。掌握華為設(shè)備的BGP命令對于網(wǎng)絡(luò)工程師至關(guān)重要,因為這不僅涉及日常的網(wǎng)絡(luò)運維,還影響到網(wǎng)絡(luò)的整體性能和安全性。本文將詳細(xì)介紹華為設(shè)備
    的頭像 發(fā)表于 08-12 18:11 ?2446次閱讀

    藍牙模塊在無線游戲設(shè)備的應(yīng)用

    隨著科技的飛速發(fā)展,無線游戲設(shè)備已經(jīng)成為游戲產(chǎn)業(yè)的重要組成部分,為用戶提供了更加便捷、自由的游戲體驗。藍牙模塊作為無線游戲設(shè)備的核心技術(shù)之一,其創(chuàng)新應(yīng)用不僅提升了游戲的互動性和實時性,還為玩家?guī)?/div>
    的頭像 發(fā)表于 07-19 14:00 ?572次閱讀

    工控主板在環(huán)保智能設(shè)備的應(yīng)用

    工控主板在環(huán)保智能設(shè)備的應(yīng)用,對于環(huán)境監(jiān)測、資源管理、污染控制等方面起到了至關(guān)重要的作用。以下是工控主板在環(huán)保智能設(shè)備的一些具體應(yīng)用:
    的頭像 發(fā)表于 07-17 15:54 ?586次閱讀
    工控主板在環(huán)保智能<b class='flag-5'>設(shè)備</b><b class='flag-5'>中</b>的應(yīng)用