当前位置: 首页 > 编程日记 > 正文

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

相关文章:

java clob内存溢出_java - java.sql.SQLException:ORA-01704:字符串文字太长时插入或更新 - 堆栈内存溢出...

通常,当我插入4000个字符限制时,它的工作正常,但当超过4000个字符时,它抛出SQL异常字符串文字太长,即使我的DISCHARGE_TEXT数据类型是CLOB我的JavaScript代码是function saveAsDraftNew(){var admissionNo document.g…

LC并联谐振回路

转载于:https://www.cnblogs.com/prayer521/p/4103091.html

zencart分类页产品页去掉url中的id号

最近公司新上的网站被seo指出要修改url,去掉url中产品id。由于我们用的是zencart框架,装了 Ultimate SEO URLs 插件,所以在网上应该有这方面的资料,本文主要参考资料:原网址:修改seo url中去掉产品id的方法…

hexo博客更新主题后上传Git操作

克隆主题: git clone https://github.com/SuperKieran/TKL.git _config.yml文件中主题改为新增主题 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: TKL 进入主题目录,更新git cd theme/TKL git pull 执行更新 hexo clean hex…

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

文章目录环境原理说明总结环境 ceph:12.2.1 场景:ec 21 部署cephfs,执行如右写模式:dd if/dev/zero of/xxx/cephfs bs6K count4 oflagdirect 关键配置: bluestore_min_alloc_size_hdd 65536 bluestore分配空间的最小粒度 单位:B…

JVM系列(之ClassLoader)

Class Loader Java运作流程 内部class loader bootstrap class loader --引导类加载器,它负责加载Java的核心类【java.* 】(如classpath下面的类库),不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。Code . UR…

java平台类成员访问修饰符_JAVA类的修饰符及访问权限

1.类外部类 class前的修饰符只能有publicfinalabstrct无(默认) :同包可见 (Eclipse中选择package)内部类 class前的修饰符有public、protected、private、默认、final、abstract、static。先看类的访问权限,再看成员的访问权限,类…

ios实例开发精品源码文章推荐

1、IOS代码分享:视图布局(View Layout)Border View140601bvpw22rir88b9i8i.png(19.97 KB, 下载次数: 0)下载附件保存到相册半小时前 上传http://www.apkbus.com/android-101999-1-14.html2、IOS代码分享:导航条(Navigation Bar&am…

Spring BeanDefinitionRegistryPostProcessor BeanPostProcessor作用

写博客,写博客,把自己知道的小知识点全部记录,? BeanDefinitionRegistryPostProcessor 接口属于Beanddefination 装配定义的范畴,此时bean 并没有初始化 BeanPostProcessor属于be an 实例化修改的范畴,be an 已经进行…

关于ceph源码 backtrace 打印函数调用栈

当集中精力看一个问题的时候,时间久了就会有这样一个状态,天空飘来五个字,那都不算事 ceph源码庞大的体量以及复杂的设计让很多人望而却步,尤其是大量的纯虚函数更是让读者迷失在代码的海洋,这个时候函数调用栈是一个救…

泛型java 代码讲解_Java泛型详解

2516326-5475e88a458a09e4.png一,打破砂锅问到底泛型存在的意义?泛型类,泛型接口,泛型方法如何定义?如何限定类型变量?泛型中使用的约束和局限性有哪些?泛型类型的继承规则是什么?泛…

(转)金额转中文大写

public class RMB {//返回转换好的大写形式public static String numberToRMB(String money) {return cleanZero(splitNum(roundString(money)));}// 将小写金额转换成大写金额private static String splitNum(String s) {// 如果传入的是空串则继续返回空串if ("".e…

[IOS]UIWebView实现保存页面和读取服务器端json数据

如何通过viewView保存访问过的页面?和如何获取并解析服务器端发送过来的json数据?通过一个简单的Demo来学习一下吧! 操作步骤: 1.创建SingleViewApplication应用,新建VIewController,并在xib试图中添加WebV…

struts2之配置文件struts.xml详解

struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解 以便于理解 和修改 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Str…

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

环境 ceph版本&#xff1a;12.2.1 部署模式&#xff1a;ec 21 osd&#xff1a; 3个 且资源池已经有数据 执行命令&#xff1a;ceph daemon osd.0 flush_store_cache 进行刷缓存。即将dump_mempools内存池管理的bluestore cache中的无用数据进行释放 主要参数: bluestore_cac…

php中怎么过滤器_PHP 过滤器(Filter)

过滤多个输入表单通常由多个输入字段组成。为了避免对 filter_var 或 filter_input 重复调用&#xff0c;我们可以使用 filter_var_array 或 the filter_input_array 函数。在本例中&#xff0c;我们使用 filter_input_array() 函数来过滤三个 GET 变量。接收到的 GET 变量是一…

c++ Qt向PHP接口POST文件流

Qt调用PHP写的接口&#xff0c;向其传递图片文件&#xff0c;并保存在服务器。 二进制文件无法直接传递&#xff0c;Qt采用Base64进行编码发送&#xff0c;PHP解码保存为文件。 注意&#xff1a;PHP收到数据之后会将POST过来的数据中的加号()替换为空格&#xff0c;造成接收到的…

在网络通讯中应用Protobuf

Protobuf的设计非常适用于在网络通讯中的数据载体&#xff0c;它序列化出来的数据量少再加上以K-V的方式来存储数据&#xff0c;对消息的版本兼容性非常强&#xff1b;还有一个比较大的优点就是有着很多的语言平台支持。下面讲解一下如何在TCP通讯应用中集成Protobuf. Protobuf…

JS中Math函数的常用方法

Math 是数学函数&#xff0c;但又属于对象数据类型 typeof Math > ‘object’ console.dir(Math) 查看Math的所有函数方法。 1&#xff0c;Math.abs() 获取绝对值 Math.abs(-12) 12 2&#xff0c;Math.ceil() and Math.floor() 向上取整和向下取整 console.log(Math.ceil(1…

C++ 泛型编程 -- 函数模版

文章目录定义声明调用方式函数模版的重载函数模版的特点工作中一个同事写了测试demo&#xff0c;想要自己尝试使用发现调用老出错&#xff0c;请教的时候发现是函数模版&#xff0c;有自己的调用方式&#xff0c;并且发现核心代码中大量的函数模版和类模版。特此做一个函数模版…

bellman_ford寻找平均权值最小的回路

给定一个有向图&#xff0c;如果存在平均值最小的回路&#xff0c;输出平均值。 使用二分法求解&#xff0c;对于一个猜测值mid&#xff0c;判断是否存在平均值小于mid的回路 如果存在平均值小于mid的包含k条边的回路&#xff0c;那么有w1w2w3...wk < k * mid,即(w1-mid)(w2…

守护进程中创建的对象php,在PHP中生成守护进程(Daemon Process)

前两天看到一篇文章《如何使用PHP编写daemon process》&#xff0c;其中对核心代码却没有细说&#xff0c;我又查了一些资料&#xff0c;还看了一本《理解Unix进程》&#xff0c;才搞明白生成守护进程的时候发生了什么。这段代码是这个样子的&#xff1a;function run(){//第一…

log4j个人使用整理

Log4j介绍&#xff1a; 略过。 配置&#xff1a; Eclipse项目中添加log4j.jar到lib下。 在bin目录下新建log4j.properties&#xff0c;编辑好log4j配置文件。 样例分析&#xff1a; 1 log4j.rootLoggerWARN, stdout, file2 log4j.appender.stdoutorg.apache.log4j.ConsoleAppen…

完全理解 Python 迭代对象、迭代器、生成器(转)

完全理解 Python 迭代对象、迭代器、生成器 本文源自RQ作者的一篇博文&#xff0c;原文是Iterables vs. Iterators vs. Generators nvie.com&#xff0c;俺写的这篇文章是按照自己的理解做的参考翻译&#xff0c;算不上是原文的中译版本&#xff0c;推荐阅读原文&#xff0c;谢…

Rocksdb 与 TitanDb 原理分析 及 性能对比测试

文章目录前言Rocksdb的compaction机制compaction作用compaction分类level style compaction&#xff08;rocksdb 默认进行的compaction策略&#xff09;level 的文件存储结构compaction过程compaction中的level target sizeuniversal style compactionfifo style compactionTit…

经典SQL练习题

题目地址&#xff1a;http://blog.csdn.net/qaz13177_58_/article/details/5575711 1、 查询Student表中的所有记录的Sname、Ssex和Class列。select sname,ssex,class from STUDENT2、 查询教师所有的单位即不重复的Depart列。select depart from TEACHER group by departselec…

php url模式在哪修改,php如何修改url

php如何修改url2020-07-03 12:15:40php修改url的方法&#xff1a;1、通过配置文件修改URL规则&#xff1b;2、设置URL伪静态&#xff0c;即限制伪静态的后缀&#xff1b;3、在配置文件中开启路由支持&#xff0c;并配置路由&#xff1b;4、将URL进行重写即可。PHP对URL设置一、…

国外十大最流行PHP框架排名

以下为十个目前最流行的基于MVC设计模式的PHP框架。1. YiiYii是一个基于组件的高性能的PHP的框架&#xff0c;用于开发大规模Web应用。Yii采用严格的OOP编写&#xff0c;并有着完善的库引用以及全面的教程。从MVC&#xff0c;DAO/ActiveRecord&#xff0c;widgets&#xff0c;c…

python_web框架

一、web框架 web框架&#xff1a; 自己完成socket的web框架&#xff1a;如&#xff0c;Tornado等由WSGI完成socket的web框架&#xff1a;如&#xff0c;Django、flash等两种实现过程&#xff1a; 第二种WSGI方式的&#xff0c;由于自带socket所以可直接写后端代码。 python标准…

g-gdb 调试多线程

代码调试工具gdb是一个能够让我们在工作中高效排查代码异常根源的利器。 在此将gdb针对多线程的调试方式做一个笔记&#xff0c;也方便后续回顾以及分享大家。 本文采用的是一个简单的多线程代码示例&#xff0c;同时调试是在mac上进行的 mac安装gdb brew install gdb即可 基…