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

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日志级别

刷缓存源码分析

刷缓存方式主要有两种,两种基本逻辑没有什么区别

  1. osd内部bstore_mempool线程自己每隔一时间调用trim
  2. 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维护四个队列。所有的OnodeBuffer最终都加入Cache,进行全局热度识别和应用淘汰策略。在BlueStore中的2Q实现,这两类数据分别应用了不同的淘汰策略:针对管理用户数据的单元Onode采用LRU,针对用户数据单元buffer使用2Q算法。

更多相关:

  • 本文研究nginx提供的缓存功能,下面是实操记录。 这篇博文基于前面文章的基础上搭建,至始至终都是root用户操作 http://blog.csdn.net/tao_627/article/details/78953800 缓存清除功能需要借助第三方模块ngx_cache_purge,其链接如下 https://github...

  • 下面是参考文献[1]的翻译 简介 ATS既可以用作HTTP代理,也可以用作HTTP缓存,ATS能够缓存任何字节流,虽然它当前只支持HTTP协议传输的字节流,当这样的流缓存时,会带一个HTTP协议头部,会命名为缓存中的一个对象object。每个对象通过一个名为cache key的全局唯一值识别。 该文档的目的是描述ATS缓...

  • 对Squid使用的几点总结 1.cache_dir 在Linux环境下用aufs类型的cache_dir比较稳定,速度也比较快。cache_dir所在文件系统如果用noatime选项来mount,可以避 免访问cache文件时经常要更新access time的操作。 一般cache容量和被加速内容的比值...

  • 策略模式作为行为型设计模式中的一种,主要封装相同功能的不同实现算法,用于在用户程序内部灵活切换。对用户来说能够快速替换对应的算法,能够让算法的实现独立于使用的用户。 基本的UML类图如下: 用户使用Stratey的实例能够快速得在不同的Cache算法之间灵活切换(直接使用对应的Cache实例来设置到Strategy之中即可。),...