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