chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

背景介紹:

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

解決方案:

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

balloon 設(shè)備簡介:

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

balloon 實(shí)現(xiàn):

balloon 的具體代碼實(shí)現(xiàn)位于 StratoVirt 項(xiàng)目的/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 是一個(gè) virtio 設(shè)備,所以在前后端通信時(shí)也使用了 virtio 框架提供的 virtio queue。當(dāng)前 StratoVirt 支持兩個(gè)隊(duì)列:inflate virtio queue(ivq)和 deflate virtio queue(dvq)。這兩個(gè)隊(duì)列分別負(fù)責(zé) balloon 設(shè)備的“充氣”和“放氣”。

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

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

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

inflate

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

deflate

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

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

定義 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,
/*省略*/
}

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

fnprocess_balloon_queue(&mutself,req_type:bool)->Result<()>{
letqueue=ifreq_type{
&mutself.inf_queue
}else{
&mutself.def_queue
};//獲得對應(yīng)的隊(duì)列
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(){
//進(jìn)行內(nèi)存標(biāo)記
req.mark_balloon_page(req_type,&self.mem_space,&self.mem_info);
}
/*省略*/
}
Err(e)=>{
/*省略錯(cuò)誤處理*/
}
}
}
/*省略*/
}

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

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

標(biāo)記內(nèi)存在mark_balloon_page函數(shù)中進(jìn)行實(shí)現(xiàn),起初的實(shí)現(xiàn)思路為:將虛擬機(jī)傳送過來的地址逐個(gè)進(jìn)行標(biāo)記。即,從隊(duì)列中取出一個(gè)元素,轉(zhuǎn)化為地址后立即進(jìn)行標(biāo)記。后來經(jīng)過測試發(fā)現(xiàn):balloon 設(shè)備在對頁地址進(jìn)行一頁一頁標(biāo)記內(nèi)存時(shí)花費(fèi)時(shí)間巨大。而同時(shí)也發(fā)現(xiàn)通過虛擬機(jī)傳回來的地址中有大段的連續(xù)內(nèi)存段。于是通過改變標(biāo)記方法:由原來的一頁一頁標(biāo)記改為將這些連續(xù)的內(nèi)存統(tǒng)一標(biāo)記。大大節(jié)省了標(biāo)記時(shí)間。下面代碼為具體實(shí)現(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進(jìn)行從小到大排序。
hvaset.sort_by_key(|&b|Reverse(b));
/*略*/
//將hvaset中連續(xù)的內(nèi)存段進(jìn)行標(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 隊(duì)列中的地址全部取出,并保存在 vec 中,然后將該 vec 進(jìn)行從小到大的排序。有利于快速找出連續(xù)的內(nèi)存段并進(jìn)行標(biāo)記。由于 hvaset 中的地址是按照從小到大排列的,因此可以從頭開始遍歷 hvaset,遇到不連續(xù)的地址后將前面的連續(xù)段進(jìn)行標(biāo)記。這樣就完成了由原來逐頁標(biāo)記到連續(xù)內(nèi)存段統(tǒng)一標(biāo)記的優(yōu)化。

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

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

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

審核編輯:彭菁

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

    關(guān)注

    14

    文章

    10262

    瀏覽量

    91528
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    972

    瀏覽量

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

    關(guān)注

    2

    文章

    769

    瀏覽量

    30857

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    initrd 沒有帶有自編譯內(nèi)核的 nvme 設(shè)備?

    你好!我使用 nvme 的 -starfive 內(nèi)核在 visionfive2 上運(yùn)行 debian。當(dāng)我根據(jù)內(nèi)核升級我總是在缺少 root 設(shè)備的情況下進(jìn)入 initrd。 因此,從本質(zhì)上講
    發(fā)表于 02-10 06:40

    半導(dǎo)體制造晶圓清洗設(shè)備介紹

    在半導(dǎo)體制造過程,晶圓清洗是一道至關(guān)重要的工序。晶圓經(jīng)切割后,表面常附著大量由聚合物、光致抗蝕劑及蝕刻雜質(zhì)等組成的顆粒物,這些物質(zhì)會(huì)對后續(xù)工序芯片的幾何特征與電性能產(chǎn)生不良影響。隨著半導(dǎo)體
    的頭像 發(fā)表于 01-27 11:02 ?561次閱讀
    半導(dǎo)體制造<b class='flag-5'>中</b>晶圓清洗<b class='flag-5'>設(shè)備</b><b class='flag-5'>介紹</b>

    太誘產(chǎn)品在通用電子設(shè)備的使用指南及技術(shù)剖析

    ,我們需要全面了解相關(guān)的注意事項(xiàng)、產(chǎn)品規(guī)格以及性能特點(diǎn)等內(nèi)容,以確保設(shè)計(jì)出的設(shè)備能夠穩(wěn)定、高效地運(yùn)行。本文將基于太誘產(chǎn)品的相關(guān)文檔,為大家詳細(xì)介紹其在通用電子設(shè)備的使用要點(diǎn)。 文件下
    的頭像 發(fā)表于 01-18 16:55 ?1121次閱讀

    如何在Linux列出USB設(shè)備

    Linux操作系統(tǒng)提供了許多命令來列出系統(tǒng)連接的USB設(shè)備,這些命令非常有用,無論是查看已連接設(shè)備的信息,還是進(jìn)行系統(tǒng)調(diào)試。 在本文中,我們將介紹一些常用的命令以及它們的使用方法,
    發(fā)表于 12-24 08:19

    SP系列連接器在呼吸機(jī)與麻醉設(shè)備的應(yīng)用

    思特安SP系列連接器在醫(yī)療設(shè)備方面具體應(yīng)用廣泛,其設(shè)計(jì)特性與醫(yī)療場景需求高度契合,今天讓我們來進(jìn)一步介紹思特安SP系列連接器在呼吸機(jī)與麻醉劑相關(guān)醫(yī)療設(shè)備的應(yīng)用,具體應(yīng)用分析如文件
    發(fā)表于 08-07 17:46 ?0次下載

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

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

    CAN轉(zhuǎn)PROFINET網(wǎng)關(guān)設(shè)備基本功能介紹

    設(shè)備簡介 本研究介紹設(shè)備為一款集成了Profinet (PN) 和Controller Area Network (CAN) 通信協(xié)議的網(wǎng)關(guān),其工作原理基于數(shù)據(jù)映射技術(shù)。在Profinet網(wǎng)絡(luò)架構(gòu)
    的頭像 發(fā)表于 06-08 10:36 ?763次閱讀
    CAN轉(zhuǎn)PROFINET網(wǎng)關(guān)<b class='flag-5'>設(shè)備</b>基本功能<b class='flag-5'>介紹</b>

    智能設(shè)備Leadway電源模塊的應(yīng)用案例

    智能設(shè)備Leadway電源模塊的應(yīng)用案例Leadway電源模塊在智能設(shè)備憑借其高穩(wěn)定性、高性價(jià)比和小型化設(shè)計(jì),被廣泛應(yīng)用于工業(yè)控制、通信設(shè)備
    發(fā)表于 05-22 09:18

    振動(dòng)馬達(dá)在VR設(shè)備的應(yīng)用優(yōu)點(diǎn)分析

    振動(dòng)馬達(dá)作為一種重要的觸覺反饋技術(shù),在虛擬現(xiàn)實(shí)(VR)設(shè)備的應(yīng)用越來越廣泛。它通過模擬觸覺反饋,增強(qiáng)用戶在虛擬環(huán)境的沉浸感。振動(dòng)馬達(dá)的應(yīng)用不僅僅是為了提高設(shè)備的互動(dòng)性,更是提升了V
    的頭像 發(fā)表于 05-17 00:07 ?780次閱讀

    高校智慧教室多媒體教學(xué)設(shè)備介紹

    在當(dāng)今的教育環(huán)境,隨著信息技術(shù)的快速發(fā)展和應(yīng)用,智慧教室已成為高校教育改革的重要標(biāo)志。廣凌科技(廣凌股份)深知在智慧教室建設(shè)方案,多媒體教學(xué)設(shè)備的重要性,這不僅關(guān)系到教學(xué)質(zhì)量的提升,也直接影響
    的頭像 發(fā)表于 05-06 09:20 ?1621次閱讀
    高校智慧教室多媒體教學(xué)<b class='flag-5'>設(shè)備</b><b class='flag-5'>介紹</b>

    SMA連接器在醫(yī)療設(shè)備的應(yīng)用

    SMA連接器在醫(yī)療設(shè)備的應(yīng)用
    的頭像 發(fā)表于 04-26 09:24 ?683次閱讀
    SMA連接器在醫(yī)療<b class='flag-5'>設(shè)備</b><b class='flag-5'>中</b>的應(yīng)用

    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),集成連接器模塊、功率器件與保護(hù)器件的協(xié)同應(yīng)用,不僅能確保數(shù)據(jù)與電力傳輸?shù)姆€(wěn)定性,還能提升系統(tǒng)的安全性與耐用性
    的頭像 發(fā)表于 04-25 15:00 ?1152次閱讀

    芯片制造的應(yīng)變硅技術(shù)介紹

    本文介紹了在芯片制造的應(yīng)變硅技術(shù)的原理、材料選擇和核心方法。
    的頭像 發(fā)表于 04-15 15:21 ?3187次閱讀
    芯片制造<b class='flag-5'>中</b>的應(yīng)變硅技術(shù)<b class='flag-5'>介紹</b>

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

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

    集成電路制造的電鍍工藝介紹

    本文介紹了集成電路制造工藝的電鍍工藝的概念、應(yīng)用和工藝流程。
    的頭像 發(fā)表于 03-13 14:48 ?2784次閱讀
    集成電路制造<b class='flag-5'>中</b>的電鍍工藝<b class='flag-5'>介紹</b>