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 对比。

标签: none

添加新评论