Ceph bluestore中的缓存管理

2023-11-19

从15年3月接触Ceph分布式存储系统,至今已经5年了;因为工作的需要,对Ceph的主要模块进行了较深入的学习,也在Ceph代码层面做了些许改进,以满足业务需要(我们主要使用M版本)。最近得闲,将过往的一些学习心得、改进以及优化思路记录下了,希望能对后来者有所帮助。

这是第四篇:Ceph bluestore中的缓存管理

前言

bluestore构建在裸盘上,在用户空间,通过FreelistManager以及Allocator来管理磁盘空间且通过direct-io访问磁盘,所以它不能够利用到系统的pagecache。为了提升性能,bluestore在用户态实现了基于2q和lru算法的cache。

bluestore中的缓存管理

缓存对象及相关数据结构

在继续后文前,我们先来明确几个主要的结构及其作用:

  1. Object: Ceph实际上分布式对象存储系统,通过Object来表示存储系统中的IO对象,类似传统文件系统中的文件,由数据(Bufferlist)和元数据(Onode)两部分组成
  2. Collection:pg的内存表示,常驻内存,它是Object对象的逻辑仓库
  3. bluestore_cnode_t:Collection的元数据
  4. Onode: Object的元数据,包含对象id以及指向对象数据逻辑位置<offset, len>的ExtentMap结构
  5. bluestore_onode_t:Onode的元数据,存储在db中
  6. Cache:bluestore 缓存对象,有LRUCache和TwoQCache两种
  7. OnodeSpace:Onode的缓存管理对象,包含一个Cache对象以及一个unordered_map类型的Onode映射
  8. Buffer:Object对象数据(bufferlist,offset,len)的缓存表示
  9. BufferSpace:用于管理Buffer,包含一个Buffer的map,角色类似OnodeSpace

Collection与bluestore_cnode_t, Onode与bluestore_onode_t的关系类似于Linux文件系统中内存inode与磁盘inode的关系

下面的UML类图展示了上述对象之间的关系:
在这里插入图片描述
OSD启动时,Bluestore会创建多个Cache实例,之后从db加载Collection到内存中时,通过cid % shard_num模与Cache关联,所有的Collection常驻内存,通过一个map来管理;每个Collection包含一个Cache指针,一个元数据对象bluestore_cnode_t以及一个OnodeSpace类型的onode_map变量,这个变量包含与Collection相同的Cache实例以及一个Onode的unorderd_map对象(这个unorderd_map应该是用来加速查找的,因为Cache可能被多个Collection共享,通过每个OnodeSpace中的专属结构来管理本Collection的Onode,可以提升效率)。

Ceph中的对象元数据(这里说的元数据是指数据元数据,对象属性通过ObjectMap来管理)通过Onode来管理,包含对象的id以及一个ExtentMap结构来表示对象的数据偏移及长度信息,每个Extent表示逻辑上连续的数据片段,通过<offset, len>来标识;由于一段逻辑数据在物理上可能不连续,可能对应多个物理存储区bluestore_pextent_t, 为便于管理引入了Blob,它是bluestore_pextent_t的集合(PExtentVector),Blob还是Ceph中的数据共享单位,快照克隆的时候,共享数据通过更新引用计数即可,不需要磁盘拷贝。

Bluestore提供了LRU cache 和 2Q cache两种缓存机制,默认采用2Q cache。LRUCache,淘汰最近最少使用的item,采用list来实现,Onode和Buffer各占用一个队列;TwoQCache,针对Onode和Buffer采用不同的处理方式,其中Onode缓存采用LRU实现,而Buffer将整个缓存空间分为三部分,使用三个队列,分别称为hot,warm_in,warm_out来管理,新加入的数据加入到warm_in队列,再次访问的数据加入到hot队列,warm_in中的冷数据向移到warm_out队列,另外TwoQCache充分利用局部性原理,加入对象时会根据offset匹配前后的对象,将新对象加入到临近对象的前面。下图是LRU和2Q缓存的一个示例说明:
在这里插入图片描述

缓存管理

缓存系统的基本操作包括CRUD四种,Cache主要提供了:add(C),touch(U),rm(D),trim(D)四个方法,OnodeSpace或者BufferSpace提供了:add(C),rename(U),lookup(R),discard (U),remove(D)四个方法, 可以想到OnodeSpace和BufferSpace实现了一部分业务语义:

add方法:包括Onode和Buffer两部分,就Onode而言:LRUCache和TwoQCache采用相同的策略,如果对象已经在缓存中,则直接返回,否则将Onode加入到OnodeSpace的onode_map中并插入到cache的onode队列的头部;对于Buffer:LRUCache采用与Onode相同的策略,将对象插入到cache的buffer队列的头部,而TwoQCache维护了三个队列,根据热度属性将对象分别添加到hot,warm_in,warm_out队列。
lookup方法:用来从OnodeSpace的onode_map中查找对象,如果找到则通过touch方法将对象提升到cache的onode队列的头部,需要注意的是TwoQCache中,只有hot队列中的队列才会提升到cache的头部。
rm方法:包括Onode和Buffer两部分,就Onode而已:LRUCache和TwoQCache采用相同的策略,将对象从队列中删除,将对象从OnodeSpace的onode_map中删除;对于Buffer:LRUCache采用与Onode相同的策略,将对象从队列中删除,TwoQCache则将对象从hot,warm_in,warm_out之一中移除。
trim方法:根据需要保留的onode_max以及buffer_max清理缓存,包括Onode和Buffer两部分,基本上就是简单的将对象从队列中移除,TwoQCache对Buffer的处理有些许不同:它根据各队列的数据空间占比(ratio)来计算每个队列需要移除的对象。
rename方法:处理对象的重命名操作。
discard方法:淘汰给定区间的缓存对象。

缓存的使用

下文从缓存初始化,读IO和写IO三个方面来分析Bluestore cache的使用。

  1. 缓存的初始化
    1)OSD init初始化时 Bluestore根据设置的shard_num, cache_type创建cache实例
    2)Bluestore mount时从db加载Collection,通过cid与 shard_num取模关联特定的cache实例,Blustore通过一个map来管理内存中的Collection。
  2. 读io缓存使用
    1)Bluestore收到读请求后,从cache中获取对象的onode(包含extent信息),并且将onode移到队列的头部
    2)如果上述获取的onode的extent中不全部包含<offset, len>所需要的信息,则从db中加载缺失部分的extent
    3)根据<offset, len>从cache中读取缓存数据,并将命中的数据移到队列头部
    4)对于不在缓存中的数据则从后端磁盘上读取,如果启用了bufferIO,则将数据加入到缓存队列头部(warm_in队列)
  3. 写io缓存使用
    1)Bluestore收到写请求后,从cache中获取onode或者创建一个onode, 并将onode插入队列的头部
    2)如果上述获取的onode的extent中不全部包含<offset, len>所需要的信息,则从db中加载缺失部分的extent
    3)如果启用了bufferIO,则将数据(如果IO区间有重叠会先从磁盘读取数据做合并)加入到缓存队列的头部
    4)(在执行io前)将缓存元数据(Onode,SharedBlob)持久化到db中(这个过程中,ExtentMap可能需要分片,根据needs_reshard_begin/needs_reshard_end来决定需要reshard的区间)。

步骤3中有几点需要注意:

  1. 数据缓存是以Blob单位进行的,
  2. 如果和之前的缓存数据有部分重叠,会truncate掉front和tail,如果完全包含则先从cache中删除掉
  3. 根据数据的热度属性将对象添加到不同的队列中,新增的数据插入到warm_in队列,如果与之前的数据有重叠,那么加入哪个队列与之前数据的热度属性相关
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ceph bluestore中的缓存管理 的相关文章

  • verilog 基本语法 {}大括号的使用

    的基本使用是两个 一个是拼接 一个是复制 下面列举了几种常见用法 基本用法 表示拼接 第一位 第二位 表示复制 4 a 等同于 a a a a 所以 13 1 b1 就表示将13个1拼接起来 即13 b1111111111111 拼接语法详

随机推荐

  • 学习总结——按下按键灯亮,再次按下按键,灯灭

    按键控制灯的亮灭 1 主要实现按键控制灯的亮灭 按键按下 灯亮 再次按下 灯灭 主要对实现的逻辑进行控制 逻辑清晰 很简单 实现的方法有两种 方法1 将按键按下的值赋值给一个变量 变量除以2的值的是基数或者偶数来确定灯亮还是灯灭 程序中设置
  • 堆栈 对比

    https www cnblogs com guoxiaoyan p 8664150 html
  • STL — Set/Multiset容器

    1 1 Set容器基本概念 Set的特性是 所有元素都会根据元素的键值自动被排序 Set的元素不像map那样可以同时拥有实值和键值 set的元素即是键值又是实值 set不允许两个元素有相同的键值 我们可以通过set的迭代器改变set元素的值
  • POI解析word\pdf中表格

  • Windows10下SlowFast环境安装和运行

    SlowFast安装详解 第一步 下载官方源码 第二步 我搭建的环境配置 第二步 安装其他包以及出现的问题 第三步 构建SlowFast 第四部 下载权重和标签 第五步 更改参数 第六步 当然是运行啦 第一步 下载官方源码 github代码
  • Retrofit2.0使用详解

    简介 Retrofit是由Square公司提供的开源产品 为Android平台的应用提供一个类型安全的REST客户端 其实质上是对OkHttp的封装 使用面向接口的方式进行网络请求 利用动态生成的代理类封装了网络接口请求的底层 将REST
  • Windows程序员必须掌握的计算机编码问题——海明码(通俗易懂)

    我是荔园微风 作为一名在IT界整整25年的老兵 今天总结一下计算机中的编码问题 来看第二部分 海明码 很多初学者一看到海明码就郁闷 因为课本上关于海明码的描述实在是太难懂了 那就跟随我一起来搞懂海明码 我用最简单最好懂的方式描述 我不会使用
  • 基于STM32F4单片机对步进电机的控制(有代码)

    步进电机简介 步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件 又称为脉冲电机 在驱动电源的作用下 步进电机受到脉冲的控制 其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比 步进电机每接收一个电脉冲 转
  • R语言 write.xlsx() 写入同一excel,及同一sheet注意

    write xlsx x file sheetName Sheet1 col names TRUE row names TRUE append FALSE showNA TRUE 1 想要将data1写da xlsx的sheet1 data
  • spring boot 配合element ui vue实现表格的批量删除(前后端详细教学,简单易懂,有手就行)

    目录 一 前言 二 前端代码 2 1 element ui组件代码 2 2删除按钮 2 3 data 2 4 methods 三 后端代码 一 前言 研究了其他人的博客 找到了一篇有含金量的 进行了部分改写实现前后端分离 参考博主为小白Ra
  • 【下降算法】最速下降法、Newton法、共轭梯度法

    文章目录 1 一维搜索 2 最速下降法 最速下降法特征 最速下降法的优缺点 3 Newton法 算法基本思想 牛顿法和梯度下降法的效率对比 4 共轭梯度法 1 一维搜索 最优化问题一般选择某一组变量 然后在满足一定的限制条件下 求出使目标值
  • Servlet 和 Cookie-Session 学习笔记(基础)

    简单来说 是运行在服务器端的 Java 程序 它作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层 用处 使用 Servlet 您可以收集来自网页表单的用户输入 呈现来自数据库或者其他
  • PyCrypto,PyCryptodome, Python 调用密码学算法AES

    Crypto PyCrypto PyCryptodomeCrypto PyCrypto 参考网址附上 今天我真的也是很无奈了 想要做一个密码学的作业 需要用到pycrypto的包 但是安装完之后不能正常调用 就找到了PyCryptodome
  • fetch 服务器不响应,Fetch 常见的使用问题

    fetch的浏览器兼容 fetch默认不携带cookie fetch发送请求默认是不发送cookie的 不管是同域还是跨域 需要设置 fetch url credentials include 可以配置其credentials项 其有3个值
  • CAN FD基础

    CAN FD基础 一 CAN FD与CAN 2 0的区别 1 CAN FD的优势 该协议能够支持更高的速率 可以更快的刷写ECU 在单个数据帧内传送率可达64字节 避免了经常发生的数据分拆传输的状况 对汽车行业而言 CAN FD协议显得非常
  • CVE-2023-21839 Weblogic IIOP RCE复现

    漏洞描述 WebLogic是美国Oracle公司出品的一个application server 用于本地和云端开发 集成 部署和管理大型分布式Web应用 网络应用和数据库应用的Java应用服务器 WebLogic Server是一个基于JA
  • 微信图片上传 invalid credential, access_token is invalid or not latest

    这个问题可能是因为你部署的时候 起了多个进程 每个进程都去微信的服务器获取一次access token 只有最后一个获取到的access token才有效 比如 如果你用gunicorn去启django 并设置4个进程 那么你会发现 每上传
  • spring id,name

    转载于 https www cnblogs com 549294286 p 9947815 html 在BeanFactory的配置中 是我们最常见的配置项 它有两个最常见的属性 即id和name 最近研究了一下 发现这两个属性还挺好玩的
  • 如何覆盖上一次commit_Git如何在已有的 commit 上再次提交?

    在一些受管控的项目上 提交代码到 git 服务器后 还需要经过审核确认才正式合入版本 一般常用 gerrit 来进行审核确认操作 如果提交的代码审核不通过 需要再次修改提交 由于是修改同一个问题 我们可能不希望生成多个 commit 信息
  • Ceph bluestore中的缓存管理

    从15年3月接触Ceph分布式存储系统 至今已经5年了 因为工作的需要 对Ceph的主要模块进行了较深入的学习 也在Ceph代码层面做了些许改进 以满足业务需要 我们主要使用M版本 最近得闲 将过往的一些学习心得 改进以及优化思路记录下了