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

环境:

版本:ceph 12.2.1
部署完cephfs 使用ceph-fuse挂载,并写入数据
关键参数:
debug_mempool = true 将该参数置为true即可查看详细的blustore管理的内存池的数据
命令:
ceph daemon osd.id dump_mempools该命令为admin_socket线程实时获取当前内存池中各个类对象的数据
如下,我可以看到bluestore_cache_other数据类别中包含如下多个数据结构以及其对应的items和总的size,非常直观

ceph bluestore源码分析:admin_socket实时获取内存池数据_第1张图片

源码分析

由于是通过ceph daemon方式获取,在通过ceph.in脚本初始化客户端的socket之后,进行服务端的端口开启。
由于Admin socket即Unix daemon socket的通信方式并非局域网通信,而是通过socket进行同一主机的进程间通信,所以ceph daemon命令相关参数获取或者设置需要当前主机有该进程。
因为ceph daemon获取信息需要是可靠的,所以这里选择面向消息的socket通信方式。它与网络变成中的socket通信方式最大的区别就是地址格式不同,用结构体sockaddr_un表示,网络编程的socket地址是IP地址加端口号,而UNIX Domain Socket的地址是一个socket类型的文件在文件系统中的路径,这个socket文件由bind()调用创建,如果调用bind()时该文件已存在,则bind()错误返回。

在OSD启动过程中都有一个CephContext类ceph上下文相关的变量cct变量,这个变量中会new AdminSocket对象,在ceph_osd.cc的main函数中会有cct的初始化操作

src/ceph_osd.cc
ceph bluestore源码分析:admin_socket实时获取内存池数据_第2张图片
该初始化过程中需要进行一些线程的启动以及admin socket的初始化
src/common/common_init.cc
ceph bluestore源码分析:admin_socket实时获取内存池数据_第3张图片
初始化admin_socket线程
src/common/ceph_context.cc
ceph bluestore源码分析:admin_socket实时获取内存池数据_第4张图片
src/common/admin_socket.cc 开始监听,并启动监听进程
ceph bluestore源码分析:admin_socket实时获取内存池数据_第5张图片ceph bluestore源码分析:admin_socket实时获取内存池数据_第6张图片
至此,admin_socket线程已经处于监听状态,同时在CephContext类的构造函数中已经初始化对应的命令选项
src/common/ceph_context.cc
ceph bluestore源码分析:admin_socket实时获取内存池数据_第7张图片
ceph bluestore源码分析:admin_socket实时获取内存池数据_第8张图片
AdminSocket类继承的Thread类,在线程入口函数entry中,会通过poll方式等待event,然后有connection的时候,会进行do_accept,然后进行正常的网络stream读写。

当client通过admin socket向server端发送了命令后,admin socket server会接收消息,在do_accept函数中,会判断这个command是否注册,如果注册了,调用相应的hook->call处理,最后将结果回复给client.
ceph bluestore源码分析:admin_socket实时获取内存池数据_第9张图片
打印的过程是调用mempool::dump函数进行打印
src/common/mempool.cc
ceph bluestore源码分析:admin_socket实时获取内存池数据_第10张图片
ceph bluestore源码分析:admin_socket实时获取内存池数据_第11张图片
获取dump_mempool的过程是从get_stats中获取
ceph bluestore源码分析:admin_socket实时获取内存池数据_第12张图片

到这里就知道最后打印的函数调用的来龙去脉了。但是打印时获取到的数据是在哪里初始化的呢?很明显,我们可以看到get_stats中shard变量中获取到数据,即该结构体变量在某个地方进行了初始化allocate,同样也有对应的deallocate
src/include/mempool.h
ceph bluestore源码分析:admin_socket实时获取内存池数据_第13张图片
同时,利用pool_t的allocate函数构造了对应的工厂函数
ceph bluestore源码分析:admin_socket实时获取内存池数据_第14张图片
该工厂函数就是最后我们具体对象模块中的数据结构,工厂函数初始化了如下一些列类,即这一些类在初始化对象是的分配空间方式会由pool::allocate实现
src/os/bluestore/BlueStore.cc
ceph bluestore源码分析:admin_socket实时获取内存池数据_第15张图片

总结

即当我们在有数据io过程中,相关的类有实例化,则它的空间分配是由mempool.h中的工厂函数通过mempool::pool::allocate分配器进行分配,并记录到shard结构体中,通过admin_socket的hook->call调用注册的dump_mempools函数进行数据获取并打印。所以,只要工厂函数实例化一次,dump_mempools中的数据就是实时获取显示得。

你可能感兴趣的:(#,ceph源码分析)