影响性能的关键部分-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 ...
随机推荐
- Luogu 3396 权值分块
官方题解:这是一道论文题.集训队论文<根号算法——不只是分块>. 首先,题目要我们求的东西,就是下面的代码: for(i=k;i<=n;i+=p) ans+=value[i]; 即: ...
- [转] 添加新的系统调用 _syscall0(int, mysyscall)
实验目的阅读 Linux 内核源代码,通过添加一个简单的系统调用实验,进一步理解Linux操作系统处理系统调用的统一流程.通过用kernel module的方法来实现一个系统调用实验,进一步理解Lin ...
- 【Python】实现简单循环
# -*- coding:utf-8 -*- #猜数字游戏 lucky_num = 6 count = 0 while count < 3: input_num = int(raw_input( ...
- iOS UITableViewCell滑动删除
一般我们使用列表的形式展现数据就会用到UITableView.在熟练掌握了用UITableView展示数据以后,开发过程中可能会遇到需要删除数据的需求,我们想实现在一行数据上划动一下,然后出现一个删除 ...
- BackTrack5-r3虚拟机安装
ISOL INUX 3.63 Debian-2008-07-15 Copyright (C) 1994-2008 H. Peter Anvinboot:(按回车) 选择:BackTrack Text ...
- check_env函数解析
又是一个比较长的函数,是用来检查文件权限,目录条件的.具体代码如下: check_env() { # Check user privilege. #检查用户权限 check_user root # C ...
- 支持向量机 (SVM)分类器原理分析与基本应用
前言 支持向量机,也即SVM,号称分类算法,甚至机器学习界老大哥.其理论优美,发展相对完善,是非常受到推崇的算法. 本文将讲解的SVM基于一种最流行的实现 - 序列最小优化,也即SMO. 另外还将讲解 ...
- [翻译] LTE/LTE-Advanced for Mobile Broadband-10.4
10.4 下行L1/L2控制信令 上下行信道的数据传输,需要特定的“下行控制信令”提供支持.下行控制信令通常被称为“下行L1/L2控制信令”,这表示该控制信令部分来自物理层(L1),部分来自MAC层( ...
- web安全之sql注入报错型注入
前提: echo mysql_error(),输出错误信息. 熟悉的函数: floor()向下取整 concat()返回的字符串参数连接的结果 count()函数返回匹配指定条件的行数 rand()函 ...
- Apache2.4.6服务器安装及配置
一.系统环境 系统版本:Aliyun Linux release 5.7 内核版本:2.6.18-274.el5 apr版本:apr-1.4.8 apr-util版本:apr-util-1.5.2 p ...