成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于Ceph中Bufferlist的設計與使用

云計算
如果非要在整個Ceph中,找出一個類最重要,我覺得非Bufferlist莫屬了,原因很簡單,因為Bufferlist負責管理Ceph中所有的內存。整個Ceph中所有涉及到內存的操作,無論是msg分配內存接收消息,還是OSD構造各類數據結構的持久化表示(encode/decode),再到實際磁盤操作,都將bufferlist作為基礎。

[[134327]]

如果非要在整個Ceph中,找出一個類最重要,我覺得非Bufferlist莫屬了,原因很簡單,因為Bufferlist負責管理Ceph中所有的內存。整個Ceph中所有涉及到內存的操作,無論是msg分配內存接收消息,還是OSD構造各類數據結構的持久化表示(encode/decode),再到實際磁盤操作,都將bufferlist作為基礎。

Ceph中bufferlist的設計還是有些復雜的,其中包含三個主要的內buffer::raw(bufferraw)、 buffer::ptr(bufferptr)和buffer::list(bufferlist)。這三個類都定義在common/buffer.h 中,都是buffer類的內部類,而buffer類本身沒有任何內容,只起到了一個命名空間的作用。

這三個類的職責各有不同:

buffer::raw:對應一段真實的物理內存,負責維護這段物理內存的引用計數nref和釋放操作。

buffer::ptr:對應Ceph中的一段被使用的內存,也就是某個bufferraw的一部分或者全部。

buffer::list:表示一個ptr的列表(std::list),相當于將N個ptr構成一個更大的虛擬的連續內存。

buffer這三個類的相互關系可以用下面這個圖來表示:

 

Ceph中Bufferlist的設計與使用

圖中藍色的表示bufferlist,橙色表示bufferptr,綠色表示bufferraw。

在這個圖中,實際占用的系統內存一共就三段,分別是raw0,raw1和raw2代表的三段內存。其中:

raw0被ptr0,ptr1,ptr2使用

raw1被ptr3,ptr4,ptr6使用

raw2被ptr5,ptr7使用

而list0是由ptr0-5組成的,list1是由ptr6和ptr7組成的。

從這張圖上我們就可以看出bufferlist的設計思路了: 對于bufferlist來說,僅關心一個個ptr。bufferlist將ptr連在一起,當做是一段連續的內存使用。因此,可以通過 bufferlist::iterator一個字節一個字節的迭代整個bufferlist中的所有內容,而不需要關心到底有幾個ptr,更不用關心這些 ptr到底和系統內存是怎么對應的;也可以通過bufferlist::write_file方法直接將bufferlist中的內容出到一個文件中;或者通過bufferlist::write_fd方法將bufferlist中的內容寫入到某個fd中。

與bufferlist相對的是負責管理系統內存的bufferraw。bufferraw只關心一件事:維護其所管理的系統內存的引用計數,并且在引用計數減為0時——即沒有ptr再使用這塊內存時,釋放這塊內存。

連接bufferlist和bufferraw的是bufferptr。bufferptr關心的是如何使用內存。每一個bufferptr一定有一個bufferraw為其提供系統內存,然后ptr決定使用這塊內存的哪一部分。bufferlist只用通過ptr才能對應到系統內存中,而 bufferptr而可以獨立存在,只是大部分ptr還是為bufferlist服務的,獨立的ptr使用的場景并不是很多。

通過引入ptr這樣一個中間層次,bufferlist使用內存的方式可以非常靈活,這里可以舉兩個場景:

1. 快速encode/decode

在Ceph中經常需要將一個bufferlist編碼(encode)到另一個bufferlist中,例如在msg發送消息的時候,通常msg拿到的 osd等邏輯層傳遞給它的bufferlist,然后msg還需要給這個bufferlist加上消息頭和消息尾,而消息頭和消息尾也是用 bufferlist表示的。這時候,msg通常會構造一個空的bufferlist,然后將消息頭、消息尾、內容都encode到這個空的 bufferlist。而bufferlist之間的encode實際只需要做ptr的copy,而不涉及到系統內存的申請和Copy,效率較高。

2. 一次分配,多次使用

我們都知道,調用malloc之類的函數申請內存是非常重量級的操作。利用ptr這個中間層可以緩解這個問題,即我們可以一次性申請一塊較大的內存,也就是一個較大的bufferraw,然后每次需要內存的時候,構造一個bufferptr,指向這個bufferraw的不同部分。這樣就不再需要向系統申請內存了。***將這些ptr都加入到一個bufferlist中,就可以形成一個虛擬的連續內存。

關于作者:袁冬博士,UnitedStack產品副總裁,負責UnitedStack產品、售前和對外合作工作;云計算專家,在云計算、虛擬化、分布式系統和企業級應用等方面有豐富的經驗;對分布式存儲、非結構數據存儲和存儲虛擬化有深刻地理解,在云存儲和企業級存儲領域有豐富的研發與實踐經驗;Ceph等開源存儲項目的核心代碼貢獻者。

原文鏈接:https://www.ustack.com/blog/bufferlist/

責任編輯:Ophira 來源: ustack博客
相關推薦

2015-05-20 10:05:10

Ceph分布式文件系統序列化

2023-02-28 08:00:24

2021-05-06 21:26:00

BcacheCeph存儲

2015-03-24 20:10:21

2023-10-12 08:01:00

2018-04-12 08:37:27

2022-07-10 07:48:26

緩存軟件設計

2017-12-06 14:35:01

OpenStackCeph存儲

2009-12-31 10:13:23

寬帶接入網

2018-05-22 08:37:02

Ceph存儲存儲系統

2010-03-26 19:22:08

F#代理

2017-09-20 09:58:21

數據庫“狀態”字段設計

2024-06-21 14:41:52

2009-12-28 16:55:25

2013-12-27 09:14:09

2012-02-20 09:52:27

ibmdw

2011-06-13 10:21:25

QT 信號 槽機制

2012-06-06 13:41:46

Google智能眼鏡

2017-06-27 14:48:51

開發設計程序員

2025-05-22 08:15:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人精品视频在线观看 | 不卡的av在线 | 亚洲人人| 亚洲一区 | 伊人网站在线 | 91视频在线 | 亚洲视频在线看 | 精品av| 欧美色综合 | 成人亚洲网站 | 欧洲精品视频一区 | h视频在线播放 | 成人久久久 | 影音先锋中文在线 | 国产美女免费视频 | 人人人艹| 天天操夜夜骑 | 99视频在线播放 | 亚洲欧洲成人在线 | 日韩视频免费 | 午夜精品一区二区三区在线 | 久久久久www | 国产美女自拍视频 | 国产视频一区二区 | 成人a免费 | 免费观看的av毛片的网站 | 日本欧美在线观看视频 | 一区二区三区亚洲视频 | 国产精品揄拍一区二区 | www.xxxx欧美 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 99精品国产一区二区三区 | 盗摄精品av一区二区三区 | 久久www免费人成看片高清 | 91亚洲视频在线 | 国产一区91精品张津瑜 | 久久午夜精品福利一区二区 | 国产三级网站 | 成人av免费 | 免费在线看黄视频 | 亚洲成人免费电影 |