ceph bluestore 源码分析:刷缓存(trim)逻辑
环境
ceph版本:12.2.1
部署模式:ec 2+1
osd: 3个 且资源池已经有数据
执行命令:ceph daemon osd.0 flush_store_cache
进行刷缓存。即将dump_mempools内存池管理的bluestore cache中的无用数据进行释放
主要参数:
bluestore_cache_trim_interval = 0.2 #bluestore cache trim的时间间隔
bluestore_cache_trim_max_skip_pinned # trim cache的时候,如果遇见item是pin的,计数+1,计数超过此值后,停止做trim。默认为64
bluestore_cache_type = 2q #blustore cache类型,默认是2q
bluestore_2q_cache_kin_ratio = 0.5 #2q cache中真正存储新的缓存页面的链表 Ain 所占用整个cache空间的比例
bluestore_2q_cache_kout_ratio = 0.5 # 2q cache中存储被正常淘汰的缓存页面的链表 Alout 所占用整个cache的空间比例
debug_bluestore = 20/20 #设置bluestore的debug日志级别
debug_bdev = 20/20 #设置bdev的debug日志级别
刷缓存源码分析
刷缓存方式主要有两种,两种基本逻辑没有什么区别
- osd内部bstore_mempool线程自己每隔一时间调用trim
- OSD 子线程 admin_socket接收到终端用户 flush_store_cache信号调用trim函数
第一种方式
第二种方式
基本源码调用逻辑很简单,以我们执行ceph daemon osd.0 flush_store_cache
命令的源码调用函数栈如下:
/usr/bin/ceph-osd(BlueStore::SharedBlob::put()+0x2c)
/usr/bin/ceph-osd(BlueStore::Extent::~Extent()+0xd1)
/usr/bin/ceph-osd(BlueStore::Onode::put()+0x96) //回收onode磁盘空间,调用extent的析构函数,sharedblob的析构函数
/usr/bin/ceph-osd(BlueStore::TwoQCache::_trim(unsigned
/usr/bin/ceph-osd(BlueStore::Cache::trim_all()+0x30)
/usr/bin/ceph-osd(BlueStore::flush_cache()+0x7c) //调用flush_cache函数执行trim
/usr/bin/ceph-osd(OSD::asok_command(std::basic_string<char, //admin_socket线程处理命令
删除onde的时候即Onode::-put
函数,先将onode从当前onode_map中删除,再析构掉onode对象
remove掉sharedblob磁盘数据结构。remove过程中同样需要将sharedblob先从sharedblob_set中移除,由remove
函数执行,然后再释放sharedblob空间
这里介绍几个bluestore常驻内存的数据结构:
Cache
基类
- 在管理用户数据的onode和lcollection之间有一个结构 OnodeSpace
这里可以看到一个每个bluestore可以包含多个cache。因为不同PG之间的客户端请求可以并发处理,为了提升性能,每个OS相应得会设置多个PG工作队列,bluetore 中的Cache实例个数与之对应 - 在真正用户数据blob和cache之间的数据结构BufferSpace
- BufferSpace的管理的基本单元Buffer,每个Buffer负责管理blob中的一段数据
- TwoQCache类
可以看到TwoQCache维护四个队列。所有的Onode
与Buffer
最终都加入Cache,进行全局热度识别和应用淘汰策略。在BlueStore中的2Q实现,这两类数据分别应用了不同的淘汰策略:针对管理用户数据的单元Onode采用LRU,针对用户数据单元buffer使用2Q算法。
相关文章:

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

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

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

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

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

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

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

log4j个人使用整理
Log4j介绍: 略过。 配置: Eclipse项目中添加log4j.jar到lib下。 在bin目录下新建log4j.properties,编辑好log4j配置文件。 样例分析: 1 log4j.rootLoggerWARN, stdout, file2 log4j.appender.stdoutorg.apache.log4j.ConsoleAppen…

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

Rocksdb 与 TitanDb 原理分析 及 性能对比测试
文章目录前言Rocksdb的compaction机制compaction作用compaction分类level style compaction(rocksdb 默认进行的compaction策略)level 的文件存储结构compaction过程compaction中的level target sizeuniversal style compactionfifo style compactionTit…

经典SQL练习题
题目地址: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的方法:1、通过配置文件修改URL规则;2、设置URL伪静态,即限制伪静态的后缀;3、在配置文件中开启路由支持,并配置路由;4、将URL进行重写即可。PHP对URL设置一、…

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

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

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

php数据库html文本,关于php,mysql,html的数字分页和文本_php
请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1请勿盗版,转载请加上出处http://blog.csdn.net/yanlintao1首先进行样式展示希望对大家有所帮助,也希望大家给出意见和建议:第一种:数字分页第二种:…

WinDbg加载不同版本CLR
WinDbg调试.net2.0和.net4.0程序有所不同,因为.net4.0使用新版本的CLR。例如: mscoree.dll 变为 mscoree.dll 和 mscoreei.dll, mscorwks.dll 变为 clr.dll, mscorjit.dll 变为 clrjit.dll。 因此,在.net2.0加载mscorj…

交换机***工具——Yersinia
Yersinia是国外一款专门针对交换机执行第二层***的***工具。目前的版本是0.7.1。目前支持的操作系统及版本号如表1所示。表1 Yerdinia支持的操作系统操作系统名称版本号OpenBSD3.4 (pcap库版本至少0.7.2以上)Linux2.4.x和2.6.xSolaris5.8 64bits SPARCMac OSX10.4 Tiger (Intel…

Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解
文章目录前言Rocksdb写流程图WAL 原理分析概述文件格式查看WAL的工具创建WAL清理WALMANIFEST原理分析概述查看MANIFEST的工具创建 及 清除 MANIFEST文件内容CcolumnFamily 详解概述API介绍核心数据结构创建以及删除MEMTABLE 实现概述实现Rocksdb写入逻辑概述实现总结关于写的一…

react 入门
首先安装node.js环境 下载地址 https://nodejs.org/en/download/检查安装版本 进入命令行npm -v~~3. 安装react命令环境 npm install - g react-native-cli ~~~ 初始化项目 FirstAppreact-native init FirstApp 转载于:https://www.cnblogs.com/liu-ya/p/10511537.html

将字符串打乱输出
将字符串打乱输出 Dim i,mm,Str,StrPosition,NewStrStr "1234567890"For i1 To Len(Str) StrPosition GetRandomMath(1,Len(Replace(Str,mm,""))) Str Replace(Str,mm,"") mm Mid(str,StrPosition,1) …
php帝国系统调出图片内空,帝国CMS图集字段的大图,小图,说明的调用方法
本文实例讲述了帝国CMS图集字段的大图,小图,说明的调用方法。分享给大家供大家参考。具体方法如下:复制代码代码如下:$arr array();$arr $navinfor[morepic];$newarr explode(egetzy(rn),$arr);$count count(explode(egetzy(rn),$navinfor[morepic]));//图集的图…

static和global的区别
1.global在整个页面起作用。2.static只在function和class内起作用。global和$GLOBALS使用基本相同,但在实际开发中大不相同。global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址&#x…

vue 之 nextTick 与$nextTick
VUE中Vue.nextTick()和this.$nextTick()怎么使用? 官方文档是这样解释的: 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 虽然 Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考ÿ…

Linux创建线程时 内存分配的那些事
文章目录问题描述问题分析针对问题1 的猜测:针对问题2 的猜测:原理追踪总结问题描述 事情开始于一段内存问题,通过gperf工具抓取进程运行过程中的内存占用情况。 分析结果时发现一个有趣的事情,top看到的实际物理内存只有几兆,但是pprof统计…

mysql plsql循环语句吗,Oracle PLSQL 在游标中用while循环实例程序
Oracle PLSQL 在游标中用while循环实例程序Oracle PLSQL 在游标中用while循环实例程序Oracle PLSQL 在游标中用while循环实例程序declarecursor emp_cur is select * from emp;v_emp emp%rowType;beginopen emp_cur;while emp_cur%notfound --while肯定要跟loop一起用的 且是控…

【原创】Linux环境下的图形系统和AMD R600显卡编程(11)——R600指令集
1 低级着色语言tgsi OpenGL程序使用GLSL语言对可编程图形处理器进行编程,GLSL语言(以下高级着色语言就是指GLSL)是语法类似C的高级语言,在GLSL规范中,GLSL语言被先翻译成教低级的类汇编语言,然后被翻译成硬…

VBScript中InStr函数的用法
InStr([start, ]str1, str2[, compare]) [用途]:返回str2在str1中的位置。匹配成功时,返回值最小值为1,未匹配到时返回0。 [参数说明]: start:在str1中开始匹配的位置,1表示从头开始,不能为0或更小值。 可选…

洛谷P3122 [USACO15FEB]圈住牛Fencing the Herd(计算几何+CDQ分治)
题面 传送门 题解 题目转化一下就是所有点都在直线\(AxBy-C0\)的同一侧,也就可以看做所有点代入\(AxBy-C\)之后的值符号相同,我们只要维护每一个点代入直线之后的最大值和最小值,看看每条直线的最大最小值符号是否相同就好了 以最大值为例&am…

skiplist跳表的 实现
文章目录前言跳表结构时间复杂度空间复杂度高效的动态插入和删除跳表索引的动态更新总结详细实现前言 rocksdb 的memtable中默认使用跳表数据结构对有序数据进行的管理,为什么呢? 同时redis 也用跳表作为管理自己有序集合的数据结构,为什么…