日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

ceph bluestore源码分析:admin_socket实时获取内存池数据

發(fā)布時(shí)間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ceph bluestore源码分析:admin_socket实时获取内存池数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

環(huán)境:

版本:ceph 12.2.1
部署完cephfs 使用ceph-fuse掛載,并寫入數(shù)據(jù)
關(guān)鍵參數(shù):
debug_mempool = true 將該參數(shù)置為true即可查看詳細(xì)的blustore管理的內(nèi)存池的數(shù)據(jù)
命令:
ceph daemon osd.id dump_mempools該命令為admin_socket線程實(shí)時(shí)獲取當(dāng)前內(nèi)存池中各個(gè)類對(duì)象的數(shù)據(jù)
如下,我可以看到bluestore_cache_other數(shù)據(jù)類別中包含如下多個(gè)數(shù)據(jù)結(jié)構(gòu)以及其對(duì)應(yīng)的items和總的size,非常直觀

源碼分析

由于是通過(guò)ceph daemon方式獲取,在通過(guò)ceph.in腳本初始化客戶端的socket之后,進(jìn)行服務(wù)端的端口開啟。
由于Admin socket即Unix daemon socket的通信方式并非局域網(wǎng)通信,而是通過(guò)socket進(jìn)行同一主機(jī)的進(jìn)程間通信,所以ceph daemon命令相關(guān)參數(shù)獲取或者設(shè)置需要當(dāng)前主機(jī)有該進(jìn)程。
因?yàn)閏eph daemon獲取信息需要是可靠的,所以這里選擇面向消息的socket通信方式。它與網(wǎng)絡(luò)變成中的socket通信方式最大的區(qū)別就是地址格式不同,用結(jié)構(gòu)體sockaddr_un表示,網(wǎng)絡(luò)編程的socket地址是IP地址加端口號(hào),而UNIX Domain Socket的地址是一個(gè)socket類型的文件在文件系統(tǒng)中的路徑,這個(gè)socket文件由bind()調(diào)用創(chuàng)建,如果調(diào)用bind()時(shí)該文件已存在,則bind()錯(cuò)誤返回。

在OSD啟動(dòng)過(guò)程中都有一個(gè)CephContext類ceph上下文相關(guān)的變量cct變量,這個(gè)變量中會(huì)new AdminSocket對(duì)象,在ceph_osd.cc的main函數(shù)中會(huì)有cct的初始化操作

src/ceph_osd.cc

該初始化過(guò)程中需要進(jìn)行一些線程的啟動(dòng)以及admin socket的初始化
src/common/common_init.cc

初始化admin_socket線程
src/common/ceph_context.cc

src/common/admin_socket.cc 開始監(jiān)聽,并啟動(dòng)監(jiān)聽進(jìn)程

至此,admin_socket線程已經(jīng)處于監(jiān)聽狀態(tài),同時(shí)在CephContext類的構(gòu)造函數(shù)中已經(jīng)初始化對(duì)應(yīng)的命令選項(xiàng)
src/common/ceph_context.cc


AdminSocket類繼承的Thread類,在線程入口函數(shù)entry中,會(huì)通過(guò)poll方式等待event,然后有connection的時(shí)候,會(huì)進(jìn)行do_accept,然后進(jìn)行正常的網(wǎng)絡(luò)stream讀寫。

當(dāng)client通過(guò)admin socket向server端發(fā)送了命令后,admin socket server會(huì)接收消息,在do_accept函數(shù)中,會(huì)判斷這個(gè)command是否注冊(cè),如果注冊(cè)了,調(diào)用相應(yīng)的hook->call處理,最后將結(jié)果回復(fù)給client.

打印的過(guò)程是調(diào)用mempool::dump函數(shù)進(jìn)行打印
src/common/mempool.cc


獲取dump_mempool的過(guò)程是從get_stats中獲取

到這里就知道最后打印的函數(shù)調(diào)用的來(lái)龍去脈了。但是打印時(shí)獲取到的數(shù)據(jù)是在哪里初始化的呢?很明顯,我們可以看到get_stats中shard變量中獲取到數(shù)據(jù),即該結(jié)構(gòu)體變量在某個(gè)地方進(jìn)行了初始化allocate,同樣也有對(duì)應(yīng)的deallocate
src/include/mempool.h

同時(shí),利用pool_t的allocate函數(shù)構(gòu)造了對(duì)應(yīng)的工廠函數(shù)

該工廠函數(shù)就是最后我們具體對(duì)象模塊中的數(shù)據(jù)結(jié)構(gòu),工廠函數(shù)初始化了如下一些列類,即這一些類在初始化對(duì)象是的分配空間方式會(huì)由pool::allocate實(shí)現(xiàn)
src/os/bluestore/BlueStore.cc

總結(jié)

即當(dāng)我們?cè)谟袛?shù)據(jù)io過(guò)程中,相關(guān)的類有實(shí)例化,則它的空間分配是由mempool.h中的工廠函數(shù)通過(guò)mempool::pool::allocate分配器進(jìn)行分配,并記錄到shard結(jié)構(gòu)體中,通過(guò)admin_socket的hook->call調(diào)用注冊(cè)的dump_mempools函數(shù)進(jìn)行數(shù)據(jù)獲取并打印。所以,只要工廠函數(shù)實(shí)例化一次,dump_mempools中的數(shù)據(jù)就是實(shí)時(shí)獲取顯示得。

總結(jié)

以上是生活随笔為你收集整理的ceph bluestore源码分析:admin_socket实时获取内存池数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。