在前面一篇文章中,我们看到,当使用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,从object说起

影响性能的关键部分-ceph的osd journal写的更多相关文章

  1. 检查Linux服务器性能的关键十条命令

    检查Linux服务器性能的关键十条命令 概述 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmstat 1 mpstat -P ALL ...

  2. 为什么SQL语句Where 1=1 and在SQL Server中不影响性能

        最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能.最后结论是不影响.     虽然结论正确,但对问题的认识却远远没有解决问题的根本.实际上在T-SQL语句的书写过 ...

  3. 理解 OpenStack Swift (3):监控和一些影响性能的因素 [Monitoring and Performance]

    本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...

  4. ceph增加osd流程

    假如需要新增一个主机名:osd4 ip:192.168.0.110的OSD1.在osd4创建挂载目录及放置配置文件的目录 ssh 192.168.0.110 (这里是从mon主机ssh到osd4主机) ...

  5. Java EE (11) - 影响性能的因素

    垂直层(Tier)影响性能的因素 资源层数据库性能通常考虑以下方面的优化(MySQL为例):--使用哪种存储引擎:MyISAM vs. InnoDB, MERGE, MEMORY, Federated ...

  6. 操作dom影响性能的原因

    为什么dom操作会影响性能? 在浏览器当中,dom的实现和ECMAScript的实现是分离的. 例如,在IE中,ECMAScrit的实现在jscript.dll中,而DOM的实现在mshtml.dll ...

  7. ceph存储osd启动异常处理和正常启停操作

    机器角色:cloudstack虚拟机的宿主机:ceph存储机器. 事件:ceph存储的物理机器由于内存异常,需要停机更换,仅仅是把该物理机上面的虚拟机迁移走,同时启动了停机维护,然后就直接关机.结果造 ...

  8. Java 中的 try catch 影响性能吗?

    前几天在 code review 时发现有一段代码中存在滥用try catch的现象.其实这种行为我们也许都经历过,刚参加工作想尽量避免出现崩溃问题,因此在很多地方都想着 try catch一下. 但 ...

  9. ceph之osd

    一.删除osd ceph osd out 1ceph osd down 1systemctl stop ceph-osd@1ceph osd crush remove osd.1ceph osd rm ...

随机推荐

  1. linux命令:目录结构

      可分享的(shareable) 不可分享的(unshareable) 不变的(static) /usr (软件放置处) /etc (配置文件) /opt (第三方协力软件) /boot (开机与核 ...

  2. H3C汇聚层交换机认证在线人数展示系统之CheckList和燃尽图(16/04/06-16/04/13)

    一.CheckList(核查表) 序号 事件 计划完成时间 实际完成时间 未延迟 未完成 完成 1 登录口令加密以及解密 16/04/06   16/04/06 Y     2 表的创建和IP以及口令 ...

  3. PHP 爬取网页中表格数据

    public function spider_j($page) { $url="http://aaa/bbb".$page."_0/"; $fcontents= ...

  4. REDIS 字典数据结构

    对于REDIS来讲  其实就是一个字典结构,key ---->value  就是一个典型的字典结构 [当然  对于vaule来讲的话,有不同的内存组织结构 这是后话] 试想一个这样的存储场景: ...

  5. python 使用总结

    本人原来是编写java的,后来转到编写ios之后,最后又来编写python了.相对于其他的一些开发人员来说,我精通的语言还是比较杂的. 这里将几个语言进行类比,比较一些个人的看法的东西. 首先obje ...

  6. Tomcat调试笔记

    调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...

  7. git 版本控制

    用gitbash进入类似命令行的窗口 用命令 cd e:/learngit 进入该目录,然后在此目录下初始化$ git init, 于是该文件夹就成为了一个工作区,里面的.git文件就是版本库(rep ...

  8. 转:StrictMode使用

    最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写的应用,并且提供了 ...

  9. websphere性能调优之dump命令

    websphere性能调优之dump命令 基于WebSphere 构建的企业应用,时常会出现性能问题,在严重的情况下还会提示出内存溢出,这是一件很让人恼怒的事情.在WebSphere Applicat ...

  10. 什么是html技术

    HTML(Hyper Text Mark-up Language )即超文本标记语言,是 WWW 的描述语言,由 Tim Berners-lee提出.设计 HTML 语言的目的是为了能把存放在一台电脑 ...