文章目录
- [一、Ceph RBD 调优(详细说明)](#一、Ceph RBD 调优(详细说明))
- [二、RBD Feature(镜像特性)](#二、RBD Feature(镜像特性))
-
- [1 layering](#1 layering)
- [2 exclusive-lock](#2 exclusive-lock)
- [3 object-map](#3 object-map)
- [4 fast-diff](#4 fast-diff)
- [5 deep-flatten](#5 deep-flatten)
- [推荐 RBD feature](#推荐 RBD feature)
- [三、RBD Client Cache](#三、RBD Client Cache)
- [四、RBD Object Size](#四、RBD Object Size)
-
- [object size 影响](#object size 影响)
-
- [小 object](#小 object)
- [大 object](#大 object)
- 推荐值
- [五、Ceph Recovery / Backfill 调优(重点)](#五、Ceph Recovery / Backfill 调优(重点))
- [六、Recovery 的问题](#六、Recovery 的问题)
- [七、核心 Recovery 参数](#七、核心 Recovery 参数)
- 八、动态控制重构
- [九、BlueStore + RocksDB 原理](#九、BlueStore + RocksDB 原理)
-
- [BlueStore 结构](#BlueStore 结构)
- [为什么 block.db 要 SSD](#为什么 block.db 要 SSD)
- 十、生产环境调优建议
-
-
- [1 block.db 必须 SSD](#1 block.db 必须 SSD)
- [2 recovery 必须限速](#2 recovery 必须限速)
- [3 PG 不要太多](#3 PG 不要太多)
- [4 RBD cache 必须开启](#4 RBD cache 必须开启)
-
一、Ceph RBD 调优(详细说明)
在 Ceph 集群中,RBD(RADOS Block Device) 是最常见的块存储接口,广泛用于:
- OpenStack 虚拟机磁盘
- Kubernetes CSI
- 数据库块存储
- 云盘系统
官方文档:
https://docs.ceph.com/en/reef/rbd/
RBD 的性能主要受到以下几类配置影响:
RBD Feature
RBD Client Cache
RBD Object Size
Client 并发
OSD 调度
二、RBD Feature(镜像特性)
RBD image 创建时会启用一些 feature,这些特性会影响:
- snapshot性能
- clone效率
- backup效率
- metadata维护
官方文档:
https://docs.ceph.com/en/reef/rbd/rbd-config-ref/
查看:
rbd feature ls
查看镜像:
rbd info image
1 layering
layering
作用:
允许 snapshot + clone。
原理:
image
└── snapshot
└── clone image
clone 只保存差异数据,因此:
- 创建速度极快
- 节省存储空间
典型场景:
OpenStack 虚拟机模板
官方说明:
https://docs.ceph.com/en/reef/rbd/rbd-layering/
推荐:
必须开启
2 exclusive-lock
exclusive-lock
作用:
保证 一个 RBD image 只被一个 client 写入。
为什么重要:
RBD 是分布式块设备,如果多个 client 同时写入:
数据一致性风险
exclusive-lock 的机制:
client A -> lock image
client B -> 只能 read
另外它是以下 feature 的依赖:
object-map
fast-diff
官方文档:
https://docs.ceph.com/en/reef/rbd/rbd-config-ref/#rbd-exclusive-lock
推荐:
开启
3 object-map
object-map
作用:
记录 RBD object 的存在状态。
RBD image 实际结构:
image -> many objects
如果没有 object-map:
每次 snapshot 或 diff 都要:
扫描所有 object
性能很差。
开启 object-map 后:
metadata记录 object状态
优势:
snapshot更快
clone更快
diff更快
官方文档:
https://docs.ceph.com/en/reef/rbd/rbd-config-ref/#rbd-object-map
推荐:
开启
4 fast-diff
fast-diff
作用:
加速:
rbd diff
常见场景:
备份系统
增量备份
灾备复制
没有 fast-diff:
扫描 entire image
有 fast-diff:
直接读取 metadata
官方文档:
https://docs.ceph.com/en/reef/rbd/rbd-config-ref/#rbd-fast-diff
推荐:
开启
5 deep-flatten
deep-flatten
作用:
clone image flatten。
如果 clone 依赖 parent:
parent 删除 -> clone 失效
deep-flatten 可以:
clone 完全独立
官方文档:
https://docs.ceph.com/en/reef/rbd/rbd-config-ref/#rbd-deep-flatten
推荐:
开启
推荐 RBD feature
生产环境推荐:
rbd_default_features = 125
对应:
layering
exclusive-lock
object-map
fast-diff
deep-flatten
官方文档:
https://docs.ceph.com/en/reef/rbd/rbd-config-ref/#rbd-default-features
三、RBD Client Cache
RBD client 默认支持 write-back cache。
缓存位置:
client memory
作用:
减少网络 IO。
官方文档:
https://docs.ceph.com/en/reef/rbd/rbd-config-ref/#cache-settings
rbd_cache
rbd_cache = true
作用:
开启客户端缓存。
默认:
true
如果关闭:
所有IO直达Ceph
性能会下降。
rbd_cache_size
客户端缓存大小。
默认:
32MB
在现代服务器环境中明显偏小。
推荐:
128MB
256MB
示例:
rbd_cache_size = 256M
rbd_cache_max_dirty
最大 dirty data。
默认:
24MB
如果写入超过这个值:
触发 flush
推荐:
64MB
rbd_cache_target_dirty
目标 dirty 数据。
作用:
提前 flush
推荐:
32MB
rbd_cache_max_dirty_age
最大 flush 延迟。
默认:
1秒
推荐:
5秒
原因:
减少:
小 IO flush
示例:
rbd_cache_max_dirty_age = 5
四、RBD Object Size
RBD image 实际由 多个 object 组成。
结构:
image
├── object1
├── object2
├── object3
默认:
4MB
官方文档:
https://docs.ceph.com/en/reef/rbd/rbd-config-ref/#rbd-object-size
object size 影响
影响:
IO放大
metadata数量
recovery效率
对比:
小 object
优点:
随机IO好
缺点:
metadata多
大 object
优点:
顺序IO高
缺点:
随机IO差
推荐值
| 场景 | size |
|---|---|
| VM | 4MB |
| 数据库 | 8MB |
| 大文件 | 16MB |
创建:
rbd create image --size 1T --object-size 8M
五、Ceph Recovery / Backfill 调优(重点)
当 OSD 发生以下事件:
OSD down
OSD add
CRUSH change
Ceph 会触发:
recovery
backfill
rebalance
官方文档:
https://docs.ceph.com/en/reef/rados/operations/recovery/
六、Recovery 的问题
Recovery 可能导致:
IO延迟增加
业务卡顿
原因:
recovery 与 client IO 竞争
Ceph 必须控制 recovery。
七、核心 Recovery 参数
osd_max_backfills
每个 OSD 同时执行的 backfill 数。
默认:
1
官方文档:
https://docs.ceph.com/en/reef/rados/configuration/osd-config-ref/#osd-max-backfills
如果过高:
IO 被 recovery 占用
推荐:
1~2
osd_recovery_max_active
每个 OSD 同时执行的 recovery 操作。
默认:
3
推荐:
2
官方文档:
https://docs.ceph.com/en/reef/rados/configuration/osd-config-ref/#osd-recovery-max-active
osd_recovery_op_priority
恢复优先级。
默认:
3
推荐:
1
原因:
client IO > recovery
官方文档:
https://docs.ceph.com/en/reef/rados/configuration/osd-config-ref/#osd-recovery-op-priority
osd_client_op_priority
客户端优先级。
默认:
63
建议:
不要修改
八、动态控制重构
生产环境非常常见。
暂停 recovery:
ceph osd set norecover
恢复:
ceph osd unset norecover
暂停 backfill:
ceph osd set nobackfill
恢复:
ceph osd unset nobackfill
九、BlueStore + RocksDB 原理
Ceph 18 默认使用:
- BlueStore
- RocksDB
官方文档:
BlueStore
https://docs.ceph.com/en/reef/rados/configuration/bluestore-config-ref/
BlueStore 结构
block
block.db
block.wal
作用:
block -> data
block.db -> metadata
block.wal -> journal
为什么 block.db 要 SSD
metadata 非常频繁:
omap
object map
PG log
如果在 HDD:
延迟很高
最佳结构:
NVMe
├── block.db
└── block.wal
HDD
└── block
性能提升:
3~10倍
十、生产环境调优建议
真实运维经验:
1 block.db 必须 SSD
否则:
slow request
2 recovery 必须限速
否则:
业务IO下降
3 PG 不要太多
PG 太多会导致:
OSD 内存压力
recovery慢
4 RBD cache 必须开启
否则:
性能下降