Ceph 存储运维完全指南 / 10 - 性能调优
10 - 性能调优
10.1 性能基准测试
在调优前,先建立性能基线。
# RADOS 写入基准测试(4K 随机写,30 秒,4 并发)
rados bench -p mypool 30 write -b 4096 -t 4 --no-cleanup
# RADOS 顺序读测试
rados bench -p mypool 30 seq -t 4
# RADOS 随机读测试
rados bench -p mypool 30 rand -t 4
# RADOS 清理测试数据
rados cleanup -p mypool --benchmark
# 使用 fio 测试 RBD 性能
sudo rbd map rbd/benchmark --size 10G
# 4K 随机写
sudo fio --name=rbd-write \
--ioengine=rbd --clientname=admin --pool=rbd --rbdname=benchmark \
--rw=randwrite --bs=4k --numjobs=4 --size=1G --runtime=30 \
--time_based --group_reporting
# 4K 随机读
sudo fio --name=rbd-read \
--ioengine=rbd --clientname=admin --pool=rbd --rbdname=benchmark \
--rw=randread --bs=4k --numjobs=4 --size=1G --runtime=30 \
--time_based --group_reporting
# 顺序大块读写
sudo fio --name=rbd-seq \
--ioengine=rbd --clientname=admin --pool=rbd --rbdname=benchmark \
--rw=readwrite --rwmixread=70 --bs=1M --numjobs=1 --size=4G --runtime=60 \
--time_based --group_reporting
参考性能指标
| 存储类型 | 4K 随机读 IOPS | 4K 随机写 IOPS | 顺序读吞吐 | 顺序写吞吐 |
|---|---|---|---|---|
| 3 副本 NVMe | 80,000-200,000 | 30,000-80,000 | 2-5 GB/s | 1-3 GB/s |
| 3 副本 SATA SSD | 40,000-100,000 | 15,000-40,000 | 1-3 GB/s | 0.5-2 GB/s |
| 3 副本 HDD | 200-500 | 100-300 | 200-500 MB/s | 100-300 MB/s |
| EC 4+2 HDD | 100-300 | 50-150 | 300-800 MB/s | 100-400 MB/s |
10.2 PG 数量优化
PG 数量直接影响数据分布均匀性和性能。
影响因素
PG 过少 → 数据分布不均匀 → 部分 OSD 负载过高
PG 过多 → 内存消耗增加 → 恢复时间变长
最佳实践
# 启用 PG 自动伸缩(推荐)
ceph mgr module enable pg_autoscaler
# 查看当前 PG 状态和建议
ceph osd pool autoscale-status
# 手动计算公式(如果不用自动伸缩)
# 每个池的 PG 数 = (OSD 数 × 100) / 副本数 / 池数量
# 取最近的 2 的幂
# 调整 PG 数量(只能增加,不能减少)
ceph osd pool set mypool pg_num 256
# pgp_num 需要同步调整
ceph osd pool set mypool pgp_num 256
# 查看单个 OSD 上的 PG 数量
ceph osd df | awk 'NR>2 {print $1, $NF}' | sort -k2 -rn
PG 数量参考
| OSD 总数 | 单池(副本3) | 单池(EC 4+2) |
|---|---|---|
| 3-5 | 128 | 128 |
| 6-10 | 256 | 128 |
| 10-20 | 512 | 256 |
| 50 | 1024 | 512 |
| 100 | 2048 | 1024 |
| 200+ | 4096 | 2048 |
10.3 OSD 调优
BlueStore 配置
BlueStore 是 Ceph 的默认存储引擎,直接管理裸设备。
# === BlueStore 关键配置 ===
# WAL 和 DB 设备分离(使用高速 SSD)
# 在创建 OSD 时指定
ceph orch daemon add osd node1 --data /dev/sdb --wal /dev/nvme0n1p1 --db /dev/nvme0n1p2
# BlueStore 缓存大小(默认 1GB)
ceph config set osd bluestore_cache_size_ssd 4294967296 # SSD: 4GB
ceph config.set osd bluestore_cache_size_hdd 2147483648 # HDD: 2GB
ceph config set osd bluestore_cache_meta_ratio 0.5 # 元数据缓存占比
ceph config set osd bluestore_cache_kv_ratio 0.3 # KV 缓存占比
ceph config set osd bluestore_cache_data_ratio 0.2 # 数据缓存占比
# BlueStore 预分配
ceph config set osd bluestore_prefer_deferred_size_ssd 0 # SSD 立即写入
ceph config set osd bluestore_prefer_deferred_size_hdd 65536 # HDD 延迟写入 64KB 以下
# BlueStore 压缩
ceph config set osd bluestore_compression_mode aggressive # none/passive/aggressive/force
ceph config set osd bluestore_compression_algorithm lz4 # none/snappy/zlib/lz4/zstd
ceph config set osd bluestore_compression_min_blob_size 128K
ceph config set osd bluestore_compression_max_blob_size 512K
OSD 线程配置
# Op 线程数(读写操作处理线程)
ceph config set osd osd_op_threads 4
# 恢复线程数
ceph config set osd osd_recovery_threads 3
# 恢复优先级(降低对正常 I/O 的影响)
ceph config set osd osd_recovery_op_priority 3 # 默认 3(最低优先级)
ceph config set osd osd_recovery_max_active 3 # 最大并发恢复数
ceph config set osd osd_recovery_max_active_hdd 3 # HDD 最大恢复并发
ceph config set osd osd_recovery_max_active_ssd 10 # SSD 最大恢复并发
# 后台操作限制
ceph config set osd osd_scrub_sleep 0.1 # scrub 间隔(秒)
ceph config set osd osd_scrub_priority 1 # scrub 优先级
ceph config set osd osd_max_scrubs 3 # 最大 scrub 并发数
OSD 内存配置
# OSD 内存目标(建议每 OSD 1-4GB)
ceph config set osd osd_memory_target 4294967296 # 4GB
ceph config set osd osd_memory_target_autotune true # 自动调整
# 查看 OSD 内存使用
ceph tell osd.0 dump_mem_usage
10.4 网络优化
双网卡分离
# ceph.conf 中配置公共网络和集群网络
[global]
public_network = 192.168.1.0/24 # 客户端访问网络
cluster_network = 10.10.10.0/24 # OSD 复制/恢复网络
网络参数调优
# 增大 TCP 缓冲区
echo 'net.core.rmem_max = 56623104' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 56623104' >> /etc/sysctl.conf
echo 'net.core.rmem_default = 56623104' >> /etc/sysctl.conf
echo 'net.core.wmem_default = 56623104' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_rmem = 4096 87380 56623104' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_wmem = 4096 87380 56623104' >> /etc/sysctl.conf
# 增大 socket 缓冲区
echo 'net.core.optmem_max = 131072' >> /etc/sysctl.conf
echo 'net.core.somaxconn = 8192' >> /etc/sysctl.conf
echo 'net.core.netdev_max_backlog = 50000' >> /etc/sysctl.conf
# 启用 Jumbo Frame(MTU 9000)
sudo ip link set eth1 mtu 9000
# 应用
sudo sysctl -p
# Ceph Messenger v2 配置(推荐)
ceph config set global ms_type async+posix
10.5 内核参数调优
# I/O 调度器设置
# NVMe: none(无需调度器)
echo none > /sys/block/nvme0n1/queue/scheduler
# SSD: none 或 mq-deadline
echo mq-deadline > /sys/block/sda/queue/scheduler
# HDD: mq-deadline
echo mq-deadline > /sys/block/sdb/queue/scheduler
# 预读设置
echo 4096 > /sys/block/sdb/queue/read_ahead_kb # HDD OSD
echo 2048 > /sys/block/nvme0n1/queue/read_ahead_kb # NVMe
# 虚拟内存参数
echo 'vm.swappiness = 0' >> /etc/sysctl.conf
echo 'vm.dirty_ratio = 10' >> /etc/sysctl.conf
echo 'vm.dirty_background_ratio = 3' >> /etc/sysctl.conf
echo 'vm.min_free_kbytes = 524288' >> /etc/sysctl.conf
# 文件系统参数(如果 OSD 磁盘有文件系统)
echo 'fs.file-max = 6553600' >> /etc/sysctl.conf
echo 'fs.aio-max-nr = 1048576' >> /etc/sysctl.conf
sudo sysctl -p
10.6 客户端性能优化
RBD 客户端
# KRBD 调整
echo 128 > /sys/bus/rbd/devices/rbd0/queue_depth # 队列深度
echo 8388608 > /sys/bus/rbd/devices/rbd0/read_ahead_bytes # 预读 8MB
# librados 客户端配置
[client]
rbd_cache = true
rbd_cache_size = 67108864 # 64MB 缓存
rbd_cache_max_dirty = 33554432 # 32MB 脏数据
rbd_cache_target_dirty = 16777216 # 16MB 目标脏数据
rbd_cache_max_dirty_age = 5 # 脏数据最大年龄(秒)
rbd_cache_writethrough_until_flush = true
CephFS 客户端
# 内核挂载调优
mount -t ceph ... /mnt -o rsize=65536,wsize=65536,name=admin,secretfile=key
# MDS 缓存调优
ceph config set mds mds_cache_memory_limit 8589934592 # 8GB
ceph config set mds mds_recall_max_decay_rate 1.5
10.7 性能调优 Checklist
| 优化项 | 操作 | 影响 |
|---|---|---|
| PG 自动伸缩 | 启用 pg_autoscaler | 数据分布更均匀 |
| WAL/DB 分离 | 使用 NVMe 做 WAL/DB | 写入延迟降低 30-50% |
| 双网卡分离 | public + cluster 网络 | 避免复制流量争用 |
| BlueStore 缓存 | 调整 cache_size | 提升读取性能 |
| I/O 调度器 | NVMe 用 none | 减少调度开销 |
| Jumbo Frame | MTU 9000 | 降低网络延迟 |
| 恢复限制 | recovery_max_active | 减少恢复对正常 I/O 的影响 |
| Scrub 调度 | 避开业务高峰期 | 减少 scrub 对性能的影响 |
| 脏数据设置 | vm.dirty_ratio=10 | 避免 I/O 风暴 |
| 客户端缓存 | RBD cache | 提升小块读写性能 |
扩展阅读
下一章:11 - 数据恢复 — 学习数据恢复流程、OSD 替换、PG 修复和数据迁移。