影响性能的关键部分-ceph的osd journal写
在前面一篇文章中,我们看到,当使用filestore时,osd会把磁盘分成data和journal两部分。这主要是为了支持object的transaction操作。我的想法是,ceph需要具有数据保护功能,从client端写入的数据(以返回I/O Completion为标志)不能丢失。对于object为什么要使用journal,ceph官方也给出了解释:
速度:有了journal分区后,写数据速度更快。这主要是因为journal的写都是顺序写。
一致性:ceph要求I/O操作是原子性的,比如更新PG的元数据。
当然,有些人对此提出异议,因为以这种journal方式保持数据一致性的做法ext4也能干,为什么还要自己单独整一个?正好这个问题opennebula有一个讨论,正方的理由是ceph需要自己管理transaction,依赖文件系统没有办法独立自主,而且文件系统层面无法把ceph的数据和其元数据关联起来。
回到正题,我们先来看看一个I/O写是如何处理的,引用ceph.com一篇文章的说法(具体网址在参考资料处):

大致的过程是先写primary osd的journal部分,使用libaio的DIO,然后使用writev向filesystem发起buffer-io。每隔一段时间fsync把buffer-io落盘。整个过程跟文件系统的journal处理方式类似。Replicated部分也是按照这个流程走。下面这个图更直观地描述了osd对I/O的处理。

不过上面并没有指出osd什么时候返回I/O Completion,根据代码分析,osd会在写完journal后完成本次的I/O操作(Replicated 部分也一样)。最后的落盘会有其他的线程来处理。
下面用一个例子来描述journal写的部分细节。
我们操作的osd所在的盘被按照如下方式配置

在client进行写操作时,可以看到这个osd上有3个线程在进行I/O,其中有两个是实际的落盘操作,1个是journal写。

进一步通过blktrace看看这个journal写,如果下发10个随机写I/O(4KB),则对应的有10个journal写。这10个写都是16个sector,即8KB。那么可以推断,多出来的4KB是journal的元数据。并且,这10个I/O都是按照LBA顺序写入。

通过对journal线程的分析,可以发现写请求都是通过io_submit发出的,说明使用的是AIO,并且类型是pwritev。

这在ceph的配置文件中也能看到:

从代码看,ceph直接使用libaio提供的API函数io_submit。

对比osd端和client端的I/O操作
client端在0.0135s处就完成了所有的写操作,而physical端这时候只完成了所有的journal操作,那么可以推断,写操作只是当journal完成后就立即返回给client:原因是physical端journal写之外的操作在0.56s才开始,这已经跟第一个写完成相隔50多ms。

从代码上看,当osd收到写请求后,会先进行journal transaction然后将实际的I/O queue起来。

不同的client i/o blocksize产生的日志写

blocksize为16KB 时=> 16KB+4KB
blocksize为32KB时=> 32KB+4KB
blocksize为64KB时=> 4KB+64KB+4KB
blocksize为128KB时=> 4KB+128KB+4KB
可以推断当bs<=32KB时,4KB日志与data放在一起,而当大于这个值后,变成2*4KB日志,并且与用户数据置于不同的vector。
从测试的数据可以看出,引入journal后,一次写:I/O至少为ReplicatedNum*2,数据量大于ReplicatedNum*2*(Blocksize+JournalMetaData)。当blocksize越大时,Overhead越小,那么可以通过在client端合并数据(比如使能rbd的cache功能)来减小overhead。
以SSD作为osd journal提升Ceph写性能
由于写入journal后I/O会立即返回,所以提高性能最简单的方法就是把journal放到SSD上。关于osd journal使用SSD的性能数据可以参考redhat和seagate的测试数据(具体来源见参考资料3)。
加入SSD后的4MB随机写带宽性能(一个DC S3700搭配4个osd),每节点大概提升2倍。

加入SSD后的4KB随机写IOPS性能(一个DC S3700搭配4个osd),每节点大概提升1.5到3倍。

总结
本文主要介绍了ceph的journal写,并通过实例说明journal带来的overhead;journal部分是用户优化的一个重点,可以将高性能的SSD作为journal的存储。不过,filestore并不是唯一选择,代表未来发展方向的Bluestore使用全新的设计能够更大地发挥SSD的性能,已经受到越来越多的关注。
说明
本文最先发布于公众号《存储技术最前线》 ,欢迎关注获取最新技术资讯!
参考资料
1,http://docs.ceph.com/docs/master/rados/configuration/journal-ref/
2,http://lists.opennebula.org/pipermail/ceph-users-ceph.com/2015-October/005479.html
3,https://www.redhat.com/en/files/resources/en-rhst-ceph-seagate-partner-tech-detail-INC0231356.pdf
相关阅读

影响性能的关键部分-ceph的osd journal写的更多相关文章
- 检查Linux服务器性能的关键十条命令
检查Linux服务器性能的关键十条命令 概述 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmstat 1 mpstat -P ALL ...
- 为什么SQL语句Where 1=1 and在SQL Server中不影响性能
最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能.最后结论是不影响. 虽然结论正确,但对问题的认识却远远没有解决问题的根本.实际上在T-SQL语句的书写过 ...
- 理解 OpenStack Swift (3):监控和一些影响性能的因素 [Monitoring and Performance]
本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...
- ceph增加osd流程
假如需要新增一个主机名:osd4 ip:192.168.0.110的OSD1.在osd4创建挂载目录及放置配置文件的目录 ssh 192.168.0.110 (这里是从mon主机ssh到osd4主机) ...
- Java EE (11) - 影响性能的因素
垂直层(Tier)影响性能的因素 资源层数据库性能通常考虑以下方面的优化(MySQL为例):--使用哪种存储引擎:MyISAM vs. InnoDB, MERGE, MEMORY, Federated ...
- 操作dom影响性能的原因
为什么dom操作会影响性能? 在浏览器当中,dom的实现和ECMAScript的实现是分离的. 例如,在IE中,ECMAScrit的实现在jscript.dll中,而DOM的实现在mshtml.dll ...
- ceph存储osd启动异常处理和正常启停操作
机器角色:cloudstack虚拟机的宿主机:ceph存储机器. 事件:ceph存储的物理机器由于内存异常,需要停机更换,仅仅是把该物理机上面的虚拟机迁移走,同时启动了停机维护,然后就直接关机.结果造 ...
- Java 中的 try catch 影响性能吗?
前几天在 code review 时发现有一段代码中存在滥用try catch的现象.其实这种行为我们也许都经历过,刚参加工作想尽量避免出现崩溃问题,因此在很多地方都想着 try catch一下. 但 ...
- ceph之osd
一.删除osd ceph osd out 1ceph osd down 1systemctl stop ceph-osd@1ceph osd crush remove osd.1ceph osd rm ...
随机推荐
- BZOJ 1597 土地购买
斜率优化... #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...
- system_call中断处理过程分析
本文所有的分析内容都是基于Linux3.18.6内核,鉴于对应不同内核版本,系统调用的实现不相同.若需要分析其他版本内核的系统调用的实现过程,请谨慎参考. system_call函数的功能是用来响应外 ...
- 黑马----JAVA字符串
黑马程序员:Java培训.Android培训.iOS培训..Net培训 Stirng.StringBuffer和StringBuilder都实现了字符序列接口CharSequence,都是final类 ...
- Xcode6 storyboard new push segue 后的视图控制器没有navigation item bug.
手动切一下 老的push,再切回来,就会出有了,我想是一个bug. Xcode 6 Segue with UINavigationItem up vote0down votefavorite I' ...
- MSSQL—行转列
行转列,是SQL中经常会遇到的一个问题,并且分为静态转换和动态转换,所谓静态转换即在转换的行数已知或固定:动态转换则为转换的行数不固定. 转换的方法一般采用case when语句或pivot(MSSQ ...
- MSP430 IO 使用
MSP430内部上拉下拉使用注意——IO口测高低电平 MSP430单片机IO口用来检测高低电平时,是不需要外部上拉下拉的,因为其内部有上拉和下拉.在用作高低电平检测时,需要开启上拉或下拉. ...
- python 字符串技巧 from python cookbook
所有数据进入程序中都只是一串字节 英文字符占一个字节 汉语是两个字节 一字节byte=8bit Unicode字符串为每种语言的每种字符设定了统一并且唯一的二进制编码 big = r'This is ...
- “添加到收藏夹”功能(share)
以下分享自: 如何给网站增加“添加到收藏夹” 给网站添加“添加到收藏夹”理论上应该是很简单的事情,但是受到各种浏览器和操作系统的不一致的问题,使得这个问题异常的繁琐啊. 下面是梳理的一些资料,仅供参考 ...
- iOS 动态下载系统提供的中文字体
使用系统提供的中文字体,既可避免版权问题,又可以减小应用体积 #pragma mark - 判断字体是否已经被下载 - (BOOL)isFontDownLoaded:(NSString *)fontN ...
- IOS 二维码的实现
1.首先导入Coreimage框架. //创建滤镜对象 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator&quo ...