Ceph集群性能优化介绍

1.集群硬件配置

典型硬件资源配置建议:

组件 CPU 内存 网络 存储空间
Monitor 1vCore 2GB 1x 1GbE+ NICs 单个Mon 10GB+
OSD 1vCore BlueStore后端,单个OSD 至少3 GB。裸容量每增加1 TB,则内存相应增加1 GB 1x 1GbE+ NICs (建议10GbE+) 一个OSD 对应一块独立的硬盘
  • public network和cluster network 分开。
  • 操作系统、OSD data、OSD 日志分别使用独立的硬盘,使整体吞吐量最大化。
  • 一般,建议单OSD 分配4GB以上的内存,多小对象或有大对象场景下对性能有提升。不建议低于2GB。
  • 对于OSD 除显式分配的内存外,还会多约20%的额外内存开销,需要考虑到。

对于采用的BlueStore的Ceph,将SSD 用在合适的地方一般可以显著提升性能:

  • OSD 日志建议使用SSD。如果采用bluestore,则建议裸容量配比—— block : block.db : block.wal = 100:1:1,后两者建议采用SSD或NVMe SSD。
  • 采用cache-tiering,其中cache pool 采用SSD。
  • CephFS 的metadata pool 采用SSD。
  • RGW index pool 采用SSD。

2.常见性能影响因素

集群性能评估

根据采用的硬件和集群规模,应当对集群有个大致的性能估算。集群性能影响因素主要有:硬盘(单个硬盘的性能和硬盘总数)、网络性能、内存和CPU。其中前两个是估算集群整体性能的主要因素,而根据场景,性能主要是IOPS和带宽。
一般:

  • 集群读取性能:
集群读取性能:W*n*μ,无论在FileStore还是BlueStore下
其中,
W: 单块裸盘读带宽
n: OSD数量
μ: 损耗系数 一般为0.7~0.8
  • 集群写入性能:
集群写入性能:[(W*n)/WAF]*μ
W: 单块裸盘写入带宽
n: OSD数量
WAF: 写放大系数
μ: 损耗系数
X: 写入数据块大小(KiB)
N: 多副本Size大小
K: 纠删码K值
M: 纠删码M值
FileStore 5: 5KiB, FileStore中transaction元数据的数据量大小(推测值)
BlueStore 5: 5KiB, BlueStore中RocksDB的WAL数据大小(推测值)
BlueStore 20: 20KiB, BlueStore小文件写入时产生的Zero-filled数据块大小

性能瓶颈定位

经过对集群的性能评估,结合主要的影响因素,试着找出性能瓶颈的大方向。
准确的性能评估需要进行严格的性能测试:

  • 首先是基准测试,包括硬盘基线测试(如dd)和网络基线测试(如iperf),测试前应当drop cache。
  • 然后分别对于集群做性能测试:rados bench
  • RBD 性能测试:rbd bench
  • RGW 性能测试:cosbench

通过ceph osd perf可以看出整个集群所有OSDs 的时延数据。
更详细的时延信息可以通过perf dump调查,如

1.ceph daemon osd.15 perf reset all
2.rados bench WRITE
3.ceph daemon osd.15 perf dump

常见性能优化点

排除硬件瓶颈的可能,则可以从常见的几项对照排查修改。

  • 存储池的PG 数是否合理:一般,集群PGs总数 = (OSD总数 * 100 / 最大副本数),具体可参考pgcal
  • monitor 采用3或5个即可。由于需要再monitor之间做数据同步,过多的monitor 会影响性能。
  • 建议Ceph 集群和其他系统独立部署,以免资源抢占影响性能,且混合部署影响troubleshooting。

3.使用Cache-tiering

使用缓存分层,可以根据需求在热层和冷层之间自动迁移数据,从而提高群集的性能。
采用的cache-tiering的前提是要搞清业务场景,因为cache-tiering 是工作负载相关的,不合适的场景匹配不合适的缓存模式(cache mode)反而会让整体性能下降。

  • write-back:Ceph 客户端写数据至cache tier,随后会将数据迁移至storage tier。客户端读取数据也是直接读取cache tier,若cache tier 没有会从storage tier 中获取并迁移至cache tier。客户端的读写始终不直接跟storage tier 关联。 这种模式适用于可变数据的存储访问。
  • readproxy:使用已存在与cache tier 内的对象, 如果cache tier 内无该对象则会将请求代理至storage tier。
  • readonly:cache tier 仅接受读操作,写操作都会指向storage tier,预读取的对象会被迁移至cache tier,一定条件下会被迁移出cache tier。这种模式不保证一致性,读取的数据可能是过期的,适用于不变数据的存储访问。
  • none:完全disable cache tiering。

cache-tiering 配置流程

首先,除storage pool 外,需要创建一个全SSD 的cache pool(通过修改 crushmap)。
根据实际场景:

  • 数据对象是更偏向不变对象还是可变对象,决定采用什么缓存模式(cache-mode);
  • 根据客户端负载情况,设置和调整缓存池的参数(大小、数量等);
  • 其他诸如cache age、target size 等参数。

必要操作步骤:
1)关联cache pool 和后端存储池:ceph osd tier add

2)设置cache-mode:ceph osd tier cache-mode writeback

3)将原storage pool的流量指向cache pool:ceph osd tier set-overlay

4)必要的缓存阈值设置,所有的请求在达到target_max_bytes 或target_max_objects 设定值时会被阻塞

ceph osd pool set target_max_bytes {#bytes}
ceph osd pool set target_max_objects {#objects}

4.Damons 相关配置优化

常见配置优化项及建议值,根据实际场景可再做调整。
默认应将RGW Cache 和RBD cache打开。

OSD

osd_scrub_begin_hour = 1 #根据业务实际设置在非业务时间scrub
osd_scrub_end_hour = 5
osd_recovery_op_priority = 3
osd_client_op_priority = 63
osd_recovery_max_active = 10
osd_recovery_sleep = 0
osd_max_backfills = 10

RGW(对象存储)

rgw_cache_enabled = true # 开启RGW cache
rgw_thread_pool_size = 2000
rgw_cache_lru_size = 20000
rgw_num_rados_handles = 128

RBD(块存储)

rbd_cache_enabled = true # 开启RBD cache
rbd_cache_size = 268435456
rbd_cache_max_dirty = 134217728
rbd_cache_max_dirty_age = 5
posted @ 2020-06-11 21:52  TuringM  阅读(4259)  评论(0编辑  收藏  举报