女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

StratoVirt 中的 balloon 設備介紹

openEuler ? 來源:openEuler ? 作者:openEuler ? 2021-12-21 14:56 ? 次閱讀

StratoVirt 是計算產業中面向云數據中心的企業級虛擬化 VMM,實現了一套架構統一支持虛擬機、容器、Serverless 三種場景。StratoVirt 在輕量低噪、軟硬協同、Rust 語言級安全等方面具備關鍵技術競爭優勢。

背景介紹:

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

解決方案:

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

balloon 設備簡介:

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

balloon 實現:

balloon 的具體代碼實現位于 StratoVirt 項目的/virtio/src/balloon.rs 文件中,相關細節可閱讀代碼理解。代碼架構如下:

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 設備,所以在前后端通信時也使用了 virtio 框架提供的 virtio queue。當前 StratoVirt 支持兩個隊列:inflate virtio queue(ivq)和 deflate virtio queue(dvq)。這兩個隊列分別負責 balloon 設備的“充氣”和“放氣”。

氣球的充放氣時,前后端的信息是通過一個結構體來傳遞。

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

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

inflate

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

deflate

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

下面結合代碼進行說明:

定義 BalloonIoHandler 結構體作為處理 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,以及對應的觸發事件描述符(EventFd)inf_evt和def_evt。兩個隊列均使用了Mutex鎖,保證了隊列在同一時刻只有一個使用者對該隊列進行操作。保證了多線程共享的數據安全。

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

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

內存標記及優化:

標記內存在mark_balloon_page函數中進行實現,起初的實現思路為:將虛擬機傳送過來的地址逐個進行標記。即,從隊列中取出一個元素,轉化為地址后立即進行標記。后來經過測試發現:balloon 設備在對頁地址進行一頁一頁標記內存時花費時間巨大。而同時也發現通過虛擬機傳回來的地址中有大段的連續內存段。于是通過改變標記方法:由原來的一頁一頁標記改為將這些連續的內存統一標記。大大節省了標記時間。下面代碼為具體實現:

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中連續的內存段進行標記
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 進行從小到大的排序。有利于快速找出連續的內存段并進行標記。由于 hvaset 中的地址是按照從小到大排列的,因此可以從頭開始遍歷 hvaset,遇到不連續的地址后將前面的連續段進行標記。這樣就完成了由原來逐頁標記到連續內存段統一標記的優化。

經過測試,StratoVirt 的 balloon 速度也有了極大的提高。

原文標題:StratoVirt 基于 Rust 的 balloon 功能實踐

文章出處:【微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    13

    文章

    9685

    瀏覽量

    87276
  • 虛擬機
    +關注

    關注

    1

    文章

    962

    瀏覽量

    29039
  • 數據安全
    +關注

    關注

    2

    文章

    714

    瀏覽量

    30335

原文標題:StratoVirt 基于 Rust 的 balloon 功能實踐

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    YAGEO與Pulse產品在物聯網設備的應用

    隨著物聯網(IoT)技術的快速發展,設備之間的高效、可靠連接成為關鍵課題。在物聯網系統,集成連接器模塊、功率器件與保護器件的協同應用,不僅能確保數據與電力傳輸的穩定性,還能提升系統的安全性與耐用性
    的頭像 發表于 04-25 15:00 ?424次閱讀

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

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

    電源設備噪聲濾波器的作用介紹

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

    芯科科技Z-Wave設備測試工具介紹

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

    電源管理技術在移動設備的應用

    隨著移動設備的普及,電源管理技術在確保設備續航能力和性能方面發揮著關鍵作用。本文將介紹電源管理技術在移動設備的幾種典型應用,并分析其優勢和
    的頭像 發表于 01-13 14:38 ?654次閱讀

    工控主板在數控機床設備的應用

    工控主板作為數控機床的核心組件之一,發揮著至關重要的作用。以下是工控主板在數控機床設備應用的詳細介紹
    的頭像 發表于 01-09 15:33 ?429次閱讀

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

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

    半導體封裝技術的發展階段和相關設備

    本文介紹了半導體工藝及設備的封裝工藝和設備
    的頭像 發表于 11-05 17:26 ?1170次閱讀
    半導體封裝技術的發展階段和相關<b class='flag-5'>設備</b>

    大型設備的小型電機

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

    思科設備常用的巡檢命令介紹

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

    Juniper設備常用的巡檢命令介紹

    在網絡管理設備巡檢是確保網絡設備運行正常、性能最佳的重要環節。Juniper Networks設備廣泛應用于各類網絡環境,其特有的JUNOS操作系統提供了一系列強大而實用的命令工具
    的頭像 發表于 08-12 18:14 ?1237次閱讀

    華為設備的OSPF命令詳解

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

    華為設備的BGP命令詳解

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

    藍牙模塊在無線游戲設備的應用

    隨著科技的飛速發展,無線游戲設備已經成為游戲產業的重要組成部分,為用戶提供了更加便捷、自由的游戲體驗。藍牙模塊作為無線游戲設備的核心技術之一,其創新應用不僅提升了游戲的互動性和實時性,還為玩家帶來
    的頭像 發表于 07-19 14:00 ?492次閱讀

    工控主板在環保智能設備的應用

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