RGW performance with MemStore and CacheTiering

MemStore

MemStore配置简单,应用中会占用host内存来存储objects数据,OSD在mkfs的时候会在对应目录下创建一个collections的文件,用于存放OSD对应内存中的objects数据。

参考文章:How to configure ceph use memstore?

配置

在ceph.conf里添加相应配置:

如果要所有OSD都启动MemStore,在[global]或[osd]里添加即可:

1
osd objectstore = MemStore

如果要制定某些OSD启动MemStore,在对应OSD的选项里制定即可:

1
2
3
4
[osd.0] 
host = 10.20.6.54
devs = /dev/sdb
osd objectstore = memstore

性能测试

测试环境:5个Hosts,每个host上3个OSD。

启动MemStore后,运行rest-bench测试工具,write IO性能约有所提升,但提升幅度在两次测试中不一致。

  1. 配置所有OSD启动MemStore

    1
    2
    MemStore:   		Bandwidth (MB/sec) - 211.208  
    FileStore: Bandwidth (MB/sec) - 177.186
  2. 配置部分OSD启动MemStore,余下的OSD启动FileStore

    每个Host上配置1个OSD启动MemStore,剩余2个启动FileStore

    1
    2
    MemStore:   		Bandwidth (MB/sec) - 123.848
    FileStore: Bandwidth (MB/sec) - 222.263

    MemStore OSDs较少,rest-bench压力测试的话,MemStore性能受限。

详细参考文章:RGW performance with FileStore and MemStore

问题分析

  1. MemStore何时刷数据到disk不确定?

    看代码是在OSD::umount里调用_save()函数,但是在实际测试中,stop一个OSD并没在log文件中找到对应log。

  2. MemStore会一直占用host的内存,测试中发现host的物理内存会一直减少到200多M后,swap分区开始减少,当swap分区也没的时候,客户端写会报错。

    但比较奇怪的是过阵子Host端内存被回收,这时OSD一切正常。。。不确定系统会不会直接把OSD占用的内存直接回收,导致OSD丢失数据。
    所以MemStore不适合做大数据的直接存储,可以结合Cache Tiering做缓存。

  3. 如果某个PG所在的OSD同时重启,会导致该PG数据丢失。测试中我还同时把5个Hosts上的ceph osd都重启,结果整个ceph系统数据混乱且无法恢复。

Cache Tiering

Cache Tiering是结合CRUSH map, pool, CRUSH ruleset来实现某个pool作为其他pool的cache。

详细链接: http://docs.ceph.com/docs/master/rados/operations/cache-tiering/

配置

5个Hosts,每个host上3个OSD, 每个Host上配置1个OSD启动MemStore,剩余2个启动FileStore。
测试中把5个MemStore的OSD配置为一个rule,剩余的FileStore的OSD配置位另一个rule。

  1. 修改并设置CRUSH map

    这里配置了两个rule,rule 0 和rule 1,其中rule 0只使用FileStore的OSD,rule 1只是用MemStore的OSD。

    1
    2
    3
    4
    ceph osd getcrushmap -o crushmap 
    crushtool -d crushmap -o crush.map
    crushtool -c crush.map -o crushmap
    ceph osd setcrushmap -i crushmap
  2. 创建cachepool,并制定其crush_ruleset

    1
    2
    3
    ceph osd pool create cachepool 512 512 replicated 
    ceph osd pool set cachepool crush_ruleset 1
    ceph osd pool set .rgw.buckets crush_ruleset 0
  3. 指定某个pool为其他pool的cache tier,设置cache mode

    1
    2
    3
    ceph osd tier add .rgw.buckets cachepool
    ceph osd tier cache-mode cachepool writeback
    ceph osd tier set-overlay .rgw.buckets cachepool

性能测试

  1. 如上配置的Cache Tiering

    Bandwidth (MB/sec): 169.912

  2. MemStore – 取消pool的cache设置,并指定.rgw.buckets的crush_ruleset为1

    Bandwidth (MB/sec): 222.263

  3. FileStore – 取消pool的cache设置,并指定.rgw.buckets的crush_ruleset为0

    Bandwidth (MB/sec): 123.848

问题分析

Cache Tiering能提升慢设备的吞吐量,但是其配置参数很多,需要根据具体应用场景测试配置参数。
拿MemStore作为cache能一定程度提升client的IO write性能(前提是设置cache-mode为writeback)。

可配置参数

Cache Tiering可以设置cache的刷新参数,包括以下几个:

1
2
3
4
5
6
7
8
9
ceph osd pool set {cachepool} hit_set_type bloom                     – 使用bloom算法来管理hit_set集合
ceph osd pool set {cachepool} hit_set_count 1 – 多少hit set 可以存储
ceph osd pool set {cachepool} hit_set_period 3600 – 每个hit set可以保留多少时间
ceph osd pool set {cachepool} target_max_bytes 1000000000000 – cache pool占用空间的刷盘阀值
ceph osd pool set {cachepool} cache_target_dirty_ratio {0.0..1.0} – dirty数据占用率刷盘的阀值
ceph osd pool set {cachepool} cache_target_full_ratio {0.0..1.0} – cache pool空间占用率达到多少时刷盘
ceph osd pool set {cachepool} target_max_objects {#objects} – cache pool中object数据的刷盘阀值
ceph osd pool set {cachepool} cache_min_flush_age {#seconds} – object在cache中最少停留时间
ceph osd pool set {cachepool} cache_min_evict_age {#seconds} – object会在多少时间后被逐出cache
支持原创