这是一篇分享文,作者因为最近想深入研究下ceph的cache pool,作者写的文章非常的好,这里先直接翻译这篇文章,然后再加入我自己的相关数据

blog原文

作者想启动blog写下自己的Openstack和Ceph的相关经验,第一个话题就选择了 Ceph cache tiering , 作者的使用场景为短时间的虚拟机,用来跑测试的,这种场景他们准备用Nvme做一个缓冲池来加速的虚拟机

cache 相关的一些参数

target_max_bytes
target_max_objects
cache_target_dirty_ratio
cache_target_full_ratio
cache_min_flush_age
cache_min_evict_age

Jewel版本还新加入了一个参数

cache_target_dirty_high_ratio

作者的想法是先把数据写入到缓冲池当中,等后面某个时刻再写入到真实的存储池的当中

Flushing vs. Evicting

Flushing是将缓冲池中的数据刷到真实的存储池当中去,但是并不去删除缓冲池里面缓存的数据,只有clean的数据才能被evic,如果是dirty的数据做evic,那么先要flush到真实存储池,然后再删除掉

Cache 调整

Ceph的是不能够自动确定缓存池的大小,所以这里需要配置一个缓冲池的绝对大小,flush/evic将无法工作。

设置了上限以后,相关的参数就是cache_target_full_ratio和cache_target_dirty_ratio。这些参数是控制什么时候进行flush和evic的

这个dirty ratio是比较难设置的值,需要根据场景进行相关的调整

新版本里面到了dirty_high_ratio才开始下刷

还有cache_min_flush_age和cache_min_evict_age这个控制,这个一般来说到了设定的阀值前,这些对象的留存时间应该是要够老的,能够被触发清理掉的

通过ceph df detail 可以观测你的存储池的数据的情况

里面会有一些0字节对象的,缓冲池的0字节对象是数据已经被删除了,防止刷新的时候又要操作对象。在真实存储池中的0字节对象是数据已经在缓冲池当中,但没有刷新到缓冲池

案例测试

基于上面的控制,下面我们来具体看下这些参数的实际效果是怎样的,这样我们才能真正在实际场景当中做到精准的控制

首先我们要对参数分类

  • 缓冲池的总大小,这个大小分成两类一个对象个数控制,一个大小的控制
  • flush和evic的百分比,这个百分比既按照大小进行控制,也按照对象进行控制
  • flush和evic的时间控制

分好类以后,我们就开始我们的测试,基于对象的数目的控制,比较容易观察,我们就用对象控制来举例子

创建一个缓冲池的环境

ceph osd pool create testpool 24 24
ceph osd pool create cachepool 24 24
ceph osd tier add testpool cachepool
ceph osd tier cache-mode cachepool writeback
ceph osd tier set-overlay testpool cachepool
ceph osd pool set cachepool hit_set_type bloom
ceph osd pool set cachepool hit_set_count 1
ceph osd pool set cachepool hit_set_period 3600

上面的操作是基本的一些操作、我们现在做参数相关的调整

ceph osd pool set cachepool  target_max_bytes 1000000000000

为了排除干扰,我们把 target_max_bytes设置成了1T,我们的测试数据很少,肯定不会触发这个大小

ceph osd pool set cachepool target_max_objects 1000

设置缓冲池的对象max为1000

ceph osd pool set cachepool cache_target_dirty_ratio 0.4

设置dirty_ratio为0.4,也就是0.4为判断为dirty的阀值

ceph osd pool set cachepool cache_target_full_ratio 0.8

设置cache_target_full_ratio为0.8,即超过80%的时候需要evic

ceph osd pool set cachepool cache_min_flush_age 600
ceph osd pool set cachepool cache_min_evict_age 1800

设置两个flush和evic的时间,这个时间周期比我写入的数据的时间周期大很多,这个等下会调整这个

开启一个终端动态观察存储池的对象变化

[root@lab8106 ~]# watch ceph df
Every 2.0s: ceph df GLOBAL:
SIZE AVAIL RAW USED %RAW USED
834G 833G 958M 0.11
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
rbd 0 0 0 277G 0
metadata 1 61953k 0.01 416G 39
data 2 50500k 0.01 416G 50501
testpool 5 0 0 416G 0
cachepool 6 0 0 416G 0

尝试写入数据并且观察,到了1000左右的时候停止

rados -p testpool bench 100 write  -b 4K --no-cleanup

可以观察到cachepool的对象数目大概在1100-1200之间,一直写也会是这个数字,在停止写以后,观察cachepool的对象数目在960左右,我们设置的 target_max_objects 为1000,在超过了这个值以后,并且写停止的情况下,系统会把这个cache pool的对象控制在比target_max少50左右,现在我们修改下 cache_min_evict_age 这个参数,看下会发生些什么

我们把这个参数调整为30

ceph osd pool set cachepool cache_min_evict_age 30

设置完了以后,可以看到cache pool的对象数目在 744左右,现在再写入数据,然后等待,看下会是多少,还是756,如果按我们设置的 cache_target_full_ratio 0.8就正好是800,我们尝试再次调整大cache_min_evict_age看下情况,对象维持在960左右,根据这个测试,基本上可以看出来是如何控制缓存的数据了,下面用一张图来看下这个问题

来总结一下:

  • 如果cache pool对象到了 target_max_objects,那么会边flush,边evic,然后因为前面有客户端请求,这个时候实际是会阻塞的
  • 如果停止了写请求,系统会自动将cache pool的对象控制在比 target_max_objects 少一点点
  • 如果时间周期到了cache_min_evict_age,那么系统会自动将cache pool的对象控制在比 cache_target_full_ratio 少一点点
  • 同理如果到了cache_min_flush_age,那么会将对象往真实的存储池flush到 cache_target_dirty_ratio 少一点点

也就是ratio是给定了一个比例,然后时间到了就去将缓存控制到指定的ratio,这个地方就需要根据需要去控制缓冲池数据是留有多少的缓存余地的

使用命令清空缓冲池的数据,会将数据flush到真实存储池,然后将数据evic掉

关于缓冲池的就写这么多了,实际环境是要根据自己的使用场景去制定这些值的,从而能保证缓冲池能真正起到作用,上面的例子是基于对象的控制的,基于大小的控制是一样的,只是将对象数的设置换成了大小即可,然后尽量去放大对象的控制

rados -p cachepool cache-try-flush-evict-all

变更记录

Why Who When
创建 武汉-运维-磨渣 2016-11-07
完成缓冲池相关 武汉-运维-磨渣 2016-11-08

CephFS cache tier实践的更多相关文章

  1. redis实现cache系统实践(六)

    1. 介绍 rails中就自带有cache功能,不过它默认是用文件来存储数据的.我们要改为使用redis来存储.而且我们也需要把sessions也存放到redis中.关于rails实现cache功能的 ...

  2. 转-4年!我对OpenStack运维架构的总结

    4年!我对OpenStack运维架构的总结 原创: 徐超 云技术之家 今天 前言 应“云技术社区”北极熊之邀,写点东西.思来想去云计算范畴实在广泛,自然就聊点最近话题异常火热,让广大云计算从业者爱之深 ...

  3. 对OpenStack运维架构的总结(转)

    这里,仅从技术角度出发,谈谈OpenStack云平台在部署.架构和运维实施等方面的感想. 缘起,在2014年大二首次接触到OpenStack,当时国内外资料远没有当前这么丰富,为安装一个OpenSta ...

  4. Ceph分层存储分析

    最近弄Ceph集群考虑要不要加入分层存储 因此花了点时间研究了下 1,首先肯定要弄清Ceph分层存储的结构 ,结构图大概就是下图所示 缓存层(A cache tier)为Ceph客户端提供更好的I/O ...

  5. php笔记07:http响应详解(禁用缓存设置和文件下载)

    演示如何通过Http响应控制页面缓存,在默认情况下,浏览器是会缓存页面的1.禁用缓存设置 (1).我在...\htdocs\http文件夹,写一个cache.php文件如下: <?php ech ...

  6. ceph之纠删码

    转自:http://m.blog.csdn.net/blog/skdkjxy/45695355 一.概述 按照误码控制的不同功能,可分为检错码.纠错码和纠删码等. 检错码仅具备识别错码功能 而无纠正错 ...

  7. Ceph源码解析:概念

    Peering:一个PG内的所有副本通过PG日志来达成数据一致的过程.(某PG如果处于Peering将不能对外提供读写服务) Recovery:根据Peering的过程中产生的.依据PG日志推算出的不 ...

  8. 浅谈Ceph纠删码

    目  录第1章 引言 1.1 文档说明 1.2 参考文档 第2章 纠删码概念和原理 2.1 概念 2.2 原理 第3章 CEPH纠删码介绍 3.1 CEPH纠删码用途 3.2 CEPH纠删码库 3.3 ...

  9. Tier和RBD Cache的区别

    相同点 缓存 数据不会持久保存在ssd或者内存:预读回写直写 都需要解决缓存数据和磁盘数据不一致和“内存页”置换的问题. 差异点 缓存的位置不同,tier是rados层在osd端进行数据缓存,也就是说 ...

随机推荐

  1. Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts.

    如果出现这个问题,说明你的github缺少公钥 使用 ssh -T git@gtihub.com 去测试 1.生成密钥 ssh-keygen -t rsa -C "your name&quo ...

  2. selenium-绕过登录

    第一种方式:chrome-debug 1.现在终端输入一下命令,启动Chrome-debug模式 #windows a.首先将chrome的环境添加到PATH中 b.进入cmd 命令栏,输入:chro ...

  3. spring-boot-route(十九)spring-boot-admin监控服务

    SpringBootAdmin不是Spring官方提供的模块,它包含了Client和Server两部分.server部分提供了用户管理界面,client即为被监控的服务.client需要注册到serv ...

  4. Helium文档6-WebUI自动化-S用于通过id\name\classname\xpth定位元素

    前言 S方法可以灵活定位元素特别注意,比如to_left_of参数的使用是查找在某个元素左侧的元素,但是默认只会找第一个S方法可以灵活运用,特别是没有id,没有name,只有classname的情况, ...

  5. Java基础系列-Lambda

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755338.html 一.概述 JDK1.8引入了函数式编程,重点包括函数式接口.lambda表达式 ...

  6. C++ 智能指针(一)

    内存安全 在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象来进行初始化:delete,接收一个动态对象的指针,销毁该 ...

  7. 3号随笔,搭建web环境

    创建数据库可能会遇到的问题 数据库语法错误: 如果写错了就会报错. 搭建web项目,我采用了MVC结构搭建 模型层写数据包装,controller层写业务代码,service写数据库内容,创建之后就搭 ...

  8. windows.h和WinSock2.h出现重定义API

    有两种常用的解决方法:1.把WinSock2.h写在windows.h之前   2.使用宏定义#define WIN32_LEAN_AND_MEAN

  9. python机器学习之支持向量机SVM

    支持向量机SVM(Support Vector Machine) 关注公众号"轻松学编程"了解更多. [关键词]支持向量,最大几何间隔,拉格朗日乘子法 一.支持向量机的原理 Sup ...

  10. python实现有趣的数学逻辑程序

    1.无重复数字的三位数 题目:有1.2.3.4个数字, 能组成多少个互不相同且无重复数字的三位数? 都是多少? for i in range(1,5): for j in range(1,5): fo ...