新聞中心
關(guān)于Ceph中Bufferlist的設(shè)計(jì)與使用
作者:袁冬 2015-05-18 13:58:32
云計(jì)算 如果非要在整個(gè)Ceph中,找出一個(gè)類最重要,我覺得非Bufferlist莫屬了,原因很簡(jiǎn)單,因?yàn)锽ufferlist負(fù)責(zé)管理Ceph中所有的內(nèi)存。整個(gè)Ceph中所有涉及到內(nèi)存的操作,無論是msg分配內(nèi)存接收消息,還是OSD構(gòu)造各類數(shù)據(jù)結(jié)構(gòu)的持久化表示(encode/decode),再到實(shí)際磁盤操作,都將bufferlist作為基礎(chǔ)。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),達(dá)茂旗企業(yè)網(wǎng)站建設(shè),達(dá)茂旗品牌網(wǎng)站建設(shè),網(wǎng)站定制,達(dá)茂旗網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,達(dá)茂旗網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
如果非要在整個(gè)Ceph中,找出一個(gè)類最重要,我覺得非Bufferlist莫屬了,原因很簡(jiǎn)單,因?yàn)锽ufferlist負(fù)責(zé)管理Ceph中所有的內(nèi)存。整個(gè)Ceph中所有涉及到內(nèi)存的操作,無論是msg分配內(nèi)存接收消息,還是OSD構(gòu)造各類數(shù)據(jù)結(jié)構(gòu)的持久化表示(encode/decode),再到實(shí)際磁盤操作,都將bufferlist作為基礎(chǔ)。
Ceph中bufferlist的設(shè)計(jì)還是有些復(fù)雜的,其中包含三個(gè)主要的內(nèi)buffer::raw(bufferraw)、 buffer::ptr(bufferptr)和buffer::list(bufferlist)。這三個(gè)類都定義在common/buffer.h 中,都是buffer類的內(nèi)部類,而buffer類本身沒有任何內(nèi)容,只起到了一個(gè)命名空間的作用。
這三個(gè)類的職責(zé)各有不同:
buffer::raw:對(duì)應(yīng)一段真實(shí)的物理內(nèi)存,負(fù)責(zé)維護(hù)這段物理內(nèi)存的引用計(jì)數(shù)nref和釋放操作。
buffer::ptr:對(duì)應(yīng)Ceph中的一段被使用的內(nèi)存,也就是某個(gè)bufferraw的一部分或者全部。
buffer::list:表示一個(gè)ptr的列表(std::list),相當(dāng)于將N個(gè)ptr構(gòu)成一個(gè)更大的虛擬的連續(xù)內(nèi)存。
buffer這三個(gè)類的相互關(guān)系可以用下面這個(gè)圖來表示:
圖中藍(lán)色的表示bufferlist,橙色表示bufferptr,綠色表示bufferraw。
在這個(gè)圖中,實(shí)際占用的系統(tǒng)內(nèi)存一共就三段,分別是raw0,raw1和raw2代表的三段內(nèi)存。其中:
raw0被ptr0,ptr1,ptr2使用
raw1被ptr3,ptr4,ptr6使用
raw2被ptr5,ptr7使用
而list0是由ptr0-5組成的,list1是由ptr6和ptr7組成的。
從這張圖上我們就可以看出bufferlist的設(shè)計(jì)思路了: 對(duì)于bufferlist來說,僅關(guān)心一個(gè)個(gè)ptr。bufferlist將ptr連在一起,當(dāng)做是一段連續(xù)的內(nèi)存使用。因此,可以通過 bufferlist::iterator一個(gè)字節(jié)一個(gè)字節(jié)的迭代整個(gè)bufferlist中的所有內(nèi)容,而不需要關(guān)心到底有幾個(gè)ptr,更不用關(guān)心這些 ptr到底和系統(tǒng)內(nèi)存是怎么對(duì)應(yīng)的;也可以通過bufferlist::write_file方法直接將bufferlist中的內(nèi)容出到一個(gè)文件中;或者通過bufferlist::write_fd方法將bufferlist中的內(nèi)容寫入到某個(gè)fd中。
與bufferlist相對(duì)的是負(fù)責(zé)管理系統(tǒng)內(nèi)存的bufferraw。bufferraw只關(guān)心一件事:維護(hù)其所管理的系統(tǒng)內(nèi)存的引用計(jì)數(shù),并且在引用計(jì)數(shù)減為0時(shí)——即沒有ptr再使用這塊內(nèi)存時(shí),釋放這塊內(nèi)存。
連接bufferlist和bufferraw的是bufferptr。bufferptr關(guān)心的是如何使用內(nèi)存。每一個(gè)bufferptr一定有一個(gè)bufferraw為其提供系統(tǒng)內(nèi)存,然后ptr決定使用這塊內(nèi)存的哪一部分。bufferlist只用通過ptr才能對(duì)應(yīng)到系統(tǒng)內(nèi)存中,而 bufferptr而可以獨(dú)立存在,只是大部分ptr還是為bufferlist服務(wù)的,獨(dú)立的ptr使用的場(chǎng)景并不是很多。
通過引入ptr這樣一個(gè)中間層次,bufferlist使用內(nèi)存的方式可以非常靈活,這里可以舉兩個(gè)場(chǎng)景:
1. 快速encode/decode
在Ceph中經(jīng)常需要將一個(gè)bufferlist編碼(encode)到另一個(gè)bufferlist中,例如在msg發(fā)送消息的時(shí)候,通常msg拿到的 osd等邏輯層傳遞給它的bufferlist,然后msg還需要給這個(gè)bufferlist加上消息頭和消息尾,而消息頭和消息尾也是用 bufferlist表示的。這時(shí)候,msg通常會(huì)構(gòu)造一個(gè)空的bufferlist,然后將消息頭、消息尾、內(nèi)容都encode到這個(gè)空的 bufferlist。而bufferlist之間的encode實(shí)際只需要做ptr的copy,而不涉及到系統(tǒng)內(nèi)存的申請(qǐng)和Copy,效率較高。
2. 一次分配,多次使用
我們都知道,調(diào)用malloc之類的函數(shù)申請(qǐng)內(nèi)存是非常重量級(jí)的操作。利用ptr這個(gè)中間層可以緩解這個(gè)問題,即我們可以一次性申請(qǐng)一塊較大的內(nèi)存,也就是一個(gè)較大的bufferraw,然后每次需要內(nèi)存的時(shí)候,構(gòu)造一個(gè)bufferptr,指向這個(gè)bufferraw的不同部分。這樣就不再需要向系統(tǒng)申請(qǐng)內(nèi)存了。***將這些ptr都加入到一個(gè)bufferlist中,就可以形成一個(gè)虛擬的連續(xù)內(nèi)存。
關(guān)于作者:袁冬博士,UnitedStack產(chǎn)品副總裁,負(fù)責(zé)UnitedStack產(chǎn)品、售前和對(duì)外合作工作;云計(jì)算專家,在云計(jì)算、虛擬化、分布式系統(tǒng)和企業(yè)級(jí)應(yīng)用等方面有豐富的經(jīng)驗(yàn);對(duì)分布式存儲(chǔ)、非結(jié)構(gòu)數(shù)據(jù)存儲(chǔ)和存儲(chǔ)虛擬化有深刻地理解,在云存儲(chǔ)和企業(yè)級(jí)存儲(chǔ)領(lǐng)域有豐富的研發(fā)與實(shí)踐經(jīng)驗(yàn);Ceph等開源存儲(chǔ)項(xiàng)目的核心代碼貢獻(xiàn)者。
當(dāng)前名稱:關(guān)于Ceph中Bufferlist的設(shè)計(jì)與使用
網(wǎng)站鏈接:http://www.5511xx.com/article/cohoosi.html


咨詢
建站咨詢
