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

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 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

在这里插入图片描述

该初始化过程中需要进行一些线程的启动以及admin socket的初始化

src/common/common_init.cc

在这里插入图片描述

初始化admin_socket线程

src/common/ceph_context.cc

在这里插入图片描述

src/common/admin_socket.cc 开始监听,并启动监听进程

在这里插入图片描述在这里插入图片描述

至此,admin_socket线程已经处于监听状态,同时在CephContext类的构造函数中已经初始化对应的命令选项

src/common/ceph_context.cc

在这里插入图片描述

在这里插入图片描述

AdminSocket类继承的Thread类,在线程入口函数entry中,会通过poll方式等待event,然后有connection的时候,会进行do_accept,然后进行正常的网络stream读写。

当client通过admin socket向server端发送了命令后,admin socket server会接收消息,在do_accept函数中,会判断这个command是否注册,如果注册了,调用相应的hook->call处理,最后将结果回复给client.

在这里插入图片描述

打印的过程是调用mempool::dump函数进行打印

src/common/mempool.cc

在这里插入图片描述

在这里插入图片描述

获取dump_mempool的过程是从get_stats中获取

在这里插入图片描述

到这里就知道最后打印的函数调用的来龙去脉了。但是打印时获取到的数据是在哪里初始化的呢?很明显,我们可以看到get_stats中shard变量中获取到数据,即该结构体变量在某个地方进行了初始化allocate,同样也有对应的deallocate

src/include/mempool.h

在这里插入图片描述

同时,利用pool_t的allocate函数构造了对应的工厂函数

在这里插入图片描述

该工厂函数就是最后我们具体对象模块中的数据结构,工厂函数初始化了如下一些列类,即这一些类在初始化对象是的分配空间方式会由pool::allocate实现

src/os/bluestore/BlueStore.cc

在这里插入图片描述

总结

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

更多相关:

  • Socket/ServerSocket 选项 原文:Socket/ServerSocket 选项在网络编程中,Socket/ServerSocket有一些选项用来自定义一些行为,现在分享一下。   Socket选项 1.TCP_NODELAY 在Socket发送数据时,默认情况下,数据会先进入缓冲区,等缓冲区满了再发送...

  • 在《Android网络编程》系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象层。本篇文章将会让我们清楚的了解和学会使用Socket。 什么是Socket?它又是如何运作的?它的表现形式是什么?等等这些问题,本篇文章将逐步的揭...

  • 草色新雨中, 松声晚窗里。之前我们学习 Power Query 都是用鼠标就完成了很多复杂的操作。虽然 PowerQuery 已经将大部分常用功能内置成到功能区。基本能完成我们大部分的报表自动化功能。但是总有些复杂的或者个性化的问题是开发团队没有预先想到的,这时我们就需要学习 M 语言。一、M 语言在哪里?M语言的函数公式有三个地...

  • 前言从2020年3月份开始,计划写一系列文档--《小白从零开始学编程》,记录自己从0开始学习的一些东西。第一个系列:python,计划从安装、环境搭建、基本语法、到利用Django和Flask两个当前最热的web框架完成一个小的项目第二个系列:可能会选择Go语言,也可能会选择Vue.js。具体情况待定,拭目以待吧。。。基本概念表达式表...

  • 1.1函数1.1.1什么是函数函数就是程序实现模块化的基本单元,一般实现某一功能的集合。函数名:就相当于是程序代码集合的名称参数:就是函数运算时需要参与运算的值被称作为参数函数体:程序的某个功能,进行一系列的逻辑运算return 返回值:函数的返回值能表示函数的运行结果或运行状态。1.1.2函数的作用函数是组织好的,可重复使用的,用来...

  • 原标题:基于Python建立深度神经网络!你学会了嘛?图1 神经网络构造的例子(符号说明:上标[l]表示与第l层;上标(i)表示第i个例子;下标i表示矢量第i项)单层神经网络图2 单层神经网络示例神经元模型是先计算一个线性函数(z=Wx+b),接着再计算一个激活函数。一般来说,神经元模型的输出值是a=g(Wx+b),其中g是激活函数(...

  • 在学习MySQL的时候你会发现,它有非常多的函数,在学习的时候没有侧重。小编刚开始学习的时候也会有这个感觉。不过,经过一段时间的学习之后,小编发现尽管函数有很多,但是常用的却只有那几个。今天小编就把常用的函数汇总一下,为大家能够能好的学习MySQL中的函数。MySQL常使用的函数大概有四类。时间函数、数学函数、字符函数、控制函数。让我...

  • java 中 bean 的生命周期 本篇中会对涉及到的知识点皆做出描述: 首先,我们先了解先虚拟机的类加载机制:  虚拟机把描述类的数据从Class 文件中加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 java 类型,这便是虚拟机的类加载机制。 也就是说,一个文本.java 文件要运行起来...