Ceph 性能调优 checklist:从内核到应用层
Ceph 性能差通常不是单点问题,是从内核到应用一系列设置叠加的结果。本文给一个我经常用的 checklist。
1. 内核 / 系统层
# 文件描述符
echo "* soft nofile 1048576" >> /etc/security/limits.conf
echo "* hard nofile 1048576" >> /etc/security/limits.conf
# 内核网络 buffer
sysctl -w net.core.rmem_max=268435456
sysctl -w net.core.wmem_max=268435456
sysctl -w net.ipv4.tcp_rmem="4096 87380 268435456"
sysctl -w net.ipv4.tcp_wmem="4096 65536 268435456"
# 关闭 transparent hugepage(OSD 内存碎片元凶)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
2. 磁盘 / IO 调度
# NVMe / SSD 用 none 调度器
echo none > /sys/block/nvme0n1/queue/scheduler
# HDD 用 mq-deadline
echo mq-deadline > /sys/block/sdb/queue/scheduler
# 关闭 readahead 对 OSD 是反优化(OSD 自己管缓存)
blockdev --setra 0 /dev/sdb
3. 网络层
- MTU 9000:jumbo frame 对 Ceph 复制流量收益巨大,但要全链路 9000
- bond mode=4 (LACP):交换机配 LAG,单流也能跑多端口
- public/cluster 分离:上面说过
4. Ceph 配置
# OSD 内存上限(按物理内存 70% / OSD 数)
ceph config set osd osd_memory_target 4G
# bluestore 缓存(默认对 SSD 偏小)
ceph config set osd bluestore_cache_size_ssd 4G
ceph config set osd bluestore_cache_size_hdd 2G
# 并发
ceph config set osd osd_op_num_shards 8
ceph config set osd osd_op_num_threads_per_shard 2
5. Pool 层
- PG 数量:每 OSD 100-150 个 PG 是甜点,少了并发不够,多了元数据压力大
- EC 还是副本:冷数据 EC 8+3,热数据 size=3 副本
- min_size:副本池别设成 1,掉一个 OSD 就丢数据
6. 客户端
- RBD:开 librbd cache
rbd_cache=true - CephFS:客户端缓存
client_cache_size=1GiB - RGW:开 civetweb/beast 的 keep-alive
实测怎么 baseline
# RADOS 层基准
rados bench -p test 60 write -t 32
rados bench -p test 60 seq
# RBD 层
rbd bench --io-type write --io-size 4K --io-threads 16 --io-total 10G test/bench
调优前后跑同样的 bench,差异肉眼可见。
教训:Ceph 调优最大的坑是"调一个看一个"——很多参数会互相干扰,建议每次只改一个,跑 bench 对比。