强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 随机读 IOPS4K 随机写 IOPS顺序读吞吐顺序写吞吐
3 副本 NVMe80,000-200,00030,000-80,0002-5 GB/s1-3 GB/s
3 副本 SATA SSD40,000-100,00015,000-40,0001-3 GB/s0.5-2 GB/s
3 副本 HDD200-500100-300200-500 MB/s100-300 MB/s
EC 4+2 HDD100-30050-150300-800 MB/s100-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-5128128
6-10256128
10-20512256
501024512
10020481024
200+40962048

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 FrameMTU 9000降低网络延迟
恢复限制recovery_max_active减少恢复对正常 I/O 的影响
Scrub 调度避开业务高峰期减少 scrub 对性能的影响
脏数据设置vm.dirty_ratio=10避免 I/O 风暴
客户端缓存RBD cache提升小块读写性能

扩展阅读

  1. Ceph 性能调优文档
  2. BlueStore 配置
  3. Ceph 基准测试
  4. fio RBD 引擎

下一章11 - 数据恢复 — 学习数据恢复流程、OSD 替换、PG 修复和数据迁移。