使用file layouts来提升cephfs的读性能

前言

这里想介绍下,如何使用cephfs的FILE LAYOUTS功能来提升cephfs的读性能。

我们都知道ceph客户端在读数据的时候,ceph客户端通过crush算法算出自己所需的数据在哪个osd上,然后直接和这个osd通讯来获取数据。我们就利用这个很cool特性再结合cephfs的FILE LAYOUTS功能来提升集群的读性能。

总体思路就是让每个内核客户端(以下简称KC)的主本数据放在自己所在节点的osd上,这样读的时候就直接和本机上的osd通信读取数据,就不用跑到其他节点上去读取数据,从而避免在和其他节点通讯时的网络消耗。

注意FILE LAYOUTS这种方式有几个限制:

  • KC需要挂载到集群的节点上
  • 不能在多个KC上同时对同一个目录配置不同的FILE LAYOUTS(如果要实现需要自己改代码)

好了,下面就开始动手操作了。

环境介绍

下面把实验环境的操作系统版本及其内核版本、ceph的版本、以及搭建的ceph测试集群环境给出来,以供参考。如果你的环境和我下面给出的环境不一致也没关系。只要对比你环境在配置之前和配置之后的性能数据就可以了。

操作系统版本

[root@ceph01 ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 

操作系统内核版本

[root@ceph01 ~]# uname -a
Linux ceph01 4.17.3-1.el7.elrepo.x86_64 #1 SMP Tue Jun 26 10:14:25 EDT 2018 x86_64 x86_64 x86_64 GNU/Linux

ceph版本

[root@ceph01 ~]# ceph -v
ceph version 10.2.10 (5dc1e4c05cb68dbf62ae6fce3f0700e4654fdbbe)

测试集群初始环境

我们用ceph01、ceph02这两个节点(虚拟机)快速搭建一个单mon,单mds和4个osd的测试集群,用作下面的测试。

集群整体情况如下:

[root@ceph01 ~]# ceph -s
    cluster caf6dbda-86e7-4c4c-b8f7-a9a12d0a39b0
     health HEALTH_OK
     monmap e5: 1 mons at {ceph01=192.168.10.20:6789/0}
            election epoch 24, quorum 0 ceph01
      fsmap e69: 1/1/1 up {0=ceph01=up:active}
     osdmap e438: 4 osds: 4 up, 4 in
            flags sortbitwise,require_jewel_osds
      pgmap v167598: 256 pgs, 3 pools, 3618 MB data, 916 objects
            7529 MB used, 84563 MB / 92093 MB avail
                 256 active+clean

[root@ceph01 ~]# ceph osd tree
ID WEIGHT  TYPE NAME        UP/DOWN REWEIGHT PRIMARY-AFFINITY 
-1 0.05799 root default                                       
-2 0.02899     host ceph01                                    
 0 0.01500         osd.0         up  1.00000          1.00000 
 1 0.01500         osd.1         up  1.00000          1.00000 
-3 0.02899     host ceph02                                    
 2 0.01500         osd.2         up  1.00000          1.00000 
 3 0.01500         osd.3         up  1.00000          1.00000   

创建metadata和data池,然后创建名称叫做cephfs的ceph文件系统

[root@ceph01 ~]# ceph fs ls
name: cephfs, metadata pool: metadata, data pools: [data ]

然后在ceph01挂载cephfs的内核客户端,然后在集群目录里面创建一个testdir测试目录

[root@ceph01 ~]# mkdir /mycephfs
[root@ceph01 ~]# mount -t ceph 192.168.10.20:/ /mycephfs/
[root@ceph01 ~]# mkdir /mycephfs/testdir/

ok,初始的环境我们准备好了,下面开始配置。

获取基准性能数据

因为我们要看配置FILE LAYOUTS之前和配置FILE LAYOUTS之后的效果,所以在配置之前,需要先获取当前环境的性能,你根据你的实际情况来获取,你可能是通过CIFS、NFS或其他方式将cephfs给到客户端的,比如如果是CIFS,那就是在CIFS客户端用IO测试工具获取一组读数据,记录下来,之后配置好FILE LAYOUTS,再用相同的方式获取一组读数据,就可以对比了。

配置和测试过程

因为我们等下需要用到setfattr和getfattr命令,所以如果你的环境里面没有这两个命令的话,使用下面的命令安装下就好了:

[root@ceph01 ~]# yum install -y attr

配置crushmap

获取当前的crushmap如下:

# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable straw_calc_version 1

# devices
device 0 osd.0
device 1 osd.1
device 2 osd.2
device 3 osd.3

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root

# buckets
host ceph01 {
    id -2       # do not change unnecessarily
    # weight 0.029
    alg straw
    hash 0  # rjenkins1
    item osd.0 weight 0.015
    item osd.1 weight 0.015
}
host ceph02 {
    id -3       # do not change unnecessarily
    # weight 0.029
    alg straw
    hash 0  # rjenkins1
    item osd.2 weight 0.015
    item osd.3 weight 0.015
}
root default {
    id -1       # do not change unnecessarily
    # weight 0.058
    alg straw
    hash 0  # rjenkins1
    item ceph01 weight 0.029
    item ceph02 weight 0.029
}

# rules
rule replicated_ruleset {
    ruleset 0
    type replicated
    min_size 1
    max_size 10
    step take default
    step chooseleaf firstn 0 type host
    step emit
}
# end crush map

修改之后的crushmap如下:

# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable straw_calc_version 1

# devices
device 0 osd.0
device 1 osd.1
device 2 osd.2
device 3 osd.3

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root

# buckets
host ceph01 {
    id -2       # do not change unnecessarily
    # weight 0.029
    alg straw
    hash 0  # rjenkins1
    item osd.0 weight 0.015
    item osd.1 weight 0.015
}
host ceph02 {
    id -3       # do not change unnecessarily
    # weight 0.029
    alg straw
    hash 0  # rjenkins1
    item osd.2 weight 0.015
    item osd.3 weight 0.015
}
root default {
    id -1       # do not change unnecessarily
    # weight 0.058
    alg straw
    hash 0  # rjenkins1
    item ceph01 weight 0.029
    item ceph02 weight 0.029
    item ceph03 weight 0.029
}

root root_ceph01 {
    id -5       # do not change unnecessarily
    # weight 0.029
    alg straw
    hash 0  # rjenkins1
    item ceph01 weight 0.029
}
root root_ceph02 {
    id -6       # do not change unnecessarily
    # weight 0.029
    alg straw
    hash 0  # rjenkins1
    item ceph02 weight 0.029
}

# rules
rule replicated_ruleset {
    ruleset 0
    type replicated
    min_size 1
    max_size 10
    step take default
    step chooseleaf firstn 0 type host
    step emit
}
rule main_is_ceph01 {
    ruleset 1
    type replicated
    min_size 1
    max_size 10
    step take root_ceph01
    step chooseleaf firstn 1 type host
    step emit
    step take root_ceph02
    step chooseleaf firstn -1 type host
    step emit
}
# end crush map

配置存储池

创建1个池

[root@ceph01 ~]# ceph osd pool create mainisceph01 64 64
# 设置主本全部放在ceph01这个节点上
[root@ceph01 ~]# ceph osd pool set mainisceph01 crush_ruleset 1

将池加入到cephfs的数据池集合

[root@ceph01 ~]# ceph fs add_data_pool cephfs mainisceph01
[root@ceph01 ~]# ceph fs ls
name: cephfs, metadata pool: metadata, data pools: [data mainisceph01]

配置FILE LAYOUTS

在ceph01节点上执行

[root@ceph01 ~]# setfattr -n ceph.dir.layout.pool -v mainisceph01 /mycephfs/cifs

好了,这就配置好了,可以使用ceph osd map命令试试看对象的映射分布情况

[root@ceph01 ~]# for i in `seq 1 100`;do ceph osd map mainisceph01 obj$i;done
osdmap e472 pool 'mainisceph01' (17) object 'obj1' -> pg 17.6cf8deff (17.3f) -> up ([0,3], p0) acting ([0,3], p0)
osdmap e472 pool 'mainisceph01' (17) object 'obj2' -> pg 17.3f1ee208 (17.8) -> up ([0,2], p0) acting ([0,2], p0)
osdmap e472 pool 'mainisceph01' (17) object 'obj3' -> pg 17.61f68bb1 (17.31) -> up ([0,2], p0) acting ([0,2], p0)
osdmap e472 pool 'mainisceph01' (17) object 'obj4' -> pg 17.a8759770 (17.30) -> up ([0,3], p0) acting ([0,3], p0)
osdmap e472 pool 'mainisceph01' (17) object 'obj5' -> pg 17.666934a3 (17.23) -> up ([0,2], p0) acting ([0,2], p0)
···

可以看到对象主本都是在osd.0上,osd.0是在ceph01上,这样读取数据的时候就不用去其他节点读取数据了,也就减少了数据在网络中的传输时间,从而提升读性能。

总结

最后我们把主要步骤整理下:

  1. 修改crushmap,控制池里面对象的主副本分布;
  2. 创建存储池并设置对应的rule;
  3. 将存储池加入到cephfs的data池集合;
  4. KC上面对需要配置FILE LAYOUTS的目录设置对应的pool;

前面也提到了,这种配置方式有一些限制,比如不能在多个KC上同时对同一个目录配置不同的pool(如果要实现需要自己改代码)。这里只是提供一种思路。实际测试读性能大概会提升40%左右。y

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容