精读笔记(RHCA 英文教材)· CL260 Chapter 12 Tuning and Troubleshooting Red Hat Ceph Storage
精读笔记(RHCA 英文教材)· CL260 Chapter 12 Tuning and Troubleshooting Red Hat Ceph Storage
教材原文:RHCA 官方英文教材(PDF 第 419~472 页)(OCR 整书版已从本站移除,本页为章节精读) 关联知识:Ch3(配置库/MON/网络)、Ch4(BlueStore/池)、Ch5(CRUSH)、Ch11(维护标志/换盘);本章=性能调优(硬件选型/PG/scrub/backfill)与排障(日志/时钟/网络/RGW/CephFS) 课程结构:3 个 Section(各带 Guided Exercise)+ 章末 Lab(lab:
tuning-review)。本书为 CL260 倒数第 3 章,调优思想与 RH442 相通。
Chapter Goal / Objectives(原文+译)
- GOAL: Identify the key Ceph cluster performance metrics, and use them to tune and troubleshoot Ceph operations for optimal performance(识别关键性能指标,用于调优与排障).
- OBJECTIVES: ① 按架构场景选择调优手段、用专用性能分析工具优化集群部署;② 通过控制 scrub/deep-scrub/backfill/recovery 保护 OSD 与集群硬件不过载;③ 识别关键调优参数并为 RGW/RBD/CephFS 客户端排障。
- 一句话主线:先定指标目标(延迟/IOPS/吞吐)→ 硬件选型 → PG/网络设计 → 运行时限制后台任务 → 组件级排障。
12.1 Optimizing Red Hat Ceph Storage Performance
三大性能指标(Latency / IOPS / Throughput)
- Latency 延迟:磁盘延迟≠响应时间(response time 是整个服务器/系统的函数)。机械盘延迟=寻道时间 seek time(0.2~0.8 ms)+旋转延迟 rotational latency(数 ms);SSD 随机访问延迟 <1ms;NVMe 为微秒级。
- IOPS(I/O 操作/秒):取决于设备与应用。参考值:机械盘 50~200、SSD 数千~数十万、NVMe 数十万级。
- Throughput 吞吐:每秒传输字节数,受块大小与传输率影响。参考值:机械盘 ~150 MB/s、SSD ~500 MB/s、NVMe ~2000 MB/s(2,000)。
- tuning 目标:硬件决定上限,调优目标是让硬件利用率最高;注意指标互斥(低延迟常以吞吐为代价),开工前按工作负载定目标(IOPS optimized / throughput optimized / capacity optimized)。
硬件配置建议(考试会用“参照数字”)
| 维度 | IOPS 优化 | 吞吐优化 | 容量优化 |
|---|---|---|---|
| OSD 布局 | 每 NVMe 2 个 OSD(data/db/WAL 同盘) | 每 HDD 1 个 OSD;db+WAL 放 SSD/NVMe | 每 HDD 1 个 OSD(三者同盘) |
| CPU(2GHz 计) | NVMe 每盘 10 核 / SSD 每盘 2 核 | HDD 每盘 0.5 核 | HDD 每盘 0.5 核 |
| 内存 | 16 GB 基线 + 每 OSD 5 GB | 同左 | 同左 |
| 网卡 | 每 2 个 OSD 1 块 10GbE | 每 12 个 OSD 1 块 10GbE | 每 12 个 OSD 1 块 10GbE |
| 硬盘 | — | ≥7,200 RPM | ≥7,200 RPM |
PG 数量设计(Red Hat 公式与 autoscaler)
- Red Hat 建议每 OSD 100~200 个 PG;官方提供 PG per Pool Calculator(access.redhat.com/labs/cephpgc)。总 PG 公式:副本池
(OSD数 × 100) / 副本数;EC 池还要除以 K 因子,再取 2 的幂/乘以系数。 - 新建池默认
pg_num=8(过低);pg_autoscale_mode默认 on:Ceph 自动建议并调整pg_num/pgp_num(pg_num=PG 总数;pgp_num=CRUSH 放置时考虑的 PG 数)。 - 手动调 PG 必须小步递增(一次大幅增加会引发密集数据搬迁、拖垮性能):
ceph osd pool set <pool> pg_num <n>;pg_num只能增不能减(教科书口径:建议只增)。 ceph osd pool autoscale-status:看PG_NUM(当前/目标)与NEW PG_NUM(建议值);模式 off/warn/on——warn 只发健康告警(如POOL_TOO_FEW_PGS)不自动调整。
扩展方式与网络架构
- Scale out(加同规格节点)为 Ceph 推荐方向;scale up(加 CPU/内存)受单机可扩展性限制。
- 网络最佳实践:client/集群 I/O 全走网络,务必拆分 public network(客户端+MON/MGR/MDS)与 cluster network(OSD 间复制/心跳/backfill)。daemon 自动绑定:MON 只绑 public,OSD 双网都绑(Figure 12.1)。
- 瓶颈规避:可用 primary affinity 让慢盘少当主 OSD——
ceph osd primary-affinity <osd-id> <0~1>(实数,0=永不当主)。
Recovery / Backfill 限速参数(限制后台 I/O 与网络)
| 参数 | 含义 |
|---|---|
osd_recovery_op_priority | recovery 操作优先级 |
osd_recovery_max_active | 每 OSD 并行 active recovery 数上限 |
osd_recovery_threads | recovery 线程数 |
osd_max_backfills | 每 OSD 最大并发 backfill 数 |
osd_backfill_scan_min / osd_backfill_scan_max | 每次 backfill 扫描对象数下限/上限 |
osd_backfill_full_ratio | 向 OSD 发起 backfill 的容量阈值 |
osd_backfill_retry_interval | backfill 失败后重试等待秒数 |
- 用法:临时限速用
ceph tell osd.<id> config set <param> <值>;持久化用ceph config set osd <param> <值>。
性能计数器与压力测试工具
- 计数器访问三途径:Dashboard(8443 端口,Cluster→OSDs 实时读/写字节与操作数,bootstrap 后默认启用);MGR Prometheus 插件(9283 端口,供外部 Prometheus 采集);ceph CLI(
ceph tell <daemon> perf dump)。 rados bench(RADOS 对象存储压力):rados -p <pool> bench <seconds> write|seq|rand [--no-cleanup];默认对象 4 MB、并发 16;--no-cleanup保留对象便于多轮测试,需手动清理。输出含 Bandwidth、IOPS、Latency 汇总。rbd bench(对既有 RBD image 测吞吐/延迟):默认 pool=rbd、--io-size 4096、--io-threads 16、--io-total 1 GB、--io-pattern seq;无单位后缀按字节计。
实验要点 · Guided Exercise(lab: tuning-optimize)
建 testpool(autoscale=on 自动 32 PG)→ 关 autoscale 并 pg_num 8 → 开 warn 模式看到 HEALTH_WARN POOL_TOO_FEW_PGS: has 8, should have 32 → 再开 on 自动回 32;随后 ceph osd primary-affinity 7 0 并 ceph osd tree/ceph osd dump | grep affinity 验证 PRI-AFF;再建 benchpool(rados -p benchpool bench 30 write)同时 ceph tell osd.6 perf dump > perfdump.txt,重点看 op_latency/subop_latency/op_r_latency/op_w_latency(计数器=sum/avgcount,值累计)。
12.2 Tuning Object Storage Cluster Performance
BlueStore 调优
- BlueStore 特性回顾:直接管理裸设备(无本地文件系统层)、写时复制(COW)高效支持 RBD/CephFS 快照与 EC 两阶段提交、无日志双写(metadata 用 RocksDB)。
bluestore_min_alloc_size:分配粒度(SSD 默认 4096/4K,HDD 默认 64K);bluestore_min_alloc_size_ssd/hdd分设备类型设置,显式设置该变量会覆盖前两者。生产环境改动前须先联系 Red Hat Support。- 碎片检测:
ceph daemon osd.<id> bluestore allocator score block输出fragmentation_rating(0~1;0~0.7 可接受、0.7~0.9 明显但安全、>0.9 严重需处理)。
Scrubbing 维护(light / deep)
- Light scrub:验证对象存在性、checksum、大小;默认每 1 天;Deep scrub:读出数据重算并校验 checksum;默认每 7 天。
- 时间窗与负载参数(
[osd]段/ceph config set osd …):osd_scrub_begin_hour/osd_scrub_end_hour(0~23;同为 0=全天可 scrub)、osd_scrub_load_threshold(loadavg/在线 CPU 数低于阈值才 scrub,默认 0.5)、osd_scrub_min_interval(默认 1 天)、osd_scrub_interval_randomize_ratio(默认 0.5 加随机延迟防雪崩)、osd_scrub_max_interval(默认 7 天,到点必 scrub)、osd_scrub_priority(相对客户端操作优先级)。 - 池级参数:
noscrub/nodeep-scrub(true 即停对应校验)、scrub_min_interval/scrub_max_interval/deep_scrub_interval(0=沿用全局 osd_* 参数)。 - 命令:
ceph pg dump(LAST_SCRUB / LAST_DEEP_SCRUB 列)、ceph pg scrub <pg-id>、ceph pg deep-scrub <pg-id>。
Snapshot trimming(异步删除)
- 删除池/RBD 快照后,数据清除是异步的“快照裁剪”,可调参数错峰(如按天限制、批大小),避免与业务高峰叠加。OSD 级删除同类调度。
运行时限流(recovery/backfill,默认值要记)
- 默认每 OSD 同时 1 个 backfill(
osd_max_backfills=1)。 - recovery 默认不设
osd_recovery_max_active(=0),实际用 hdd=3 / ssd=10(osd_recovery_max_active_hdd/osd_recovery_max_active_ssd)。 - 单 OSD 改运行时:
ceph tell osd.0 config set osd_max_backfills 2、ceph tell osd.0 config set osd_recovery_max_active 1;全 OSD:ceph tell osd.* config set …。
实验要点 · Guided Exercise(lab: tuning-perf)
ceph tell osd.0 bluestore allocator score block 看碎片(预期很低)→ ceph tell osd.0 config get osd_max_backfills(=1)改 2 → 查 osd_recovery_max_active(0)及 _hdd=3/_ssd=10 子参数,改为 1 并 config get 验证。
12.3 Troubleshooting Clusters and Clients
排障思路清单
① 用 ceph health detail/ceph health status 定位组件(单 OSD 还是整节点)→ ② 对该组件开 debug 日志并查看 → ③ 确认受支持配置 → ④ 判断是否有 slow/stuck 操作。先 MON/quorum → 网络 → OSD → 客户端。
健康消息与慢操作
- 有些告警单因可解:
POOL_TOO_FEW_PGS(Pool has 8, should have 32)→ 调pg_num或把 autoscale 从 warn 改 on。 - OSD 互发 heartbeat ping 监控存活,ping 响应时间也用于网络性能监控;多个 OSD ping 失败提示交换机等网络组件故障。
- slow ops(如
278 slow ops, oldest one blocked for 170 sec)通常指向某个慢 OSD/网络瓶颈。
日志配置(debug 级别 1~20,越大越啰嗦)
- 运行时临时开(推荐,修完即还原):
ceph tell osd.0 config set debug_ms 5;查看:ceph tell osd.0 config show。 - 配置库持久化(开机即生效):
ceph config set global debug_ms 1/5、ceph config set osd debug_osd 1/5、ceph config set mon debug_mon 20(格式 1/5=内存日志级别/输出日志级别)。 - 日志位置
/var/log/ceph,先写内存缓存(仅在 fatal signal/assert/显式请求时落盘),级别高时每小时可超 1 GB,务必开 logrotate(/etc/logrotate.d/ceph,可加size触发)+ 修完还原默认。 - 客户端 socket 排障:
ls /var/run/ceph/<fsid>(各 daemon.asok)→ceph --admin-daemon <asok> perfdump(如 ceph-fuse 挂载后取客户端性能计数器)、ceph --admin-daemon <asok> config set debug_ms 1。
版本与特性兼容
ceph versions:各角色 daemon 版本分布(mon/mgr/osd/mds/rgw/overall)。ceph features:列出已支持的客户端特性级别;旧客户端可能读不了 EC 池或 PG upmap。ceph osd set-require-min-compat-client <version>设定最低客户端版本;ceph osd get-require-min-compat-client查看(例:luminous)。
Cephx 认证排障
- 要么全开要么全关,不支持混合配置;默认全开。常见问题:keyring/ceph.conf 权限错误、文件缺失、用户 caps 非法、用户名拼写错——
ceph auth list核对。 - 所有 ceph 命令默认以
client.admin认证,可用--name/--id切换用户。
MON / OSD 常见告警
- MON:clock skew / clock drift(MON 时钟差超
mon_clock_drift_allowed,默认 0.05s;根因多为 chrony 未跑/NTP 错/网络坏);mon.<x> store is getting too big!(store 过大拖慢响应)。 - OSD:full osds(
mon_osd_full_ratio默认 0.95 触发 HEALTH_ERR;ceph df看%RAW USED,>70% 起就该清理或扩容);slow ops、down/out 等见 Ch11。
网络排障清单
核对 ceph config get mon cluster_network/public_network(或 ceph.conf)→ 网卡是否全通 → 主机名互通 → 防火墙端口放行 → ping 验证延迟/丢包 → 交换机级联带宽是否足够(慢节点拖累快节点)→ chronyc tracking 验证 NTP。
RGW 排障(Beast 内嵌 Web 服务器)
- 日志:
ceph config set client.rgw log_to_file true、log_file <路径>、debug_rgw 20;开启rgw_enable_ops_log/rgw_enable_usage_log记录操作与用量。 radosgw-admin log list(列出日志对象)→radosgw-admin log show(可加--bucket/--date/--bucket-id按桶与时间戳查)。- 常见问题:S3 签名用时间戳,客户端与 RGW 时钟偏差过大报签名错→两端都要 NTP;RGW 配置存于 RADOS 对象,其 PG 必须 active+clean,否则请求卡住。
CephFS / RBD 客户端排障
- CephFS:
cephfs set <fs> session_timeout <秒>(会话超时默认 60s);session_autoclose默认 300s——客户端失联超时被 MDS 驱逐(evict),随后被临时 ban,需重启客户端或卸载重挂才能重连。 - RBD:客户端先用 rbdmap/
rbd device检查内核模块与 map 状态;配合 librbd 侧 perf 与集群侧 OSD perf 对照延迟(apply_latency=OSD 写后端、commit_latency=写提交)。 - 通用客户端问题:MON 不可达、CLI 参数写错、keyring/权限不对、客户端版本太旧。
实验要点 · Guided Exercise(lab: tuning-troubleshoot)
① clock skew:ceph health detail 见 MON_CLOCK_SKEW: mon.serverd clock skew 299s > max 0.05s → 登 serverd systemctl status chronyd(inactive dead)→ systemctl start chronyd 恢复;② down OSD:ceph osd tree 找 down 的 osd → systemctl status ceph-<fsid>@osd.N.service → 查 journalctl/log 发现 unable to find any IPv4 address in networks ... Failed to pick cluster address → ceph config get osd.0 cluster_network 对照后 ceph config set osd.4 cluster_network 172.25.249.0/24 → ceph orch daemon restart osd.4 → ceph health 回 OK。
Lab 概要(lab: tuning-review / grade)
综合题:处理 clock skew + down OSD(用诊断日志找配置错误,如 cluster_network 写错);ceph tell osd.5 config set osd_op_history_size 40、osd_op_history_duration 700(dump_historic_ops 验证);全 OSD osd_max_backfills 3、osd_recovery_max_active 1。
命令速查表
| 用途 | 命令 | | PG 自动伸缩状态 | ceph osd pool autoscale-status | | 设池 PG 数/autoscale 模式 | ceph osd pool set <pool> pg_num <n> \| pg_autoscale_mode on\|off\|warn | | 主 OSD 亲和性 | ceph osd primary-affinity <osd-id> <0~1> | | 对象存储压测 | rados -p <pool> bench <秒> write [--no-cleanup] | | RBD 压测 | rbd bench --pool <p> --io-size 4096 --io-threads 16 --io-total 1G [write] | | 查看性能计数器 | ceph tell osd.<id> perf dump | | 最近操作历史(默认20条/600s) | ceph tell osd.<id> dump_historic_ops | | 调 op 历史容量 | ceph tell osd.<id> config set osd_op_history_size 40 / osd_op_history_duration 700 | | 限 backfill/recovery(运行时) | ceph tell osd.<id>\|osd.* config set osd_max_backfills 3 / osd_recovery_max_active 1 | | BlueStore 碎片评分 | ceph daemon osd.<id> bluestore allocator score block | | 手动 scrub / deep-scrub | ceph pg scrub <pg-id> / ceph pg deep-scrub <pg-id> | | 看 PG 校验时间 | ceph pg dump(LAST_SCRUB/LAST_DEEP_SCRUB) | | 临时开 debug | ceph tell osd.<id> config set debug_ms 5 | | 配置库开 debug(重启保留) | ceph config set osd debug_osd 1/5;ceph config set mon debug_mon 20 | | 看运行配置 | ceph tell osd.<id> config show | | 版本与最低兼容客户端 | ceph versions;ceph osd get/set-require-min-compat-client <v> | | 客户端 socket 调试 | ceph --admin-daemon /var/run/ceph/<fsid>/ceph-client.admin.*.asok perfdump | | RGW 日志对象 | radosgw-admin log list / log show [--bucket b --date t] | | CephFS 会话参数 | cephfs set <fs> session_timeout 60 / session_autoclose 300 | | 网络参数核对 | ceph config get mon cluster_network / public_network |
词汇表
| 英文 | 中文 | 速记 |
|---|---|---|
| seek time / rotational latency | 寻道时间/旋转延迟 | 机械盘延迟两大组成 |
| throughput | 吞吐量 | 每秒字节数 |
| pg_autoscale_mode | PG 自动伸缩模式 | on 自动调 / warn 只告警 / off 关 |
| primary affinity | 主 OSD 亲和性 | 0~1 权重,避让慢盘 |
| light / deep scrub | 浅/深校验 | 前者对象元数据+checksum,后者读数据重算 |
| fragmentation rating | 碎片评分 | 0~1,>0.9 严重 |
| snapshot trimming | 快照裁剪 | 删快照后的异步数据清除 |
| op latency / subop latency | 主/子操作延迟 | perf dump 中 sum/avgcount 计算 |
| dump_historic_ops | 历史操作转储 | 默认记最近 20 条/600 秒 |
| clock skew / drift | 时钟偏差/漂移 | 超 mon_clock_drift_allowed(0.05s) 告警 |
| session_timeout / session_autoclose | 会话超时/自动关闭 | 60s/300s;后者触发 evict+ban |
| set-require-min-compat-client | 最低兼容客户端 | 防老客户端用不了新特性 |
自测 10 题
- Red Hat 建议每 OSD 多少 PG?(100~200)
- 建池默认 pg_num 与 pg_autoscale_mode 各是什么?(8 / on)
- 只告警不自动调 PG 的模式叫什么?(warn → HEALTH_WARN POOL_TOO_FEW_PGS)
- 三档硬件设计(IOPS/吞吐/容量)在 HDD 上每 OSD 配多少核?(0.5 核)
- primary-affinity 取 0 表示什么?(永不当 PG 主 OSD)
- 默认每 OSD 并发 backfill 数、HDD/SSD recovery 数?(1 / 3 / 10)
- 浅/深 scrub 默认间隔?(1 天 / 7 天)用什么命令看上次时间?(ceph pg dump)
- 查 BlueStore 碎片评分的命令?(ceph daemon osd.<id> bluestore allocator score block)
- debug 级别范围与 1/5 含义?(1~20;内存级1/落盘级5)日志默认目录?(/var/log/ceph)
- MON clock skew 阈值参数与 CephFS 会话驱逐默认秒数?(mon_clock_drift_allowed≈0.05s;session_autoclose 300s)
