1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

定义性能调优

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_backfillsOSD 回填操作的最大数
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
2
[admin@node ~]$ rados -p pool-name bench seconds write|seq|rand \
-b objsize -t concurrency

以下是该工具的常用参数:

  • seqrand 测试是连续和随机 read 基准测试。这些测试需要先使用 --no-cleanup 选项运行 write 基准测试。RADOS bench 默认会删除为写入测试创建的对象。--no-cleanup 选项可保留对象,非常适合对相同对象上执行多项测试。

  • 默认对象大小 objsize 为 4 MB。

  • 默认的并发操作数 concurrency 是 16。

    使用 --no-cleanup 选项时,你必须手动删除在运行 rados bench 命令后池中遗留的数据。

例如,以下信息由 rados bench 命令提供,包括吞吐量、IOPS 和延迟:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@serverc ~]# ceph osd pool create testpool
pool 'testpool' created
[root@serverc ~]# rados bench -p testpool 10 write
hints = 1
Maintaining 16 concurrent writes of 4194304 bytes to objects of size 4194304 for up to 10 seconds or 0 objects
Object prefix: benchmark_data_serverc.lab.example.com_70765
sec Cur ops started finished avg MB/s cur MB/s last lat(s) avg lat(s)
0 0 0 0 0 0 - 0
1 16 41 25 99.9652 100 0.359402 0.458076
2 16 83 67 133.957 168 0.541215 0.418786
3 16 129 113 150.601 184 0.186691 0.386582
4 16 153 137 136.937 96 0.963831 0.428352
5 16 178 162 129.542 100 0.25583 0.428845
6 16 184 168 111.926 24 1.67054 0.472503
7 16 193 177 101.044 36 2.79377 0.534967
8 16 211 195 97.4086 72 0.978128 0.628561
9 16 220 204 90.5859 36 0.388969 0.617214
10 15 258 243 97.1097 156 0.567263 0.637828
Total time run: 10.1937
Total writes made: 258
Write size: 4194304
Object size: 4194304
Bandwidth (MB/sec): 101.239
Stddev Bandwidth: 57.2573
Max bandwidth (MB/sec): 184
Min bandwidth (MB/sec): 24
Average IOPS: 25
Stddev IOPS: 14.3143
Max IOPS: 46
Min IOPS: 6
Average Latency(s): 0.626779
Stddev Latency(s): 0.59911
Max latency(s): 3.32423
Min latency(s): 0.102171
Cleaning up (deleting benchmark objects)
Removed 258 objects
Clean up completed and total clean up time :0.295582

RBD bench命令

RBD bench 测量你为测试创建的现有镜像的 I/O 吞吐量和延迟。

这些是默认值:

  • 如果你不为 size 参数提供后缀,该命令会假定以字节数为单位。

  • 默认的池名称是 rbd

  • --io-size 的默认值是 4096 字节。

  • --io-threads 的默认值是 16。

  • --io-total 的默认值是 1 GB。

  • --io-pattern 的默认值是 seq,表示按顺序。

例如,rbd bench 命令可提供一些信息,包括吞吐量和延迟:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@serverc ~]# ceph osd pool create testpool
[root@serverc ~]# rbd create --size 5G testpool/testimage
[root@serverc ~]# rbd bench --io-type write testimage --pool=testpool
bench type write io_size 4096 io_threads 16 bytes 1073741824 pattern sequential
SEC OPS OPS/SEC BYTES/SEC
1 20928 11052.1 43 MiB/s
2 24496 12249.7 48 MiB/s
3 59664 19899.7 78 MiB/s
4 93744 23445.5 92 MiB/s
5 125344 25076.7 98 MiB/s
6 153872 32369.7 126 MiB/s
7 173808 29868 117 MiB/s
8 211424 30339.5 119 MiB/s
9 240928 29436.4 115 MiB/s
elapsed: 9 ops: 262144 ops/sec: 27238.2 bytes/sec: 106 MiB/s

维护 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
2
3
4
[root@serverc ~]# ceph config ls | grep osd_scrub_begin_hour
osd_scrub_begin_hour
[root@serverc ~]# ceph config get osd osd_scrub_begin_hour
0

深度清理

以下参数对于调优深度清理来说最为关键:

osd_deep_scrub_interval

深度清理的间隔。默认值为 7 天。

osd_scrub_sleep

在深度清理磁盘读取之间引入一个暂停。增大这个值可以减慢清理操作的速度,并且降低对客户端操作的影响。默认值为 0。

你可通过下列命令,使用外部调度程序来实施轻度和深度清理:

  • ceph pg dump 命令会在 LAST_SCRUBLAST_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
2
3
4
[root@serverc ~]# ceph config get osd osd_scrub_min_interval
86400.000000
[root@serverc ~]# ceph config get osd osd_scrub_max_interval
604800.000000

用于清理的池参数

还可使用下列池参数,在池级别上控制轻度和深度清理:

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
2
3
4
[root@serverc ~]# ceph osd pool set testpool scrub_min_interval 10000
set pool 6 scrub_min_interval to 10000
[root@serverc ~]# ceph osd pool get testpool scrub_min_interval
scrub_min_interval: 10000