Ceph存储系列(二十四) 分析并优化Ceph性能
1 | 作者:李晓辉 |
定义性能调优
Ceph 集群的性能调优具有三个指标:延迟、IOPS(每秒输入/输出操作数)以及吞吐量。
调优目标
根据你的工作负载,调优目标应当是:
降低延迟
提高设备的 IOPS
增加块大小
优化Ceph性能
下面的部分描述了调优Ceph的推荐实践
Ceph部署
MON 性能对集群总体性能至关重要。MON 应当位于大型部署的专用节点上。为确保正确仲裁,MON 的数量应为奇数。
在写入到 BlueStore 块数据库和预写式日志 (WAL) 时,使用 SSD 或 NVMe 来最大限度提高效率。
Ceph RADOS 网关的工作负载通常是吞吐量密集型,Ceph 存储可提供存储桶索引自动重新划分功能
存放目录结构和其他索引的元数据池可能会成为 CephFS 瓶颈。若要最大限度降低这一限制,需将 SSD 设备用于元数据池。
放置组算法
放置组总数 = (OSD * 100)/副本数。
为每个池应用这个公式,以获取集群的 PG 总数。红帽建议每个 OSD 要有 100 到 200 个 PG。
PG 自动扩展功能支持 Ceph 提出建议并自动调整 PG 的数量。此功能默认会在创建池时启用
设计集群架构
在设计Ceph集群时,考虑扩展选择,以匹配未来的数据需求,并使用正确的网络大小和体系结构促进足够的吞吐量
可扩展性
可用两种方式扩展集群化存储:
横向扩展,即添加更多节点到集群。
纵向扩展,即添加更多资源到现有节点。
纵向扩展要求节点能够接受更多的 CPU 和 RAM 资源,以处理磁盘数量和磁盘大小的增加。横向扩展需要添加具有相似资源和容量的节点,以匹配集群的现有节点,实现平衡操作。
网络的最佳实践
为增强性能并为故障排除提供更好的隔离,将不同的网络用于 OSD 流量和客户端流量。
至少,为存储集群配置 10 GB 或更大的网络。 1 GB 网络不适合生产环境。
根据集群和客户端流量以及存储的数据量评估网络大小。
强烈建议进行网络监控。
尽可能使用独立 NIC 来连接网络,或者使用独立端口。
推荐不同的网络用于 OSD 和客户端流量:
Ceph 守护进程自动绑定到正确的接口,比如将 MON 绑定到公共网络,并将 OSD 绑定到公共和集群网络。
OSD恢复与回填
当 Ceph 在集群中添加或移除 OSD 时,Ceph 会重新平衡 PG,以使用新的 OSD 或重新创建存储在被移除 OSD 中的副本。这些回填和恢复操作可能会产生大量的集群网络流量,从而影响性能。
Ceph 可提供参数来限制回填和恢复操作的 I/O 或网络活动。
下表包括其中的一些参数:
参数 | 定义 |
---|---|
osd_recovery_op_priority | 恢复操作的优先级 |
osd_recovery_max_active | 每个 OSD 并行的最大活跃恢复请求数 |
osd_recovery_threads | 用于数据恢复的线程数 |
osd_max_backfills | OSD 回填操作的最大数 |
osd_backfill_scan_min | 每次回填扫描的最小对象数量 |
osd_backfill_scan_max | 每次回填扫描的最大对象数量 |
osd_backfill_full_ratio | 向 OSD 发出的回填请求的阈值 |
osd_backfill_retry_interval | 在重试回填请求前等待的秒数 |
配置硬件
红帽为三个性能优先级提出了以下硬件配置:
优化 IOPS
每个 NVMe 设备使用两个 OSD。
NVMe 驱动器将数据、块数据库和 WAL 并置在同一存储设备上。
假设 CPU 为 2 GHz,每个 NVMe 使用 10 个内核或每个 SSD 使用 2 个内核。
分配 16 GB RAM 作为基线,外加每个 OSD 5GB。
每 2 个 OSD 使用 10 GbE NIC。
优化吞吐量
每个 HDD 使用一个 OSD。
将块数据库和 WAL 放在 SSD 或 NVMe 上。
使用至少 7,200 RPM 的 HDD 驱动器。
假设 CPU 为 2 GHz,每个 HDD 使用二分之一内核。
分配 16 GB RAM 作为基线,外加每个 OSD 5GB。
每 12 个 OSD 使用 10 GbE NIC。
优化容量
每个 HDD 使用一个 OSD。
HDD 将数据、块数据库和 WAL 并置在同一存储设备上。
使用至少 7,200 RPM 的 HDD 驱动器。
假设 CPU 为 2 GHz,每个 HDD 使用二分之一内核。
分配 16 GB RAM 作为基线,外加每个 OSD 5GB。
每 12 个 OSD 使用 10 GbE NIC。
使用Ceph性能工具进行调优
性能压力测试工具
Red Hat Ceph Storage提供了对Ceph集群进行压力测试和基准测试的工具。
RADOS bench命令
该工具可对集群执行写入和读取测试,并提供统计数据。该命令的一般语法为:
1 | [admin@node ~]$ rados -p pool-name bench seconds write|seq|rand \ |
以下是该工具的常用参数:
seq
和rand
测试是连续和随机 read 基准测试。这些测试需要先使用--no-cleanup
选项运行write
基准测试。RADOS bench 默认会删除为写入测试创建的对象。--no-cleanup
选项可保留对象,非常适合对相同对象上执行多项测试。默认对象大小
objsize
为 4 MB。默认的并发操作数
concurrency
是 16。使用
--no-cleanup
选项时,你必须手动删除在运行rados bench
命令后池中遗留的数据。
例如,以下信息由 rados bench
命令提供,包括吞吐量、IOPS 和延迟:
1 | [root@serverc ~]# ceph osd pool create testpool |
RBD bench命令
RBD bench 测量你为测试创建的现有镜像的 I/O 吞吐量和延迟。
这些是默认值:
如果你不为 size 参数提供后缀,该命令会假定以字节数为单位。
默认的池名称是
rbd
。--io-size
的默认值是 4096 字节。--io-threads
的默认值是 16。--io-total
的默认值是 1 GB。--io-pattern
的默认值是 seq,表示按顺序。
例如,rbd bench
命令可提供一些信息,包括吞吐量和延迟:
1 | [root@serverc ~]# ceph osd pool create testpool |
维护 OSD 性能
要保障良好的客户端性能,需要在物理限值内使用你的 OSD。要保持 OSD 性能,需评估以下调优机会:
- 调优 OSD 所使用的 BlueStore 后端,将对象存储到物理设备上。
- 调整自动数据清理和深度清理的计划。
- 调整异步快照修剪的计划(删除已移除的快照)。
- 控制当 OSD 出现故障或者在添加或更换 OSD 时执行回填和恢复操作的速度。
BlueStore 碎片工具
随着时间的推移,OSD 的可用空间将变得碎片化。出现碎片很正常,但碎片过多会降低 OSD 的性能。使用 BlueStore 时,可使用 BlueStore 碎片工具检查碎片级别。BlueStore 碎片工具可为 BlueStore OSD 生成一个碎片级别评分。碎⽚评分在 0 到 1 之间,0 表示⽆碎片,1 表示碎片严重。
分数范围 | 碎片情况 |
---|---|
0.0 - 0.4 | 无或非常少的碎片 |
0.4 - 0.7 | 较少且可接受的碎片 |
0.7 - 0.9 | 需要考虑但安全的碎片 |
0.9 - 1.0 | 严重碎片会导致性能问题 |
如果评分高于 0.9,表明碎片严重,可能会导致性能问题。
使⽤ BlueStore 碎⽚⼯具查看碎⽚评分:
1 | [root@node ~]# ceph daemon osd.ID bluestore allocator score block |
通过清理保持数据一致性
OSD 负责使用轻度清理和深度清理来验证数据一致性。
轻度清理可验证对象的存在性、校验和以及大小。默认每天执行一次轻度清理
深度清理可读取数据并重新计算和验证对象的校验和。每周执行一次深度清理
轻度清理
轻度清理功能具有以下调优参数:osd_scrub_begin_hour = begin_hour
:: begin_hour
参数指定开始清理的时间。有效值为 0 到 23。如果值设置为 0,并且 osd_scrub_end_hour
也为 0,则一整天都可以进行清理。
osd_scrub_end_hour = end_hour
end_hour
参数指定停止清理的时间。有效值为 0 到 23。如果值设置为 0,并且 osd_scrub_begin_hour
也为 0,则一整天都可以进行清理。
osd_scrub_load_threshold
在系统负载低于 getloadavg() / number online CPUs
参数定义的阈值时执行清理。默认值为 0.5。
osd_scrub_min_interval
如果负载低于 osd_scrub_load_threshold
参数中设置的阈值,则执行清理的频率不应超过此参数定义的秒数。默认值为 1 天。
osd_scrub_interval_randomize_ratio
为 osd_scrub_min_interval
参数中定义的值添加随机延迟。默认值为 0.5。
osd_scrub_max_interval
不论负载如何,执行清理的等待时间不要超过这个期限。默认值为 7 天。
osd_scrub_priority
使用此参数可设置清理操作的优先级。默认值为 5。此值与 osd_client_op_priority
的值相关,后者的默认优先级更高,为 63。
1 | [root@serverc ~]# ceph config ls | grep osd_scrub_begin_hour |
深度清理
以下参数对于调优深度清理来说最为关键:
osd_deep_scrub_interval
深度清理的间隔。默认值为 7 天。
osd_scrub_sleep
在深度清理磁盘读取之间引入一个暂停。增大这个值可以减慢清理操作的速度,并且降低对客户端操作的影响。默认值为 0。
你可通过下列命令,使用外部调度程序来实施轻度和深度清理:
ceph pg dump
命令会在LAST_SCRUB
和LAST_DEEP_SCRUB
列显示最近发生的轻度和深度清理。ceph pg scrub *`pg-id`*
命令可将深度清理调度到特定 PG。ceph pg deep-scrub *`pg-id`*
命令可将深度清理调度到特定 PG。
使用 ceph osd pool set *`pool-name parameter value`*
命令可以为特定的池设置这些参数。
用于清理的池参数
还可使用下列池参数,在池级别上控制轻度和深度清理:
noscrub
如果设置为 TRUE
,Ceph 不会对池进行轻度清理。默认值为 FALSE
。
nodeep-scrub
如果设置为 TRUE
,Ceph 不会对池进行深度清理。默认值为 FALSE
scrub_min_interval
执行清理的时间间隔不少于此参数定义的秒数。如果设置为 0(默认值),则 Ceph 会使用 osd_scrub_min_interval
全局配置参数。
scrub_max_interval
执行池清理前的等待时间不要超过这个期限。如果设置为 0(默认值),则 Ceph 会使用 osd_scrub_max_interval
全局配置参数。
deep_scrub_interval
深度清理的间隔。如果设置为 0(默认值),则 Ceph 会使用 osd_deep_scrub_interval
全局配置参数。
1 | [root@serverc ~]# ceph config get osd osd_scrub_min_interval |
用于清理的池参数
还可使用下列池参数,在池级别上控制轻度和深度清理:
noscrub
如果设置为 TRUE
,Ceph 不会对池进行轻度清理。默认值为 FALSE
。
nodeep-scrub
如果设置为 TRUE
,Ceph 不会对池进行深度清理。默认值为 FALSE
scrub_min_interval
执行清理的时间间隔不少于此参数定义的秒数。如果设置为 0(默认值),则 Ceph 会使用 osd_scrub_min_interval
全局配置参数。
scrub_max_interval
执行池清理前的等待时间不要超过这个期限。如果设置为 0(默认值),则 Ceph 会使用 osd_scrub_max_interval
全局配置参数。
deep_scrub_interval
深度清理的间隔。如果设置为 0(默认值),则 Ceph 会使用 osd_deep_scrub_interval
全局配置参数。
1 | [root@serverc ~]# ceph osd pool set testpool scrub_min_interval 10000 |