Ceph读写性能估算方法

news2024/11/22 22:16:22

发布于 2018-08-13 12:42

阅读原文:http://www.cccttt.me/blog/2018/04/10/ceph-performance-estimate

1、前言

        最近在做Ceph性能测试相关工作,在测试初期由于没有得到理想的测试结果,因此对Ceph集群进行了优化,但是一直有个问题萦绕在我的脑海:基于当前硬件配置,这个Ceph集群的极限是多少?

        由于这个问题和Ceph的配置息息相关,为了简化问题,在本文中我们只会会讨论3个变量:冗余策略(纠删码、多副本),读/写,ObjectStore。我们将会基于磁盘、网络、CPU性能来估算出一个集群的性能,除此以外的参数影响均归并到损耗系数μ这个变量。本文会分别解释写性能公式推演、读性能公式推演,并且在每个推演中加入冗余策略和ObjectStore的讨论。

2、ObjectStore简介

        Ceph目前提供了三种存储后端:

  • FileStore

  • KStore

  • BlueStore

        而KStore由于接纳程度不高,目前很少有厂商使用,因此在本文中只介绍和对比FileStore和BlueStore。

2.1 FileStore

        在FileStore中,每个Ceph对象都被保存在本地文件系统中(XFS, ZFS等)。Ceph为了保证一致性,要求读写操作都是atomic的,因此会需要在Ceph内部做一次Journal,也就是说,每次客户端数据写入时,首先会采用Append-only的模式将数据写入到Journal中去,随后再执行真正的数据写入操作。然而在本地文件系统又会做一次Journal,因此就会产生Journaling of journal问题,也就是记录了2次Journal。为了提高写入性能,一般在部署Ceph集群时,会将单独划分SSD给Ceph journal。

图片

2.2 BlueStore

        为了提高Ceph的写入性能,社区开发了BlueStore这一存储后端,让数据绕开了本地文件系统直接裸盘,从而解决了Journaling of journal问题。BlueStore采用RocksDB来管理对象元数据,因此为了跑RocksDB,BlueStore内部有一个微型用户态的文件系统-BlueFS。得益于RocksDB,Ceph可以很方便的获取和枚举所有的对象。

图片

3. 读性能公式推演

        读性能公式目前推测较为简单,无论在FileStore还是BlueStore下,均推断为 Wnμ

W: 单块裸盘读带宽

n: OSD数量

μ:损耗系数 一般为0.7~0.8

        下面注重来介绍一下写性能公式推演:我们会逐一探讨:

  • FileStore + 多副本 写性能公式推演

  • BlueStore + 多副本 写性能公式推演

  • FileStore + 纠删码 写性能公式推演

  • BlueStore + 纠删码 写性能公式推演

4、写性能公式推演

4.1 FileStore + 多副本

        在当前情况下,我们假设Ceph集群的ObjectStore是FileStore, 并且对应的Pool的冗余策略为多副本,SSD作为一个OSD,其journal和data都放在这块SSD上。因此我们一次写入的流程可以简化成下图:数据先写到Ceph的journal上,然后再写入data中,并且在本地文件系统会再做一次journal,由于journaling of journal问题,单个OSD的WAF(写放大系数)为2。在当前冗余策略下,一个文件写入需要产生多个副本N,因此集群放大系数为2*N。

图片

        然而在写入对象时,我们写入的不单单是数据本身,在Ceph RBD的journal中,RBD写操作是变成transaction操作,transaction会包含一些元数据用于描述transaction,这些元数据也写到journal上,这就也会导致写放大。因此一次写入的WAF不仅仅需要考虑多副本、journaling of journal问题,还需要考虑transaction元数据。

图片

        韩国成均馆大学曾经对Ceph存储后端对写入放大系数的影响做过一定的研究,在其发表的《Understanding Write Behaviors of Storage Backends in Ceph Object Store》论文中,测试了在3副本+FileStore情况下,用Ceph RBD写入不同数据块与WAF的关系。从Figure 5我们可以看到,当数据写入量较大时,WAF逐渐收敛于6,符合我们上文WAF=2*N的推理;但是当写入对象很小时,WAF则会很大。

        这是因为当数据量很小时,同时完成的transaction元数据量所占比重会很大,根据上图数据,我推测每次写入所产生的transaction元数据大概在5KiB左右,因此可以推断,在包含transaction元数据的情况下,WAF为:

WAF=[(X+5)*2*N]/X

  • X为写入数据块大小(KiB)

  • N为副本数

        随着数据块增大,在FileStore、多副本冗余策略下WAF最终将向2N收敛。假设我们知道了一块SSD的写性能可以达到W MB/s的带宽,那么在理想情况下,我们可以很容易推断出,一个大小为n的SSD集群的写带宽能达到 W*N图片 MB/s。

图片

        如果考虑外部因素多带来的损耗为μ,我们最终可以推断出BlueStore+多副本情况下,写性能可以达到:

BW=[(W*n)/WAF]*µ

WAF=[(X+5)*2*N]/X

  • WAF为写放大系数

  • X为写入数据块大小(KiB)

  • N为副本数

  • n为OSD数量

  • μ为损耗系数 一般为0.7~0.8

4.2 BlueStore + 多副本

        在当前情况下,我们假设Ceph集群的ObjectStore是BlueStore, 并且对应的Pool的冗余策略为多副本,SSD作为一个OSD,划分为2块分区,一个分区作为裸盘来写入数据,另一块做BlueFS用来跑RocksDB。因此我们一次写入的流程可以简化成下图:数据会被直接写入到data分区(裸盘)中,而对象元数据会被写到RocksDB和RocksDB的WAL中,随后RocksDB将数据压缩后存放到磁盘中。我们不再需要在文件系统层做journal,而WAL只在覆写操作时才会用到,因此在副本数量为N的条件下,我们可以推测WAF将收敛于N。

图片

        值得注意的一点,在BlueStore中,磁盘分区会以‘bluestore_min_alloc_size’的大小分配管理,这个数值默认为64KiB。也就是说,如果我们写入<64KiB的数据,剩余的空间会被0填充,也即是Zero-filled data,然后写入磁盘,也正是这样,BlueStore的小文件随机写性能并不好。

        这里同样引用《Understanding Write Behaviors of Storage Backends in Ceph Object Store》论文中针对BlueStore在三副本策略下,不同数据块写入时WAF的变化图:

图片

        可以看到,当写入数据块很小时,WAF的数值很大。灰色曲线正是做了前文所说的‘小文件随机写’,因此性能较差;覆写操作时,由于Ceph为了保证一致性,会将数据先写入到RocksDB WAL中去,然后再由RocksDB WAL将数据落到磁盘上去,因此覆盖性能也会稍差一些。随着数据块的增大,所有曲线最终收敛于3,符合我们前文中推断的 WAF=N 。

        综上所述,在多副本策略下,BlueStore的WAF的推演公式需要考虑:数据块大小,RocksDB压缩数据大小, Zero-filled数据大小以及副本数量。当随机写入小数据块的时候,会产生较多的Zero-filled数据,同时RocksDB压缩数据大小所占比重也会较大;当顺序写入大数据时,Zero-filled数据则基本为0,并且RocksDB压缩数据所占比重也可以忽略不计,因此公式整理如下:

图片

        这里的推算主观性较强,当写入数据量小的时候( X < 16KiB(HDD)|64KiB(SSD) ),估算ceph会产生的zero-filled数据15kib和rocksdb压缩后存入磁盘的数据量5kib,共计20kib;而当写入数据量大时( X >= 16KiB(HDD)|64KiB(SSD) ),Zero-filled数据几乎为0,剩余RocksDB压缩后存入磁盘的数据量的5KiB。

        如果考虑外部因素多带来的损耗为μ,我们最终可以推断出BlueStore+多副本情况下,写性能可以达到:

图片

  • WAF为写放大系数

  • X为写入数据块大小(KiB)

  • N为副本数

  • n为OSD数量

  • μ为损耗系数 一般为0.7~0.8

4.3 FileStore + 纠删码

相比较多副本冗余策略,纠删码的出现大大节省了磁盘空间,以下图举例,如果我们有5个OSD,并且按照K=3, M=2配置纠删码冗余策略,当有一组数据写入时(ABCDEFGHI),该数据会被分成3份分别写入3个OSD中,同时Ceph也会生成2个编码块写入到另外2个OSD中,写就是说,一次写入操作,实际上会产生(K+M)/K倍的实际写入量。而由于这里使用的存储后端是FileStore,journaling of journal问题会让写放大两倍,因此结合纠删码本身特性,WAF最终会收敛于:

(K+M)/K*2

图片

由FileStore+多副本的公式推演可知,在FileStore写入时,同时还需要考虑transaction元数据,每个对象大概是5KiB左右,因此在FileStore+纠删码策略下,集群可以达到的写性能为:

BW = [[(W*n)/WAF]*µ

WAF=[(X+5)*2*(K+M)/K]/X

  • WAF为写放大系数

  • X为写入数据块大小(KiB)

  • N为副本数

  • n为OSD数量

  • μ为损耗系数 一般为0.7~0.8

  • K为数据块的个数

  • M为校验块的个数

4.4 BlueStore + 纠删码公式

        有了前文的铺垫后,相信到这一步大家能够自己推演出BlueStore在纠删码策略下的写入性能推导公式。由于解决了journaling of journal问题,每次写入不再需要通过文件系统,因此在WAF最终将会收敛于:

(K+M)/M

图片

        结合BlueStore+3副本的写入性能公式推导,我们可以大致推断出,BlueStore+纠删码的写入性能公式:

图片

  • WAF为写放大系数

  • X为写入数据块大小(KiB)

  • N为副本数

  • n为OSD数量

  • μ为损耗系数 一般为0.7~0.8

  • K为数据块的个数

  • M为校验块的个数

5、Ceph写入性能公式总结

结合上文4个小节,我们最终得到了Ceph冗余策略和ObjectStore为变量的WAF推导公式:

图片

        Ceph集群写入性能可以大致推导为:

BW = [(W*n)/WAF]*µ

  • W: 单块裸盘写入带宽

  • n: OSD数量

  • WAF:写放大系数

  • μ:损耗系数

  • X: 写入数据块大小(KiB)

  • N: 多副本Size大小

  • K: 纠删码K值

  • M:纠删码M值

  • FileStore 5: 5KiB, FileStore中transaction元数据的数据量大小(推测值)

  • BlueStore 5: 5KiB, BlueStore中RocksDB的WAL数据大小(推测值)

  • BlueStore 20: 20KiB, BlueStore小文件写入时产生的Zero-filled数据块大小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker搭建opengrok环境

引言&#xff1a; 由于这几天开始 http://aospxref.com/ 网站没法用了。用习惯了opengrok的方式看AOSP的源码&#xff0c;其他的在线查看源码的网站用起来都不是很理想。所以考虑搭建一个环境。 首先网上看了下opengrok的环境搭建的方式&#xff0c;最终还是采用docker的方…

7-4 求整数均值

本题要求编写程序&#xff0c;计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出4个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中按照格式“Sum 和; Average 平均值”顺序输出和与平均值&#xff0c;其中平均值精确到小…

2023年国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

CTFshow 限时活动 红包挑战7、红包挑战8

CTFshow红包挑战7 写不出来一点&#xff0c;还是等了官方wp之后才复现。 直接给了源码 <?php highlight_file(__FILE__); error_reporting(2);extract($_GET); ini_set($name,$value);system("ls ".filter($_GET[1])."" );function filter($cmd){$cmd…

华为云MetaStudio多模态数字人进展及挑战介绍

// 编者按&#xff1a;数字人作为AI能力集大成者&#xff0c;涉及计算机视觉、计算机图形学、语音处理、自然语言处理等技术&#xff0c;正在金融、政务、传媒、电商等领域应用越来越广。LiveVideoStackCon 2023 上海站邀请到华为云的李明磊为我们介绍华为云在数字人领域当前…

QLExpress动态脚本引擎解析工具

介绍 QLExpress脚本引擎 1、线程安全&#xff0c;引擎运算过程中的产生的临时变量都是threadlocal类型。 2、高效执行&#xff0c;比较耗时的脚本编译过程可以缓存在本地机器&#xff0c;运行时的临时变量创建采用了缓冲池的技术&#xff0c;和groovy性能相当。 3、弱类型脚本…

二十二、责任链模式

目录 1、使用demo演示责任链模式2、传统方案解决oa系统审批3、传统方案解决oa系统审批存在的问题4、职责链模式基本介绍5、职责链模式原理类图6、职责链模式解决oa系统采购审批7、职责链模式的注意事项和细节8、职责链模式的实际使用场景举例 1、使用demo演示责任链模式 学校o…

讯飞星火认知大模型升级体验

今天讯飞星火新版本已更新至现网&#xff0c;增加了多模态、插件等很多功能~,阅读原文可以申请体验 官网地址&#xff1a;https://xinghuo.xfyun.cn/ 多模态能力 多模理解&#xff08;图片&#xff09;&#xff1a;支持用户图片输入&#xff0c;针对图片内容进行视觉问答。 …

Thread.sleep()不释放锁 Object.wait()释放锁

sleep()方法 sleep()方法是线程类&#xff08;Thread&#xff09;的静态方法&#xff0c;让调用的线程进入指定时间睡眠状态&#xff0c;使得当前线程进入阻塞状态。 当线程获取锁时&#xff0c;sleep()方法不会释放对象锁 wait()方法 wait()方法是Object类里的方法&#xff0c…

12个有趣的css库

12个有趣的css库 1. Animate Animate 是一个即用型跨浏览器动画库&#xff0c;可在我们的 Web 项目中使用。非常适合强调、主页、滑块和注意力引导提示。 2. Magic Magic里包含了一组简单的动画&#xff0c;可以在我们的Web或app项目中使用。 3. Animista Animista 是一个 …

【Linux系统编程】23.孤儿进程、僵尸进程、wait、waitpid

目录 孤儿进程 测试代码1 测试结果 僵尸进程 测试代码2 测试结果 wait 参数*wstatus 返回值 测试代码3 测试结果 测试代码4 测试结果 测试代码5 测试结果 waitpid 参数pid 参数*wstatus 参数options 返回值 测试代码6 测试结果 测试代码7 测试结果 测…

Zemax2019中文设置

做软件教程啥时候都不能少了切换中文版啊~ 正常打开软件&#xff1a; 点击setup 中的preference 弹出窗口&#xff1a; 选择general 在language的下拉窗口中选择&#xff0c;中文 效果&#xff1a;

实验篇——亚细胞定位

实验篇——亚细胞定位 文章目录 前言一、亚细胞定位的在线网站1. UniProt2. WoLFPSORT3. BUSCA4. TargetP-2.0 二、代码实现1. 基于UniProt&#xff08;不会&#xff09;2. 基于WoLFPSORT后续&#xff08;已完善&#xff0c;有关代码放置于[python爬虫学习&#xff08;一&#…

[保研/考研机试] 杨辉三角形 西北工业大学复试上机题 C++实现

题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 输入n值&#xff0c;使用递归函数&#xff0c;求杨辉三角形中各个位置上的值。 输入描述: 一个大于等于2的整型数n 输出描述: 题目可能有多组不同的测试数据&#xff0c;对于每组输入数据&#xff0c; 按题目的要求输…

Java笔记-kafka

修改kafka的server.properties配置 概念 单播 一个消费组的消费者们只有一个能消费到消息。类似queue队列。 多播 不同的消费组的消费者能重复消费到消息&#xff0c;类似publish-subscribe模式 消费组偏移 kafka和别的消息中间件不一样&#xff0c;不同组可以重复消费&a…

Grafana监控 Redis Cluster

Grafana监控 Redis Cluster 主要是使用grafana来实现监控&#xff0c;grafana可以对接多种数据源&#xff0c;在官网中可以找到Redis数据源&#xff0c;需要安装redis data source插件。当然也可以利用Prometheus来做数据源&#xff0c;下面分别记录一下这两种数据源的安装配置…

前后端分离------后端创建笔记(04)前后端对接

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

“MongoDB基础知识【超详细】

"探索MongoDB的无边之境&#xff1a;沉浸式数据库之旅" 欢迎来到MongoDB的精彩世界&#xff01;在这个博客中&#xff0c;我们将带您进入一个充满创新和无限潜力的数据库领域。无论您是开发者、数据工程师还是技术爱好者&#xff0c;MongoDB都将为您带来一场令人心动…

网络安全威胁与防御策略

第一章&#xff1a;引言 随着数字化时代的快速发展&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;网络的广泛应用也引发了一系列严峻的网络安全威胁。恶意软件、网络攻击、数据泄露等问题层出不穷&#xff0c;给个人和企业带来了巨大的风险。本文…

UI美工设计岗位的基本职责概述(合集)

UI美工设计岗位的基本职责概述1 1、有良好的美术功底、设计新颖&#xff0c;整体配色及设计创意理念&#xff0c;能够独立完成整个网站页面设计及制作; 2、熟练运用DIV CSS&#xff0c;HTML 设计制作网页 ; 3、熟练运用Photoshop,Dreamweaver,Coreldraw(或Illustrator),Fla…