ceph bluestore 源码分析:刷缓存(trim)逻辑
生活随笔
收集整理的這篇文章主要介紹了
ceph bluestore 源码分析:刷缓存(trim)逻辑
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
環(huán)境
ceph版本:12.2.1
部署模式:ec 2+1
osd: 3個(gè) 且資源池已經(jīng)有數(shù)據(jù)
執(zhí)行命令:ceph daemon osd.0 flush_store_cache 進(jìn)行刷緩存。即將dump_mempools內(nèi)存池管理的bluestore cache中的無(wú)用數(shù)據(jù)進(jìn)行釋放
主要參數(shù):
bluestore_cache_trim_interval = 0.2 #bluestore cache trim的時(shí)間間隔
bluestore_cache_trim_max_skip_pinned # trim cache的時(shí)候,如果遇見(jiàn)item是pin的,計(jì)數(shù)+1,計(jì)數(shù)超過(guò)此值后,停止做trim。默認(rèn)為64
bluestore_cache_type = 2q #blustore cache類(lèi)型,默認(rèn)是2q
bluestore_2q_cache_kin_ratio = 0.5 #2q cache中真正存儲(chǔ)新的緩存頁(yè)面的鏈表 Ain 所占用整個(gè)cache空間的比例
bluestore_2q_cache_kout_ratio = 0.5 # 2q cache中存儲(chǔ)被正常淘汰的緩存頁(yè)面的鏈表 Alout 所占用整個(gè)cache的空間比例
debug_bluestore = 20/20 #設(shè)置bluestore的debug日志級(jí)別
debug_bdev = 20/20 #設(shè)置bdev的debug日志級(jí)別
刷緩存源碼分析
刷緩存方式主要有兩種,兩種基本邏輯沒(méi)有什么區(qū)別
- osd內(nèi)部bstore_mempool線(xiàn)程自己每隔一時(shí)間調(diào)用trim
- OSD 子線(xiàn)程 admin_socket接收到終端用戶(hù) flush_store_cache信號(hào)調(diào)用trim函數(shù)
第一種方式
第二種方式
基本源碼調(diào)用邏輯很簡(jiǎn)單,以我們執(zhí)行ceph daemon osd.0 flush_store_cache命令的源碼調(diào)用函數(shù)棧如下:
/usr/bin/ceph-osd(BlueStore::SharedBlob::put()+0x2c)
/usr/bin/ceph-osd(BlueStore::Extent::~Extent()+0xd1)
/usr/bin/ceph-osd(BlueStore::Onode::put()+0x96) //回收onode磁盤(pán)空間,調(diào)用extent的析構(gòu)函數(shù),sharedblob的析構(gòu)函數(shù)
/usr/bin/ceph-osd(BlueStore::TwoQCache::_trim(unsigned
/usr/bin/ceph-osd(BlueStore::Cache::trim_all()+0x30)
/usr/bin/ceph-osd(BlueStore::flush_cache()+0x7c) //調(diào)用flush_cache函數(shù)執(zhí)行trim
/usr/bin/ceph-osd(OSD::asok_command(std::basic_string<char, //admin_socket線(xiàn)程處理命令
刪除onde的時(shí)候即Onode::-put函數(shù),先將onode從當(dāng)前onode_map中刪除,再析構(gòu)掉onode對(duì)象
remove掉sharedblob磁盤(pán)數(shù)據(jù)結(jié)構(gòu)。remove過(guò)程中同樣需要將sharedblob先從sharedblob_set中移除,由remove函數(shù)執(zhí)行,然后再釋放sharedblob空間
這里介紹幾個(gè)bluestore常駐內(nèi)存的數(shù)據(jù)結(jié)構(gòu):
Cache基類(lèi)
- 在管理用戶(hù)數(shù)據(jù)的onode和lcollection之間有一個(gè)結(jié)構(gòu) OnodeSpace
這里可以看到一個(gè)每個(gè)bluestore可以包含多個(gè)cache。因?yàn)椴煌琍G之間的客戶(hù)端請(qǐng)求可以并發(fā)處理,為了提升性能,每個(gè)OS相應(yīng)得會(huì)設(shè)置多個(gè)PG工作隊(duì)列,bluetore 中的Cache實(shí)例個(gè)數(shù)與之對(duì)應(yīng) - 在真正用戶(hù)數(shù)據(jù)blob和cache之間的數(shù)據(jù)結(jié)構(gòu)BufferSpace
- BufferSpace的管理的基本單元Buffer,每個(gè)Buffer負(fù)責(zé)管理blob中的一段數(shù)據(jù)
- TwoQCache類(lèi)
可以看到TwoQCache維護(hù)四個(gè)隊(duì)列。所有的Onode與Buffer最終都加入Cache,進(jìn)行全局熱度識(shí)別和應(yīng)用淘汰策略。在BlueStore中的2Q實(shí)現(xiàn),這兩類(lèi)數(shù)據(jù)分別應(yīng)用了不同的淘汰策略:針對(duì)管理用戶(hù)數(shù)據(jù)的單元Onode采用LRU,針對(duì)用戶(hù)數(shù)據(jù)單元buffer使用2Q算法。
總結(jié)
以上是生活随笔為你收集整理的ceph bluestore 源码分析:刷缓存(trim)逻辑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 阴阳师满爆是什么意思?
- 下一篇: 一箱橙子有20个,如果每千克大约有4个橙