在前面一篇文章中,我们看到,当使用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. css 绘制对话框三角符号

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. centos7 系统初始化脚本

    现在自己的本地虚拟机系统,直接安装的是centos7.2 mini版,安装完成发现好多东西都没有安装,所以写了一个简单的系统初始化脚本,让自己可以省一些力气,哈哈 人懒主要是. 下面贴出写的脚本,脚本 ...

  3. 【LeetCode OJ】Construct Binary Tree from Preorder and Inorder Traversal

    Problem Link: https://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-trave ...

  4. 如何在MATLAB R2010a 中使用Visual C++ 2010编译器

    安装补丁VS2012MEXSupport.zip http://www.mathworks.com/matlabcentral/answers/93013-how-can-i-use-microsof ...

  5. winform客户端利用webClient实现与Web服务端的数据传输

    由于项目需要,最近研究了下WebClient的数据传输.关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问.无外乎客户端发送请求,服务端处 ...

  6. Voreen (二) 入点出点计算

    继第一篇Voreen的文章介绍主流程以后,第二篇介绍Raycast的第一个绘制Pass,根据代理几何体绘制出入点出点.如上次所说,OptimizedProxyGeometry负责生成表示体数据的代理几 ...

  7. js中的事件部分总结

    一.HTML事件 HTML事件处理就是直接在HTML标签上添加事件,举例 <p class="" onclick=function(){alert(HTML事件)}>& ...

  8. OpenGL阴影,Shadow Volumes(附源程序,使用 VCGlib )

    实验平台:Win7,VS2010 先上结果截图:    本文是我前一篇博客:OpenGL阴影,Shadow Mapping(附源程序)的下篇,描述两个最常用的阴影技术中的第二个,Shadow Volu ...

  9. 获取select标签的值

    1.设置value为pxx的项选中 $(".selector").val("pxx"); 2.设置text为pxx的项选中 $(".selector& ...

  10. iOS 统计App 的代码总行数

    打开Terminal,cd 到项目的根目录下,输入以下命令 find . -name "*.m" -or -name "*.mm" -or -name &quo ...