博客参考汇总:

奋斗的松鼠-个人博客

性能不稳定因素

Ceph性能优化总结v0.94

鲲鹏分布式存储解决方案

吞吐量与IOPS及测试工具FIO使用

性能测试

rados bench

使用ceph自带的rados bench工具进行测试

该工具的语法是:rados bench -p -b -t —no-cleanup

pool_name:测试所针对的存储池;

seconds:测试所持续的秒数;

:操作模式,write:写,seq:顺序读;rand:随机读;

-b:block size,即块大小,默认为 4M;

-t:读/写并行数,默认为 16;

—no-cleanup 表示测试完成后不删除测试用数据。在做读测试之前,需要使用该参数来运行一遍写测试来产生测试数据,在全部测试结束后可以运行 rados -p cleanup 来清理所有测试数据。

写测试

  1. rados bench -p rbd 10 write --no-cleanup

顺序读

rados bench -p rbd 10 seq

随机读

rados bench -p rbd 10 rand

rados load-gen

# rados -p rbd load-gen 
--num-objects     初始生成测试用的对象数,默认 200
--min-object-size 测试对象的最小大小,默认 1KB,单位byte 
--max-object-size 测试对象的最大大小,默认 5GB,单位byte

--min-op-len      压测IO的最小大小,默认 1KB,单位byte
--max-op-len      压测IO的最大大小,默认 2MB,单位byte
--max-ops         一次提交的最大IO数,相当于iodepth
--target-throughput 一次提交IO的历史累计吞吐量上限,默认 5MB/s,单位B/s
--max-backlog     一次提交IO的吞吐量上限,默认10MB/s,单位B/s
--read-percent    读写混合中读的比例,默认80,范围[0, 100]

--run-length      运行的时间,默认60s,单位秒

rbd bench-write

rbd bench-write 的语法为:rbd bench-write ,可以带如下参数:

  • —io-size:单位 byte,默认 4096 bytes = 4K
  • —io-threads:线程数,默认 16
  • —io-total:总写入字节,单位为字节,默认 1024M
  • —io-pattern :写模式,默认为 seq 即顺序写

分别在集群 OSD 节点上和客户端上做测试

fio

编译与安装

fio使用rbd测试引擎

安装需要的依赖包

yum install librados;

yum install librados-devel;

yum install libaio-devel;

yum install librbd-devel;

fio 2.x

FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。

a.下载地址:http://freshmeat.sourceforge.net/projects/fio/
b.安装两个插件

yum install libaio*

yum install zlib*

yum -y install gcc gcc-c++ kernel-devel //安装gcc、c++编译器以及内核文件

c.编译安装过程

tar -xvf fio-2.1.10.tar.gz

cd fio-2.1.10

./configure

make

make install

fio 3.x

推荐:下载最新的源码编译安装

# git clone git://git.kernel.dk/fio.git
# cd fio/
# ./configure
...
Rados Block Device engine     no
...

编译最新的fio源码,需要快速升级gcc的版本,否则编译过程会出现报错:

[root@kvm fio]# ./configure 
Operating system              Linux
CPU                           x86_64
Big endian                    no
Compiler                      gcc
Cross compile                 no

Static build                  no

Your compiler doesn't support C11 atomics. gcc 4.9/clang 3.6 are the
minimum versions with it - perhaps your compiler is too old?
C11 atomics support not found
Configure failed, check config.log and/or the above output
sudo yum install centos-release-scl
sudo yum install devtoolset-7-gcc*
scl enable devtoolset-7 bash
which gcc

gcc --version
gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
Copyright (C) 2017 Free Software Foundation, Inc.

fio编译过程显示不支持RBD

Rados engine                  no
Rados Block Device engine     no

解决:需要安装librbd引擎
#yum install librbd-devel -y
./configure编译确定无误后,执行make;make install安装。
最后会看到fio已经支持libaio和rbd引擎

[root@kvm fio]# fio --enghelp
Available IO engines:
    cpuio
    mmap
    sync
    psync
    vsync
    pvsync
    pvsync2
    null
    net
    netsplice
    ftruncate
    filecreate
    filestat
    posixaio
    falloc
    e4defrag
    splice
    mtd
    sg
    io_uring
    libaio
    rdma
    rados
    rbd

test.fio

; -- start job file --
[mytest]
filename=/mnt/rbd/fio.img
ioengine=psync
direct=0
thread
rw=randwrite
bs=4k
size=1g
numjobs=2
runtime=60
group_reporting 
; -- end job file --

Ceph-RBD性能测试

测试librbd

创建一个image

rbd -p rbd create --size 20480 fio_test

直接引用fio自带的job file进行测试

######################################################################
# Example test for the RBD engine.
#
# Runs a 4k random write test agains a RBD via librbd
#
# NOTE: Make sure you have either a RBD named 'fio_test' or change
#       the rbdname parameter.
######################################################################
[global]
#logging
#write_iops_log=write_iops_log
#write_bw_log=write_bw_log
#write_lat_log=write_lat_log
ioengine=rbd
clientname=admin
pool=rbd
rbdname=fio_test
invalidate=0    # mandatory
rw=randwrite
bs=4k

[rbd_iodepth32]
iodepth=32

以上 job file 将执行整个RBD大小的100%随机写入测试(将通过librbd确定),Ceph用户 admin 使用Ceph 默认 pool rbd和刚刚创建的空的 RBD fio_test,写的 blocksize 为 4k 和 iodepth 为32 。 引擎正在使用异步IO。

执行测试:

fio example/rbd.fio

测试kernel RBD

删除原来的image

新建一个rbd image

rbd -p rbd create --size 2048 fio_test

把rbd块设备map到本地,并格式化,不用挂载到目录

# rbd map rbd/fio_test
/dev/rbd0
# mkfs.xfs /dev/rbd0 -f

自行修改rbd.fio

[global]
ioengine=libaio
direct=1
thread=1
runtime=60
size=2G
group_reporting
ramp_time=6
userspace_reap
numjobs=1
iodepth=128
time_based

[randwrite-4k]
filename=/dev/rbd0
bs=4k
rw=randwrite
rwmixwrite=20
stonewall

使用dd命令测试磁盘读写

#dd if=/dev/zero of=test_dd_01 bs=1M count=100 (不准确)
#dd if=/dev/zero of=test_dd_01 bs=1M count=100 conv=fsync (比较准确,在dd结束前会写到磁盘)
#dd if=/dev/zero of=test_dd_4 bs=1M count=100 oflag=sync/dsync (是真正的每写一次就写一次磁盘,磁盘会啪啪的响)

gdbprof分析ceph的4K

https://www.dazhuanlan.com/2019/12/19/5dfb2185b49dc/

分析云硬盘的性能指标

一般通过以下几个指标进行衡量

  • IOPS:每秒的读写次数,单位为次(计数)。存储设备的底层驱动类型决定了不同的IOPS
    总IOPS:每秒执行的I/O操作总次数
    随机读IOPS:每秒指定的随机读I/O操作的平均次数
    随机写IOPS 每秒指定的随机写I/O操作的平均次数
    顺序读IOPS 每秒指定的顺序读I/O操作的平均次数
    顺序写IOPS 每秒指定的顺序写I/O操作的平均次数
  • 吞吐量:每秒的读写数据量,单位为MB/S
    吞吐量市值单位时间内可以成功传输的数据数量。
    如果需要部署大量顺序读写的应用,典型场景比如hadoop离线计算型业务,需要关注吞吐量
  • 时延:IO操作的发送时间到接收确认所经过的时间,单位为秒
    如果应用对时延比较敏感,比如数据库(过高时延会导致应用性能下降或报错),建议使用SSD存储

硬件优化

硬件规划

  • Processor

ceph-osd进程在运行过程中会消耗CPU资源,所以一般会为每一个ceph-osd进程绑定一个CPU核上。当然如果你使用EC方式,可能需要更多的CPU资源。

ceph-mon进程并不十分消耗CPU资源,所以不必为ceph-mon进程预留过多的CPU资源。

ceph-msd也是非常消耗CPU资源的,所以需要提供更多的CPU资源。

  • 内存

ceph-mon和ceph-mds需要2G内存,每个ceph-osd进程需要1G内存,当然2G更好。

  • 网络规划

万兆网络现在基本上是跑Ceph必备的,网络规划上,也尽量考虑分离cilent和cluster网络。

SSD选择

  • 企业级
  • PCIE/NVME SSD优先考虑

系统优化

升级内核版本

http://vault.centos.org/centos/7.5.1804/os/Source/SPackages/kernel-alt-4.14.0-49.el7a.src.rpm

CPU优化

BIOS设置

  • 关闭节能模式和睡眠功能
  • 开启Hyper-Threading(HT)超线程技术
  • 开启Virtual-Technology(VT)

NUMA

NUMA思路就是将内存和CPU分割为多个区域,每个区域叫做NODE,然后将NODE高速互联。 node内cpu与内存访问速度快于访问其他node的内存

关闭NUMA

BIOS硬件设置关闭NUMA

CentOS7 系统上关闭NUMA
# vim /etc/default/grub
cmdline添加"numa=off"
GRUB_CMDLINE_LINUX="crashkernel=auto numa=off rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"

# 重新生成 /etc/grub2.cfg配置文件
grub2-mkconfig -o /etc/grub2.cfg

# 重启系统
reboot

# 重启之后进行确认
dmesg | grep -i numa

再次确认:cat /proc/cmdline

进程绑定

taskset

cgroup

numactl

验证设备是否开启numa

[root@ceph-node2 ~]# grep -i numa /var/log/dmesg
[    0.000000] NUMA: Initialized distance table, cnt=2
[    0.000000] Enabling automatic NUMA balancing. Configure with numa_balancing= or the kernel.numa_balancing sysctl
[    0.991546] pci_bus 0000:00: on NUMA node 0
[    0.996312] pci_bus 0000:80: on NUMA node 1

查看numa节点信息
# lscpu
# numactl -H

查看设备的numa分布情况,没有命令可以yum install numactl -y

[root@ceph-node3 ~]# numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62
node 0 size: 49058 MB
node 0 free: 40324 MB
node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63
node 1 size: 16384 MB
node 1 free: 12505 MB
node distances:
node   0   1 
  0:  10  21 
  1:  21  10

查看具体的处理器情况

[root@ceph-node3 ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                64
On-line CPU(s) list:   0-63
Thread(s) per core:    2
Core(s) per socket:    16
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2683 v4 @ 2.10GHz
Stepping:              1
CPU MHz:               1200.219
CPU max MHz:           3000.0000
CPU min MHz:           1200.0000
BogoMIPS:              4199.99
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              40960K
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62
NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts

适用于ceph version 14.2(nautilus)版本的NUMA新特性

  • osd_numa_node: 用于手动绑定 OSD 和 NUMA 节点
  • osd_numa_auto_affinity: 如果网络和存储在同一 NUMA 节点上会自动设置 affinity
  • osd_numa_prefer_iface: OSD 选择 IP 时会尽量选同一 NUMA 节点上的
  • ceph osd numa-status 命令显示所有 OSD 的 NUMA 信息
ceph osd numa-stauts

ceph config get osd.x

ceph config set osd.x osd_numa_node 0/1

ceph config set osd.x osd_numa_auto_affinity 0/1 | false/true

ceph config set osd.x osd_numa_prefer_iface 0/1 | false/true

ceph osd down x


# numactl绑定core到ceph-osd进程
numactl -C 25,27,29,31,33,35 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph

重新读取配置并重启服务:
systemctl daemon-reload
systemctl restart ceph-radosgw@rgw.$(hostname -s).service
systemctl status ceph-radosgw@rgw.$(hostname -s).service -l



再次查看目标进程的numa调度情况
for i in $(pgrep osd) ; do taskset -pc $i ; done

让CPU只为ceph服务

修改/etc/sysconfig/irqbalance文件:
[root@ceph ~]# cat /etc/sysconfig/irqbalance
# irqbalance is a daemon process that distributes interrupts across
# CPUS on SMP systems. The default is to rebalance once every 10
# seconds. This is the environment file that is specified to systemd via the
# EnvironmentFile key in the service unit file (or via whatever method the init
# system you're using has. '
#
# ONESHOT=yes
# after starting, wait for a minute, then look at the interrupt
# load and balance it once; after balancing exit and do not change
# it again.
#IRQBALANCE_ONESHOT=

#
# IRQBALANCE_BANNED_CPUS
# 64 bit bitmask which allows you to indicate which cpu's should
# be skipped when reblancing irqs. Cpu numbers which have their
# corresponding bits set to one in this mask will not have any
# irq's assigned to them on rebalance
#
IRQBALANCE_BANNED_CPUS=000000,000000ff

#
# IRQBALANCE_ARGS
# append any args here to the irqbalance daemon as documented in the man page
#
#IRQBALANCE_ARGS=

就是通过指定IRQBALANCE_BANNED_CPUS来进行中断的处理指定

内存优化

内存方面,主要是考虑一下几个方面:

  1. 尽量不让程序使用swap分区
  2. 尽量让程序访问最快的内存
  3. 尽量加大程序的cache

尽量不使用swap分区

# 修改内核参数,当内存消耗殆尽之后才开始使用swap分区
echo "vm.swappiness = 0" >> /etc/sysctl.conf
sysctl -p

# 同步数据,立即写入磁盘
sync

# 关闭swap,释放空间
swapoff -a

# 重新打开swap
swapon -a

让程序访问最快的内存

由上述的numactl绑定cpu的知识可知,在numa模式下,跨node访问内存速度会有很大差异,所以在绑定程序,尤其是rgw和osd这类进程的时候,最好同时注意到它们的所属node的关系,并且在使用numactl绑定的时候,同时指定-m参数,即指定进程从哪个node上分配内存,这样就能让程序运行得更快

加大程序的cache

加大程序的cache其实是ceph层面的调优,主要是通过加大bluestore cache size 的值来指定cache,在笔者的环境中,bluestore cache size指定为1G,而rgw的rgw lru cache使用了10000,在500个线程(python)并发上传965KB文件的情况下,两节点共12个osd时,基本可以达到600MB的集群读写带宽

网络调优

网络调优方面主要是针对网卡以及中间设备,例如交换机,进行调整,具体调整参数要根据具体硬件来确定,这里仅对笔者的硬件环境给出建议
网络环境:
1、网卡 - 40Gbps的ib卡(PCIe卡拓展),目前只有一个
2、交换机为24口的ib交换机4036E

开启巨帧模式(MTU)

网络能进行调节的地方也不多,首先是开启ib卡的巨帧模式,即调节ib卡的MTU为65520;ib卡千兆网卡不同,它使用命令

ifconfig ib1 mtu 65520

若调节mtu会报错,给mode文件注入模式,才能修改它的mtu

echo "connected" > /sys/class/net/ib1/mode
ifdown ib1 ; ifup ib1

再次查看ib卡的mtu,发现mtu已经改好了

注意,这样修改后,重启系统后ib卡仍会恢复到datagram模式,解决办法就是修改文件/etc/infiniband/openib.conf中的SET_IPOIB_CM=yes,即默认开启连接模式;但是,对ceph节点修改接口的mtu不总是能提高性能,典型的场景就是节点通信链路上的交换设备不支持巨帧,那就适得其反了,因此,需要对节点经过的交换设备修改配置,使其支持巨帧转发,这样一来就能充分利用ib卡的性能了;这里就简单说下,4036E ib交换机的巨帧模式开启,是通过交换机的管理口,对交换机的接口mtu进行设置,它只能将mtu设置最大为4096,可能是这款交换机太老了吧~不过,从实测效果来看,性能还可以,用iperf3测试显示,单口链路速度稳定在26Gbps左右;,当然,交换机成为了链路瓶颈;

irqbalance

系统中断均衡服务,会自动将网卡软中断分配到相对空闲的CPU上。

执行命令systemctl stop irqbalance关闭irqbalance,将该参数设置为“inactive”;可以通过systemctl disable irqbalance设置为重启服务器后默认关闭

rx_buff

默认值2

聚合较大的网络报文需要多篇不连续的内存空间,内存利用率低,增大该项可以提高内存利用率。

通过加载参数的方式,配置rx_buff的大小,减少不连续的内存,提高内存利用率,提高性能,调整为“8”

ring_buffer

默认值1024

通过调整网卡buffer大小可以增加吞吐量。

# 查看当前buffer大小。
ethtool -g <网卡名称>

# 将buffer大小由默认的1024调整为4096。
ethtool -G <网卡名称> rx 4096 tx 4096

tcp/ip协议栈参数优化

网络方面,除了链路上的优化外,系统的协议栈相关参数也可以进行优化,尤其是ib链路开启了巨帧模式,进行tcp协议栈优化以发挥巨帧模式的最大性能是十分有必要的,这里可以给出ib卡巨帧模式下linux网络优化的参考:

net.ipv4.tcp_timestamps=0
net.ipv4.tcp_sack=0
net.core.netdev_max_backlog=250000
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.rmem_default=16777216
net.core.wmem_default=16777216
net.core.optmem_max=16777216
net.ipv4.tcp_mem="16777216 16777216 16777216"
net.ipv4.tcp_rmem="4096 87380 16777216"
net.ipv4.tcp_wmem="4096 65536 16777216"

内核调优

Kernel pid max

系统最大进程数

echo 4194303 > /proc/sys/kernel/pid_max

swappiness

主要控制系统对swap的使用

echo "vm.swappiness = 0" > /etc/sysctl.conf ; sysctl –p
sync;swapoff -a;swapon -a

read_ahead

通过数据预读并且记载到随机访问内存方式提高磁盘读操作

cat  /sys/block/sda/queue/read_ahead_kb
128
echo “8192” > /sys/block/sda/queue/read_ahead_kb

I/O Scheduler

在不同的场景选择不同的IO调度

在完全随机访问环境下,由于CFQ可能会造成小IO的相应延时增加,所以应设置为deadline,这样更稳定。 对于SSD设备,采用NOOP或者deadline也可以获取比默认调度器更好的性能。

SSD要用noop,SATA/SAS使用deadline

echo "deadline" > /sys/block/sd[x]/queue/scheduler
echo "noop" > /sys/block/sd[x]/queue/scheduler

nr_requests

在Linux系统中,如果有大量读请求,默认的请求队列或许应付不过来,可以动态调整请求队列数

通过适当的调整nr_requests 参数可以提升磁盘的吞吐量

cat  /sys/block/sda/queue/read_ahead_kb
128
echo 512 > /sys/block/sd[x]/queue/nr_requests

软件优化

Ceph调优

利用crush设计SSD+SATA混合实例

存储节点上既有STAT硬盘 也有SSD盘, 把各个节点的SSD 和 SATA整合成独立的存储池, 为不同的应用提供不同的性能

ceph中的每个osd设备都可以选择一个class类型与之关联,默认情况下,在创建osd的时候会自动识别设备类型,然后设置该设备为相应的类。通常有三种class类型:hdd,ssd,nvme。

查询 crush class

[root@ceph-node3 ~]# ceph osd crush class ls
[
    "hdd"
]

通过对 ceph osd tree 查看 所有的 class 类都是 hdd, 如果自动设备检测出错,可以手动修改

#手动删除 class 类
[root@monitor1 tmp]# ceph osd crush rm-device-class osd.0

#手动添加ssd类
[root@monitor1 tmp]# ceph osd crush set-device-class ssd osd.0

再次查看ceph osd tree 和crush class的修改结果

[root@monitor1 tmp]# ceph osd crush class ls
[
    "hdd",
    "ssd"
]

把含有SSD 和SATA 聚合,并创建新的root层级,并保留默认的层级关系

创建一个优先使用ssd 规则的 crush-rule

[root@monitor1 tmp]# ceph osd crush rule create-replicated ssd-rule default host ssd

查看crush rule

[root@monitor1 tmp]# ceph osd crush rule ls
replicated_rule
ssd-rule

获取当前的crush map

[root@ceph-node3 ~]# ceph osd getcrushmap -o /tmp/mycrushmap
25

反编译crush map

[root@ceph-node3 ~]# crushtool -d /tmp/mycrushmap > /tmp/mycrushmap.txt

查看crush map文本

[root@ceph-node3 ~]# cat /tmp/mycrushmap.txt 
# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable chooseleaf_stable 1
tunable straw_calc_version 1
tunable allowed_bucket_algs 54

# devices
device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class hdd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd
device 6 osd.6 class hdd
device 7 osd.7 class hdd
device 8 osd.8 class hdd
device 9 osd.9 class hdd
device 10 osd.10 class hdd
device 11 osd.11 class hdd

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 zone
type 10 region
type 11 root

# buckets
host ceph-node1 {
    id -3        # do not change unnecessarily
    id -4 class hdd        # do not change unnecessarily
    # weight 3.834
    alg straw2
    hash 0    # rjenkins1
    item osd.0 weight 0.958
    item osd.1 weight 0.958
    item osd.2 weight 0.958
    item osd.3 weight 0.958
}
host ceph-node2 {
    id -5        # do not change unnecessarily
    id -6 class hdd        # do not change unnecessarily
    # weight 3.834
    alg straw2
    hash 0    # rjenkins1
    item osd.4 weight 0.958
    item osd.5 weight 0.958
    item osd.6 weight 0.958
    item osd.7 weight 0.958
}
host ceph-node3 {
    id -7        # do not change unnecessarily
    id -8 class hdd        # do not change unnecessarily
    # weight 3.834
    alg straw2
    hash 0    # rjenkins1
    item osd.8 weight 0.958
    item osd.9 weight 0.958
    item osd.10 weight 0.958
    item osd.11 weight 0.958
}
root default {
    id -1        # do not change unnecessarily
    id -2 class hdd        # do not change unnecessarily
    # weight 11.502
    alg straw2
    hash 0    # rjenkins1
    item ceph-node1 weight 3.834
    item ceph-node2 weight 3.834
    item ceph-node3 weight 3.834
}

# rules
rule replicated_rule {
    id 0
    type replicated
    min_size 1
    max_size 10
    step take default
    step chooseleaf firstn 0 type host
    step emit
}

# end crush map

创建一个使用ssd-rule规则的存储池

[root@monitor1 tmp]# ceph osd pool create cinyipool 128 128 ssd-rule

Ceph Configurations

[global]#全局设置
fsid = xxxxxxxxxxxxxxx                           #集群标识ID 
mon initial members = node1, node2, node3               #初始monitor (由创建monitor命令而定)
##############################################################
mon host = 10.0.1.1,10.0.1.2,10.0.1.3            #monitor IP 地址
auth cluster required = cephx                    #集群认证
auth service required = cephx                           #服务认证
auth client required = cephx                            #客户端认证
osd pool default size = 3                             #最小副本数 默认是3
osd pool default min size = 1                           #PG 处于 degraded 状态不影响其 IO 能力,min_size是一个PG能接受IO的最小副本数
public network = 10.0.1.0/24                            #公共网络(monitorIP段) 
cluster network = 10.0.2.0/24                           #集群网络
max open files = 131072                                 #默认0#如果设置了该选项,Ceph会设置系统的max open fds
mon_pg_warn_max_per_osd = 1000      #每个osd上pg数量警告值,这个可以根据具体规划来设定
mon_osd_full_ratio = .85            #存储使用率达到85%将不再提供数据存储
mon_osd_nearfull_ratio = .70        #存储使用率达到70%集群将会warn状态
osd_deep_scrub_randomize_ratio = 0.01 #随机深度清洗概率,值越大,随机深f度清洗概率越高,太高会影响业务

[mon]
mon data = /var/lib/ceph/mon/ceph-$id
mon clock drift allowed = 1                             #默认值0.05#monitor间的clock drift
mon osd min down reporters = 13                         #默认值1#向monitor报告down的最小OSD数
mon osd down out interval = 600      #默认值300      #标记一个OSD状态为down和out之前ceph等待的秒数
##############################################################

[osd]
osd data = /var/lib/ceph/osd/ceph-$id
osd journal size = 20000 #默认5120                      #osd journal大小
osd journal = /var/lib/ceph/osd/$cluster-$id/journal #osd journal 位置
osd mkfs type = xfs                                     #格式化系统类型
osd max write size = 512 #默认值90                   #OSD一次可写入的最大值(MB)
osd client message size cap = 2147483648 #默认值100    #客户端允许在内存中的最大数据(bytes)
osd deep scrub stride = 131072 #默认值524288         #在Deep Scrub时候允许读取的字节数(bytes)
osd op threads = 16 #默认值2                         #并发文件系统操作数
osd disk threads = 4 #默认值1                        #OSD密集型操作例如恢复和Scrubbing时的线程
osd map cache size = 1024 #默认值500                 #保留OSD Map的缓存(MB)
osd map cache bl size = 128 #默认值50                #OSD进程在内存中的OSD Map缓存(MB)
osd mount options xfs = "rw,noexec,nodev,noatime,nodiratime,nobarrier" #默认值rw,noatime,inode64  #Ceph OSD xfs Mount选项
osd recovery op priority = 2 #默认值10              #恢复操作优先级,取值1-63,值越高占用资源越高
osd recovery max active = 10 #默认值15              #同一时间内活跃的恢复请求数 
osd max backfills = 4  #默认值10                  #一个OSD允许的最大backfills数
osd min pg log entries = 30000 #默认值3000           #修建PGLog是保留的最大PGLog数
osd max pg log entries = 100000 #默认值10000         #修建PGLog是保留的最大PGLog数
osd mon heartbeat interval = 40 #默认值30            #OSD ping一个monitor的时间间隔(默认30s)
ms dispatch throttle bytes = 1048576000 #默认值 104857600 #等待派遣的最大消息数
objecter inflight ops = 819200 #默认值1024           #客户端流控,允许的最大未发送io请求数,超过阀值会堵塞应用io,为0表示不受限
osd op log threshold = 50 #默认值5                  #一次显示多少操作的log
osd crush chooseleaf type = 0 #默认值为1              #CRUSH规则用到chooseleaf时的bucket的类型
osd_scrub_begin_hour = 22           #清洗开始时间为晚上22点
osd_scrub_end_hour = 7              #清洗结束时间为早上7点
filestore xattr use omap = true                         #默认false#为XATTRS使用object map,EXT4文件系统时使用,XFS或者btrfs也可以使用
filestore min sync interval = 10                        #默认0.1#从日志到数据盘最小同步间隔(seconds)
filestore max sync interval = 15                        #默认5#从日志到数据盘最大同步间隔(seconds)
filestore queue max ops = 25000                        #默认500#数据盘最大接受的操作数
filestore queue max bytes = 1048576000      #默认100   #数据盘一次操作最大字节数(bytes
filestore queue committing max ops = 50000 #默认500     #数据盘能够commit的操作数
filestore queue committing max bytes = 10485760000 #默认100 #数据盘能够commit的最大字节数(bytes)
filestore split multiple = 8 #默认值2                  #前一个子目录分裂成子目录中的文件的最大数量
filestore merge threshold = 40 #默认值10               #前一个子类目录中的文件合并到父类的最小数量
filestore fd cache size = 1024 #默认值128              #对象文件句柄缓存大小
filestore op threads = 32  #默认值2                    #并发文件系统操作数
journal max write bytes = 1073714824 #默认值1048560    #journal一次性写入的最大字节数(bytes)
journal max write entries = 10000 #默认值100         #journal一次性写入的最大记录数
journal queue max ops = 50000  #默认值50            #journal一次性最大在队列中的操作数
journal queue max bytes = 10485760000 #默认值33554432   #journal一次性最大在队列中的字节数(bytes)
##############################################################
# bluestore_rocksdb调优
bluestore rocksdb options = compression=kNoCompression,max_write_buffer_number=8,min_write_buffer_number_to_merge=4,recycle_log_file_num=4,write_buffer_size=356870912,writable_file_max_buffer_size=0,compaction_readahead_size=8388608 


[client]
rbd cache = true #默认值 true      #RBD缓存
rbd cache size = 335544320 #默认值33554432           #RBD缓存大小(bytes)
rbd cache max dirty = 134217728 #默认值25165824      #缓存为write-back时允许的最大dirty字节数(bytes),如果为0,使用write-through
rbd cache max dirty age = 30 #默认值1                #在被刷新到存储盘前dirty数据存在缓存的时间(seconds)
rbd cache writethrough until flush = false #默认值true  #该选项是为了兼容linux-2.6.32之前的virtio驱动,避免因为不发送flush请求,数据不回写
              #设置该参数后,librbd会以writethrough的方式执行io,直到收到第一个flush请求,才切换为writeback方式。
rbd cache max dirty object = 2 #默认值0              #最大的Object对象数,默认为0,表示通过rbd cache size计算得到,librbd默认以4MB为单位对磁盘Image进行逻辑切分
      #每个chunk对象抽象为一个Object;librbd中以Object为单位来管理缓存,增大该值可以提升性能
rbd cache target dirty = 235544320 #默认值16777216    #开始执行回写过程的脏数据大小,不能超过 rbd_cache_max_dirty

PG 优化

PG和PGP数量一定要根据OSD的数量进行调整,计算公式如下,但是最后算出的结果一定要接近或者等于一个2的指数。

Total PGs = (Total_number_of_OSD * 100) / max_replication_count

例:

有100个osd,2副本,5个pool

Total PGs =100*100/2=5000

每个pool 的PG=5000/5=1000,那么创建pool的时候就指定pg为1024

ceph osd pool create pool_name 1024

开启ceph mgr balancer模式-自动平衡PG特性

# 开启模块
ceph mgr module enable balancer
# 查看状态
ceph balancer status
# 计算当前集群得分
ceph balancer eval
# 选择模式
ceph balancer mode [upmap/crush-compat/none]
# 设置定期自动执行
ceph balancer on

https://blog.csdn.net/ff_gogo/article/details/87981682

CRUSH Map

编辑CRUSH图的步骤:

  1. 获取 CRUSH 图;
  2. 反编译 CRUSH 图;
  3. 至少编辑一个设备、桶、规则;
  4. 重编译 CRUSH 图;
  5. 注入 CRUSH 图。

配置ceph.conf文件

osd crush update on start = false           要完全手动管理crush map,必须关闭ceph-crush-location挂钩

查看当前集群信息

[root@ceph-node2 ~]# ceph -s
  cluster:
    id:     46d712a5-3145-48f9-9920-154290b224f3
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-node1,ceph-node2,ceph-node3 (age 29h)
    mgr: ceph-node1(active, since 28h), standbys: ceph-node2, ceph-node3
    mds: cephfs:1 {0=ceph-node2=up:active} 2 up:standby
    osd: 12 osds: 12 up (since 29h), 12 in (since 29h)

  task status:
    scrub status:
        mds.ceph-node2: idle

  data:
    pools:   3 pools, 512 pgs
    objects: 23.01k objects, 89 GiB
    usage:   880 GiB used, 11 TiB / 12 TiB avail
    pgs:     512 active+clean
[root@ceph-node2 ~]# ceph osd tree
ID CLASS WEIGHT   TYPE NAME           STATUS REWEIGHT PRI-AFF 
-1       11.50195 root default                                
-3        3.83398     host ceph-node1                         
 0   hdd  0.95850         osd.0           up  1.00000 1.00000 
 1   hdd  0.95850         osd.1           up  1.00000 1.00000 
 2   hdd  0.95850         osd.2           up  1.00000 1.00000 
 3   hdd  0.95850         osd.3           up  1.00000 1.00000 
-5        3.83398     host ceph-node2                         
 4   hdd  0.95850         osd.4           up  1.00000 1.00000 
 5   hdd  0.95850         osd.5           up  1.00000 1.00000 
 6   hdd  0.95850         osd.6           up  1.00000 1.00000 
 7   hdd  0.95850         osd.7           up  1.00000 1.00000 
-7        3.83398     host ceph-node3                         
 8   hdd  0.95850         osd.8           up  1.00000 1.00000 
 9   hdd  0.95850         osd.9           up  1.00000 1.00000 
10   hdd  0.95850         osd.10          up  1.00000 1.00000 
11   hdd  0.95850         osd.11          up  1.00000 1.00000

CRUSH map操作命令:

ceph osd getcrushmap -o crush.source        #获取crush map保存为crush.source文件
crushtool -d crush.source -o crush.dp       #反编译crush map,输出文件crush.dp
vim crush.dp                                #手动修改crush map
crushtool -c crush.dp -o crush.cp           #编译crush map
ceph osd setcrushmap -i crush.cp            #将编译好的crush map注入ceph集群

bluestore-rocksdb调参

# ceph daemon osd.1 config show | grep bluestore_rocksdb
    "bluestore_rocksdb_cf": "false",
    "bluestore_rocksdb_cfs": "M= P= L=",
    "bluestore_rocksdb_options": "compression=kNoCompression,max_write_buffer_number=4,min_write_buffer_number_to_merge=1,recycle_log_file_num=4,write_buffer_size=268435456,writable_file_max_buffer_size=0,compaction_readahead_size=2097152,max_background_compactions=2",

修改ceph.conf

[osd]
bluestore rocksdb options = compression=kNoCompression,max_write_buffer_number=8,min_write_buffer_number_to_merge=4,recycle_log_file_num=4,write_buffer_size=356870912,writable_file_max_buffer_size=0,compaction_readahead_size=8388608