环境:

版本: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中的数据就是实时获取显示得。

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

  1. ceph bluestore源码分析:C++ 获取线程id

    阅读ceph源码过程中需要明确当前操作是由哪个线程发出,此时需要根据线程id来确认线程名称 C++获取线程id是通过系统调用来直接获取 函数描述 头文件:<sys/syscall.h> 函 ...

  2. ceph bluestore 源码分析:ceph-osd内存查看方式及控制源码分析

    文章目录 内存查看 内存控制 内存控制源码分析 通过gperftools接口获取osd进程实际内存 动态设置cache大小 动态调整cache比例 trim释放内存 本文通过对ceph-osd内存查看 ...

  3. ceph bluestore源码分析:非对齐写逻辑

    文章目录 环境 原理说明 总结 环境 ceph:12.2.1 场景:ec 2+1 部署cephfs,执行如右写模式:dd if=/dev/zero of=/xxx/cephfs bs=6K count ...

  4. ceph bluestore 源码分析:刷缓存(trim)逻辑

    环境 ceph版本:12.2.1 部署模式:ec 2+1 osd: 3个 且资源池已经有数据 执行命令:ceph daemon osd.0 flush_store_cache 进行刷缓存.即将dump ...

  5. AsyncHttpClient源码分析-基于Netty的连接池实现

    原文地址:asynchttpclient源码分析-基于Netty的连接池实现 最近项目重构,有了个机会更多接触一个有别于HttpAsyncClient的异步网络框架AsyncHttpClient,是个 ...

  6. 极光实时监听怎么调用_源码分析 Sentinel 实时数据采集实现原理(图文并茂)

    本篇将重点关注 Sentienl 实时数据收集,即 Sentienl 具体是如何收集调用信息,以此来判断是否需要触发限流或熔断. Sentienl 实时数据收集的入口类为 StatisticSlot. ...

  7. 源码分析 Sentinel 实时数据采集实现原理

    本篇将重点关注 Sentienl 实时数据收集,即 Sentienl 具体是如何收集调用信息,以此来判断是否需要触发限流或熔断. 本节目录 1.源码分析 StatisticSlot 1.1 Stati ...

  8. Spark源码分析之九:内存管理模型

    Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...

  9. 云客Drupal源码分析之数据库Schema及创建数据表

    本主题是<云客Drupal源码分析之数据库系统及其使用>的补充,便于查询,所以独立成一个主题 讲解数据库系统如何操作Schema(创建修改数据库.数据表.字段:判断它们的存在性等等),以及 ...

最新文章

  1. 清华孵化、张钹加盟的这家公司,现在把“第三代人工智能”落地了
  2. linux usb组合设备,USB组合设备(5)
  3. oracle数据库的详细安装,Oracle 11g数据库详细安装图文教程
  4. 蓝桥杯java第七届决赛第三题--打靶
  5. visual studio如何更改启动项目?
  6. python matplotlib:figure,add_subplot,subplot,subplots讲解实现
  7. java jdbc修改_java----jdbc(数据库的添加,删除,修改,更新)
  8. 怎么在安卓布局里设置滚动字体_Get新技能|如何在手机上设置文字版拼音?
  9. LeetCode 1979. 找出数组的最大公约数
  10. 交叉编译及linux简单程序设计,嵌入式实验6交叉编译及Linux简单程序设计实验
  11. 软测经典面试题(一)
  12. I/O多路复用通信连接select篇
  13. html5实现拖拽上传图片,JS HTML5拖拽上传图片预览
  14. python给用户打标签_用户画像—打用户行为标签
  15. vs2010断点调试详细教程
  16. 狮子鱼社区团购小程序独立版 安装教程及后台设置小程序APPID,微信支付,腾讯地图AppKey
  17. linux安装steam提示没有32位,12.10- 试图安装 Steam 错误: 你缺少以下 32位库,并且 Steam 可能无法运行...
  18. 100M宽带能下载多快? 关于带宽的下载速度研究
  19. 充电桩,成了新能源汽车发展的“拦路虎”?
  20. Unity 之 音频类型和编码格式介绍

热门文章

  1. 7月份没啥写的。。。
  2. VS2010创建ATL类时需要手动填写ProgID
  3. Ubuntu18.04运行ORB_SLAM2
  4. css多行省略号兼容ie,css超出2行部分省略号……,兼容ie
  5. 关于创建zeromq消息队列,设置和更改IP地址,远程可以访问,不只是本地链接。python代码。
  6. c++获取可用端口号_PG高可用架构实施方案
  7. libc.so.6 is needed by mysql_libc.so.6(GLIBC_2.14)(64bit) is needed by…问题的解决办法
  8. ajax返回一段html代码,【提问】ajax请求返回整个html页面
  9. php yii2支付宝开发,yii2 支付宝支付教程 [ 2.0 版本 ]
  10. oracle 统计信息字典表,Oracle数据字典表查询