Ceph性能调优

1. 最佳实践

1.1 基本

  1. 监控节点对于集群的正确运行非常重要,应当为其分配独立的硬件资源。如果跨数据中心部署,监控节点应该分散在不同数据中心或者可用性区域
  2. 日志可能会让集群的吞吐量减半。理想情况下,应该在不同磁盘上运行操作系统、OSD数据、OSD日志。对于高吞吐量工作负载,考虑使用SSD进行日志存储
  3. 纠删编码(Erasure coding)可以用于存储大容量的一次性写、非频繁读、性能要求不高的数据。纠删编码存储消耗小,但是IOPS也降低
  4. 目录项(Dentry)和inode缓存可以提升性能,特别是存在很多小对象的情况下
  5. 使用缓存分层(Cache Tiering)可以大大提升集群性能。此技术可以在热、冷Tier之间自动的进行数据迁移。为了最大化性能,请使用SSD作为缓存池、并且在低延迟节点上部署缓存池
  6. 部署奇数个数的监控节点,以便仲裁投票(Quorum Voting),建议使用3-5个节点。更多的节点可以增强集群的健壮性,但是mon之间需要保持数据同步,这会影响性能
  7. 诊断性能问题的时候,总是从最底层(磁盘、网络)开始,然后再检查块设备、对象网关等高层接口
  8. 在大型集群里用单独的集群网络(Cluster Newwork)可显著地提升性能和安全性

1.2 文件系统

  1. 限制最大文件大小,创建极大的文件会导致删除过程很缓慢
  2. 避免在生产环境下使用试验特性。你应该使用单个活动MDS、不使用快照(默认如此)
  3. 避免增大max_mds,可能导致大于1个的MDS处于Active
  4. 客户端选择:
    1. FUSE,容易使用、容易升级和服务器集群保持一致
    2. 内核,性能好
    3. 不同客户端的功能并不完全一致,例如FUSE支持客户端配额,内核不支持
  5. 对于Ceph 10.x,最好使用4.x内核。如果必须使用老内核,你应该使用FUSE作为客户端

2. 基础设施要求

2.1 处理器

OSD需要消耗CPU资源,可以将其绑定到一个核心上。如果使用纠删码,则需要更多的CPU资源。此外,集群处于Recovery状态时,OSD的CPU消耗显著增加

MON不怎么消耗CPU资源,几个G内存的单核心物理机即可。

MDS相当消耗CPU资源,考虑4核心或更多CPU。如果依赖于CephFS处理大量工作,应当分配专用物理机

2.2 内存

MON/MDS需要不少于2G内存。OSD通常需要1G内存(和存储容量有关)。此外,集群处于Recovery状态时,OSD的内存消耗显著增加,因此配备2G内存更好

2.3 网络

最好具有万兆网络,公共网络、集群网络需要物理隔离(双网卡连接到独立交换机)。对于数百TB规模的集群,千兆网络也能够正常工作

集群网络往往消耗更多的带宽,此外,高性能的集群网络对于Recovery的效率很重要。

如果交换机支持,应当启用Jumbo帧,可以提升网络吞吐量。

2.4 磁盘

在生产环境下,最好让OSD使用独立的驱动器,如果和OS共享驱动,最好使用独立的分区。

通常使用SATA SSD作为日志存储,预算足够可以考虑PCIE SSD。Intel S3500的4K随机写 IOPS可达10K+

关于RAID:

  1. 最好不要使用RAID
  2. 如果有RAID卡,并且磁盘数量太多,而对应的内存数量不足(每个OSD大概需要2G内存),可以RAID0
  3. 不要使用RAID5,因为随机IO的性能降低

关于filestore:

  1. 建议使用SSD存储日志,以减少访问时间、读取延迟,实现吞吐量的显著提升
  2. 可以为创建SSD分区,每个分区作为一个OSD的日志存储,但是最好不要超过4个

2.5 BIOS设置

  1. 启用超线程Hyper-Threading技术
  2. 关闭节能
  3. 关闭NUMA

2.6 内核参数

# 修改pid max
# 执行命令
echo 4194303 > /proc/sys/kernel/pid_max
# 或者
sysctl -w kernel.pid_max=4194303
 
# read_ahead, 数据预读到内存,提升磁盘读操作能力
echo "8192" > /sys/block/sda/queue/read_ahead_kb
 
# 禁用交换文件
echo "vm.swappiness = 0" | tee -a /etc/sysctl.conf
 
# I/O Scheduler:SSD使用用noop,SATA/SAS使用deadline
echo "deadline" > /sys/block/sda/queue/scheduler
echo "noop" > /sys/block/sda/queue/scheduler

2.7 文件系统

底层文件系统的稳定性和性能对于Ceph很重要。在开发、非关键部署时可以使用btrfs,这也是未来的方向。关键的生产环境下应该使用XFS。

在高可扩容性的存储环境下,XFS和btrfs相比起ext3/4有很大优势。XFS和btrfs都是日志式文件系统,更健壮,容易从崩溃、断电中恢复。日志文件系统会在执行写操作之前,把需要进行的变更记录到日志。

OSD依赖于底层文件系统的扩展属性(Extended Attributes,XATTRs),来存储各种内部对象状态和属性。XFS支持64KB的XATTRs,但是ext4就太小了,你应该为运行在ext4上的OSD配置:

# 新版本Ceph此配置项已经没了
filestore xattr use omap = true

关于文件系统的一些知识:

  1. XFS 、 btrfs 和 ext4 都是日志文件系统
  2. XFS很成熟
  3. btrfs相对年轻,他是一个写时复制(COW)文件系统,因而支持可写文件系统快照。此外它还支持透明压缩、完整性校验

3. 归置组

3.1 PG数量

PG的数量应当总是和PGP相同。PGP是为了实现定位而创建的PG。再平衡仅仅再pgp_num被修改后才会触发,仅仅修改pg_num不会触发。

随着OSD数量的变化,选取适当的PG数量很重要。因为PG数量对集群行为、数据持久性(Durability,灾难性事件发生时保证数据堡丢失)有很大影响。此外,归置组很耗计算资源,所以很多存储池x很多归置组会导致性能下降。建议的取值:

  1. 对于小于5个OSD的集群:设置为128
  2. 5-10个OSD的集群:设置为512
  3. 10-50个OSD的集群:设置为1024
  4. 超过50个OSD的集群,需要自己权衡,利用pgcalc来计算适合的PG数量

《Ceph分布式存储学习指南》一书中建议的PG数量算法:

每个池的PG数量 = OSD总数 * 100 / 最大副本数 / 池数

计算结果需要向上舍入到2的N次幂。此外该书倾向于让所有池具有相同的PG数量。

4. 再平衡

  1. 加入新的OSD后,考虑设置权重为0,然后逐渐增加权重,这样可以避免性能下降

你可能感兴趣的:(Ceph,存储,ceph,网络,服务器)