---
title: Ceph调优
description: "- 目的"
url: https://www.hikunpeng.com/document/detail/zh/kunpengsdss/ecosystemEnable/Ceph/kunpengcephfile_05_0008.html
sourcePath: /source/zh/kunpengsdss/ecosystemEnable/Ceph/kunpengcephfile_05_0008.html
indexId: 7ebffb897bfb1ad19056e4749ad3bc7d9981eb410c19080b2f9bbe0d0915a23872
---
# Ceph调优

#### Ceph配置调优

- 目的
  通过调整Ceph配置选项，最大化利用系统资源。

- 方法
  所有的Ceph配置参数都是通过修改“/etc/ceph/ceph.conf”实现的。比方说要修改默认副本数为4，则在“/etc/ceph/ceph.conf”文件中添加osd_pool_default_size = 4这一行字段，然后systemctl restart ceph.target重启Ceph守护进程使之生效。

  以上操作只是对当前Ceph节点生效，需要修改所有Ceph节点的“ceph.conf”文件并重启Ceph守护进程才对整个Ceph集群生效。Ceph参数优化项如表1所示：

**表1 Ceph参数配置**

| 参数名称 | 参数说明 | 优化建议 |
| --- | --- | --- |
| [global] | [global] | [global] |
| cluster\_network | 配置Cluster Network网段，用于OSD间副本复制/数据均衡，缓解Public Network网络压力。 | 修改建议：192.168.4.0/24，不同于Public即可 |
| public\_network | 配置Public Network网段，用于Client节点和Ceph节点之间的通信。 | 修改建议：192.168.3.0/24，不同于Cluster即可 |
| osd\_pool\_default\_size | 副本数设置。 | 修改建议：3 |
| osd\_memory\_target | 该选项设置了每个OSD进程能申请到的内存大小。 | 修改建议：4294967296 |


  其他配置选项优化可参考表2。

**表2 其他参数配置**

| 参数名称 | 参数含义 | 优化建议 |
| --- | --- | --- |
| [global] | [global] | [global] |
| osd\_pool\_default\_min\_size | PG处于degraded状态不影响其IO能力，“min\_size”是一个PG能接受IO的最小副本数。 | 默认值：0 修改建议：1 |
| cluster\_network | 配置一层不同于public network的网段，用于OSD间副本复制/数据均衡，缓解public network网络压力。 | 默认值：/ 修改建议：192.168.4.0/24 |
| osd\_memory\_target | 该选项设置了每个OSD进程能申请到的内存大小。 | 默认值：4294967296 修改建议：4294967296 |
| [mon] | [mon] | [mon] |
| mon\_clock\_drift\_allowed | monitor间的clock drift。 | 默认值：0.05 修改建议：1 |
| mon\_osd\_min\_down\_reporters | 向monitor报告down的最小OSD数。 | 默认值：2 修改建议：13 |
| mon\_osd\_down\_out\_interval | 标记一个OSD状态为down和out之前Ceph等待的秒数。 | 默认值：600 修改建议：600 |
| [OSD] | [OSD] | [OSD] |
| osd\_journal\_size | osd journal大小。 | 默认值：5120 修改建议：20000 |
| osd\_max\_write\_size | OSD一次可写入的最大值（MB）。 | 默认值：90 修改建议：512 |
| osd\_client\_message\_size\_cap | 客户端允许在内存中的最大数据（Bytes）。 | 默认值：100 修改建议：2147483648 |
| osd\_deep\_scrub\_stride | 在Deep Scrub时候允许读取的字节数（Bytes）。 | 默认值：524288 修改建议：131072 |
| osd\_map\_cache\_size | 保留OSD Map的缓存（MB）。 | 默认值：50 修改建议：1024 |
| osd\_recovery\_op\_priority | 恢复操作优先级，取值1\-63，值越高占用资源越高。 | 默认值：3 修改建议：2 |
| osd\_recovery\_max\_active | 同一时间内活跃的恢复请求数。 | 默认值：3 修改建议：10 |
| osd\_max\_backfills | 一个OSD允许的最大backfills数。 | 默认值：1 修改建议：4 |
| osd\_min\_pg\_log\_entries | 设置PGLog是保留的最小PGLog数。 | 默认值：3000 修改建议：30000 |
| osd\_max\_pg\_log\_entries | 设置PGLog是保留的最大PGLog数。 | 默认值：3000 修改建议：100000 |
| osd\_mon\_heartbeat\_interval | OSD ping一个monitor的时间间隔（单位s）。 | 默认值：30 修改建议：40 |
| ms\_dispatch\_throttle\_bytes | 等待派遣的最大消息数。 | 默认值：104857600 修改建议：1048576000 |
| objecter\_inflight\_ops | 客户端流控，允许的最大未发送IO请求数，超过阈值会堵塞应用IO，为0表示不受限。 | 默认值：1024 修改建议：819200 |
| osd\_op\_log\_threshold | 一次显示多少操作的log。 | 默认值：5 修改建议：50 |
| osd\_crush\_chooseleaf\_type | CRUSH规则用到chooseleaf时的bucket的类型。 | 默认值：1 修改建议：0 |
| journal\_max\_write\_bytes | journal一次性写入的最大字节数（Bytes）。 | 默认值：10485760 修改建议：1073714824 |
| journal\_max\_write\_entries | journal一次性写入的最大记录数。 | 默认值：100 修改建议：10000 |
| [Client] | [Client] | [Client] |
| rbd\_cache | RBD缓存。 | 默认值：True 修改建议：True |
| rbd\_cache\_size | RBD缓存大小（Bytes）。 | 默认值：33554432 修改建议：335544320 |
| rbd\_cache\_max\_dirty | 缓存为write\-back时允许的最大dirty字节数（Bytes），如果为0，使用write\-through。 | 默认值：25165824 修改建议：134217728 |
| rbd\_cache\_max\_dirty\_age | 在被刷新到存储盘前dirty数据存在缓存的时间（seconds）。 | 默认值：1 修改建议：30 |
| rbd\_cache\_writethrough\_until\_flush | 该选项是为了兼容linux\-2.6.32之前的virtio驱动，避免因为不发送flush请求，数据不回写。设置该参数后，librbd会以writethrough的方式执行io，直到收到第一个flush请求，才切换为writeback方式。 | 默认值：True 修改建议：False |
| rbd\_cache\_max\_dirty\_object | 最大的Object对象数，默认为0，表示通过rbd cache size计算得到，librbd默认以4MB为单位对磁盘Image进行逻辑切分。 每个chunk对象抽象为一个Object；librbd中以Object为单位来管理缓存，增大该值可以提升性能。 | 默认值：0 修改建议：2 |
| rbd\_cache\_target\_dirty | 开始执行回写过程的脏数据大小，不能超过“rbd\_cache\_max\_dirty”。 | 默认值：16777216 修改建议：235544320 |


#### PG分布调优

- 目的
  调整每个OSD上承载的PG数量，使每个OSD的负载更加均衡。

- 方法
  Ceph默认为每个存储池分配8个“pg/pgp”，在创建存储池的时候使用ceph osd pool create {pool-name} {pg-num} {pgp-num}指定“pg/pgp”数量，或者使用ceph osd pool set {pool_name} pg_num {pg-num}和ceph osd pool set {pool_name} pgp_num {pgp-num}修改已创建好的存储池的“pg/pgp”数量。修改完成后使用ceph osd pool get {pool_name} pg_num/pgp_num查看存储池的“pg/pgp”数量。

  “ceph balancer mode”默认为“none”，用ceph balancer mode upmap命令调整为“upmap”。“ceph balancer”功能默认不打开，ceph balancer on/off用来打开/关闭“ceph balancer”功能。

  PG分布参数配置如表3所示：

**表3 PG分布参数配置**

| 参数名称 | 参数说明 | 优化建议 |
| --- | --- | --- |
| pg\_num | Total PGs = (Total\_number\_of\_OSD \* 100) / max\_replication\_count，得出的结果向上取到最近的2的整数次幂。 | 默认值：8 现象：pg数量太少的话会有warning提示 修改建议：根据计算公式具体计算得到的值 |
| pgp\_num | pgp数量设置为与pg相同。 | 默认值：8 现象：pgp数量建议与pg数量相同 修改建议：根据计算公式具体计算得到的值 |
| ceph\_balancer\_mode | 使能balancer均衡器插件，并设置均衡器插件模式为“upmap”。 | 默认值：none 现象：若PG数量不均衡会出现个别OSD负载较大而成为瓶颈 修改建议：upmap |


  每个OSD上承载的PG数量应相同或非常接近，否则容易出现个别OSD压力较大成为瓶颈，运用balancer插件可以实现PG分布优化，可通过ceph balancer eval或ceph pg dump随时查看当前PG分布情况。 通过ceph balancer mode upmap以及ceph balancer on使Ceph PG自动均衡优化，Ceph每隔60秒会调整少量PG分布。通过ceph balancer eval或ceph pg dump随时查看当前PG分布情况，若PG分布情况不再变化，则说明分布已达到最佳。 上述每个OSD对应的PG分布主要影响写入的负载均衡。除了每个OSD对应的PG数量优化外，主PG的分布情况也需要视情况优化，即尽可能地将主PG均匀分布到各个OSD上。


#### OSD绑核

- 目的
  建议将OSD进程绑定到固定CPU上。

- 方法
  通过修改“/etc/ceph/ceph.conf”文件，添加“osd_numa_node = <NUM>”即可。

  具体优化项如表4所示。

**表4 OSD绑核参数配置**

| 参数名称 | 参数说明 | 优化建议 |
| --- | --- | --- |
| [osd.n] | [osd.n] | [osd.n] |
| osd\_numa\_node | 将osd.n守护进程绑定到指定空闲NUMA节点上，此处的空闲NUMA节点指处理网卡软中断的节点以外的节点。 | 默认值：无 现象：若OSD进程所在CPU和与网卡中断相同，可能会出现个别CPU的压力过大的情况 修改建议：分离CPU负载压力，避免OSD进程与网卡中断或其他高CPU消耗的进程运行在同一NUMA节点上 |


  Ceph OSD守护进程应当与网卡软中断在不同的NUMA节点上处理，否则在网络压力大的时候容易出现CPU瓶颈。Ceph默认会将OSD进程均匀地分配到所有CPU core，可以在ceph.conf中加入osd_numa_node配置选项，避免OSD进程与网卡中断或其他高CPU消耗的进程运行在同一NUMA节点上。 网络性能调优将网卡软中断绑定到所属NUMA节点的CPU core上，当网络压力较大时，绑定了软中断的CPU core利用率较高，建议将osd_numa_node设置为与网卡不同的NUMA节点。例如，通过命令cat /sys/class/net/ <网口名> /device/numa_node查询到网卡归属于NUMA节点2，则设置osd_numa_node = 0或者osd_numa_node = 1，尽量避免OSD与网卡软中断使用相同的CPU core。


#### 压缩算法配置参数调优

- 目的
  调整压缩算法相关配置参数，使压缩算法性能发挥到最优。

- 方法
  Ceph默认bluestore_min_alloc_size_hdd为32KB，该参数会影响压缩算法压缩后最终数据的大小，调小该参数，可以发挥压缩算法的压缩率优势。

  Ceph默认osd进程中处理IO请求的线程数为5，当使能压缩算法后，线程数会造成性能瓶颈，调大线程数，可以发挥压缩算法的性能优势。

  PG分布参数配置如下所示：
| 参数名称 | 参数说明 | 优化建议 |
| --- | --- | --- |
| bluestore\_min\_alloc\_size\_hdd | bluestore存储引擎中hdd数据盘的对象最小分配大小。 | 默认值：32768 修改建议：8192 |
| osd\_op\_num\_shards\_hdd | osd进程针对hdd数据盘的分片个数。 | 默认值：5 修改建议：12 |
| osd\_op\_num\_threads\_per\_shard\_hdd | osd进程针对hdd数据盘平均每个分片的线程数。 | 默认值：1 修改建议：2 |


#### Bcache使能调优

Bcache是Linux内核块层cache，它使用SSD来作为HDD硬盘的cache，从而起到加速作用。Bcache内核模块需要重新编译内核使能，具体移植指导及部署指导请根据不同的操作系统参考《Bcache用户指南（CentOS &openEuler 20.03）(https://www.hikunpeng.com/document/detail/zh/kunpengaccel/storage/cacheAccel/kunpengbcache_06_0001.html)》。


#### IO直通工具调优

IO直通工具是针对Ceph均衡型场景下的一个流程优化工具，可以自动检测Ceph集群中的OSD设备进行优化。具体使用指导请参考《鲲鹏BoostKit分布式存储使能套件 IO直通(https://www.hikunpeng.com/document/detail/zh/boostsds/iopasst/kunpengio_06_0001.html)》。
