版本: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 文件要运行起来...