ceph性能调优
一、硬件层面
1.1、 CPU
ceph-osd进程在运行过程中会消耗CPU资源,所以一般会为每一个ceph-osd进程绑定一个CPU核上。
ceph-mon进程并不十分消耗CPU资源,所以不必为ceph-mon进程预留过多的CPU资源。
ceph-msd也是非常消耗CPU资源的,所以需要提供更多的CPU资源。
1.2、 内存
ceph-mon和ceph-mds需要2G内存,每个ceph-osd进程需要1G内存。
1.3、 网络
万兆网络现在基本上是跑Ceph必备的,网络规划上,也尽量考虑分离cilent和cluster网络。网络接口上可以使用bond来提供高可用或负载均衡。
1.4、SSD
SSD在ceph中的使用可以有几种架构
a、 ssd作为Journal 一块SSD 对应不超过4块osd
b、 ssd作为高速ssd pool(需要更改crushmap)
1.5、BISO
a、 开启VT和HT,VH是虚拟化云平台必备的,HT是开启超线程单个处理器都能使用线程级并行计算。
b、 关闭节能设置,可有一定的性能提升。
c、 NUMA思路就是将内存和CPU分割为多个区域,每个区域叫做NODE,然后将NODE高速互联。 node内cpu与内存访问速度快于访问其他node的内存, NUMA可能会在某些情况下影响ceph-osd 。解决的方案,一种是通过BIOS关闭NUMA,另外一种就是通过cgroup将ceph-osd进程与某一个CPU Core以及同一NODE下的内存进行绑定。但是第二种看起来更麻烦,所以一般部署的时候可以在系统层面关闭NUMA。CentOS系统下,通过修改/etc/grub.conf文件,添加numa=off来关闭NUMA。
二、操作系统参数调优
shell
1、 Kernel pid max
echo 4194303 > /proc/sys/kernel/pid_max
2、 设置MTU,交换机端需要支持该功能,系统网卡设置才有效果
配置文件追加MTU=9000
临时配置 ifconfig eth0 mtu 9000
3、 disk read_ahead, 通过数据预读并且记载到随机访问内存方式提高磁盘读操作
echo "8192" > /sys/block/sda/queue/read_ahead_kb
4、 swappiness, 主要控制系统对swap的使用
echo "vm.swappiness = 0" >> /etc/sysctl.conf ; sysctl -p
5、 I/O Scheduler,SSD要用noop,SATA/SAS使用deadline
echo "deadline" >/sys/block/vd[x]/queue/scheduler
echo "noop" >/sys/block/vd[x]/queue/scheduler
三、ceph参数调优
3.1、[global]
shell
public network = 192.168.110.0/24 #客户端网络
cluster network = 192.168.1.0/24 #ceph集群网络
max open files =131072 #最大文件打开数
3.2、ODS参数
filestore xattr use omap | 为xattrs使用object map,ext4 文件系统使用xattr,xfs或者btrfs | false | true |
---|---|---|---|
filestore max sync interval | 日志同步到数据盘最大同步间隔 | 5 | 15 |
filestore min sync interval | 日志同步到数据盘最小同步间隔 | 0.1 | 10 |
filestore queue max ops | 数据盘最大接受操作数 | 500 | 25000 |
filestore queue max bytes | 数据盘一次操作最大字节数 | 100<<20 | 10485760 |
filestore queue committing max ops | 数据盘能过commit的操作数 | 500 | 5000 |
filestore queue committing max bytes | 数据盘能过commit的最大字节数 | 100<<20 | 10 485 760 000 |
filestore op threads | 并发文件系统最大操作数 | 2 | 32 |
参数 | 描述 | 默认值 | 建议值 |
---|---|---|---|
journal max write bytes | 日志一次能够写入的最大字节数 | 1073714824 | |
journal max write entries | 日志一次能够写入的最大条目数 | 10000 | |
journal queue max ops | 同一时间内日志队列中允许的最大操作数 | 50000 | |
journal queue max bytes | 同一时间内日志队列中允许的最大字节数 | 10485760000 |
参数 | 描述 | 默认值 | 建议值 |
---|---|---|---|
osd max write size | OSD一次允许写入最大字节数(MB) | 90 | 512 |
osd client message size cap | 内存中允许客户端存放的最大数据量(bytes) | 524 288 000 | 2147 483 648 |
osd deep scrub stride | 执行一次深入清理时OSD能够读取最大字节数(bytes) | 524288 | 131072 |
osd op threads | OSD守护进程能够使用的最大操作线程数 | 2 | 16 |
osd disk threads | 在执行如恢复和清理等OSD密集型操作时允许磁盘线程数 | 1 | 4 |
osd map cache size | OSD map缓存大小(MB) | 500 | 1024 |
osd map cache bi size | 内存中允许的OSD map缓存大小(MB) | 50 | 128 |
ods mount options xfs | "rw,noatime,inode64,logbsize=256k,delaylog,allocsize=4M" |
3.3、SSD做OSDjournal分区
3.4、PG number调整
PG和PGP数量一定要根据OSD的数量进行调整,计算公式:
Total PGs = (Total_number_of_OSD *100)/max_replication_count/pool_count
例如:OSD 15个,副本数:3. PG数目= 15*100/3 = 500 ~= 512
最后的结果要接近或者等于2的指数。增加一个集群的PG数都会导致集群重新平衡OSD负载,建议每个OSD对于的PG数目在50-100之间,减少资源消耗。tracker对性能影响较大
cephx_sign_messages=false #默认开启,对安全要求不高时建议关闭
filestore_fd_cache_size=4096 #默认256
filestore_fd_cache_shards=256 #默认16
四、客户端参数调优
shell
[client]
rbd cache = true #启用RBD缓存
rbd cache size = 268435456 #允许的RBD缓存字节数
rbd cache max ditry = 134217728 #缓存中允许的脏数据字节数,超过这个值后数据写回备用存储,若为0,ceph使用的缓存模式是write-through,
#没有使用这个参数,默认缓存机制是write-back
rbd cache dirty age = 5 #脏数据自生成到写回备用存储能够在缓存中存储的时间
五、设置缓存层
5.1、新建池
shell
#1、获取CRUSH map并反编译
ceph osd getcrushmap -o crushmapdump
crushtool -d crushmapdump -o crushmapdump-decompiled
##在当前目录下生成crushmapdump、和crushmapdump-decompiled文件
#2、编辑反编译得到的CRUSH map文件,在root default下加入下面内容
$ vim crushmapdump-decompiled
root cache {
item osd.0 weight 0.010
item osd.3 weight 0.010
item osd.6 weight 0.010
}
#3、在rules后面加入CRUSH规则
rule cache-pool {
ruleset 4
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type osd
step emit
}
!!!如果第四步报错,在加入rules规则时复制已有的规则进行修改
#4、编译新的CRUSH map,并把它导入集群中
crushtool -c crushmapdump-decompiled -o crushmapdump-compiled
ceph osd setcrushmap -i crushmapdump-compiled
#5、检查OSD,有一个名为cache的root bucket
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 4.93495 root default
-3 1.63399 host isslabsvr05
0 hdd 0.54500 osd.0 up 1.00000 1.00000
...
0 hdd 0.00999 osd.0 up 1.00000 1.00000
3 hdd 0.00999 osd.3 up 1.00000 1.00000
6 hdd 0.00999 osd.6 up 1.00000 1.00000
#6、新建一个新的池,并设定crush_ruleset是4
ceph osd pool create cache-pool 32 32
$ ceph osd crush rule ls #查询有哪些cache rule
replicated_rule
cache-pool
#设置crush rule为cache-pool
$ ceph osd pool set cache-pool crush_rule cache-pool
set pool 1 crush_rule to cache-pool
#7、进行测试
rados -p cache-pool ls
rados -p cache-pool put object1 /etc/hosts
$ ceph osd map cache-pool object1
osdmap e72 pool 'cache-pool' (1) object 'object1' -> pg 1.bac5debc (1.1c) -> up ([0,3,1], p0) acting ([0,3,1], p0)
rados -p cache-pool rm object1
5.2、新建缓存层
shell
#1、设置缓存池,绑定存储池做为缓存池
ceph osd pool create EC-pool 16 16
ceph osd tier add EC-pool cache-pool
#2、设置缓存模式为writeback 或者read-only
ceph osd tier cache-mode cache-pool writeback
#3、设置池的overlay,把标准池中的所有客户端请求转到缓存池
ceph osd tier set-overlay EC-pool cache-pool
5.3、配置缓存层
shell
#1、为缓存池启用hit set tracking,生产级别的缓存层通常使用bloom过滤器
ceph osd pool set cache-pool hit_set_type bloom
#2、启用hit_set_count,即缓存池中存储的hit set的次数
ceph osd pool set cache-pool hit_set_count 1
#3、启用hist_set_count,这是是hit set在缓存池中的有效期,以秒为单位
ceph osd pool set cache-pool hit_set_period 300
#4、缓存分层代理开始从缓存池中将对象写回后端存储或者删除前,允许存放的最大字节数
ceph osd pool set cache-pool target_max_bytes 1000000
#5、启用target_max_objects,它是缓存分层代理开始从缓存池中将对象写回后端存储或者删除前,允许存放的最大对象数
ceph osd pool set cache-pool target_max_objects 10000
#6、启用cache_min_flush_age和cache_min_evict_age,它们是缓存分层代理将数据从缓存层刷新到存储层然后在缓存层中删除这些数据的最小时间间隔(以秒为单位)
ceph osd pool set cache-pool cache_min_flush_age 300
ceph osd pool set cache-pool cache_min_evict_age 300
#7、启用cache_target_dirty_ratio,它是缓存分层代理开始将数据写回存储层前,允许缓存池中被修改的数据总量所占池总量的百分比
ceph osd pool set cache-pool cache_target_dirty_ratio .01
#8、启用cache_target_full_ratio,它是缓存分层代理开始将数据写回存储层前,允许缓存池存放未经修改的数据总量占缓存池总容量的百分比
ceph osd pool set cache-pool cache_target_full_ratio 0.2
#9、新建一个500M的临时文件,将把它写入EC池中,最终它会被写入一个缓存池中
dd if=/dev/zero of=/tmp/file1 bs=1M count=500
5.4、测试缓存层
shell
#1、将上一步生成的500M文件写入EC池中
rados -p EC-pool put object1 /tmp/file1
#2、查看跟踪变化
rados -p EC-pool ls
rados -p cache-pool ls
date
#3、300s后,cache_min_evict_age 300,缓存代理将从缓存池中迁移object1 到EC存储池,缓存池中object1将被删除
rados -p EC-pool ls
rados -p cache-pool ls
date