公司业务中大量使用了rbd的存储,但是集群是纯hdd osd构成。iops 不让人满意。
一直在琢磨怎么能更好的提高小io 的iops。
挂载rbd一般大部分人使用的是 kernel rbd 方式。但是这种方式并没有使用 rbd cache。对于业务程序是单线程的情况,性能指标不让人满意。
借用一张网图
内核挂载使用的是 rbd.ko
而官方文档介绍了 nbd,io 先通过nbd,再转到librbd
而librbd 才有rbd cache 。
一
如何使用nbd呢,参考了几个文章。可以升级内核,启用 nbd 模块。
centos 7.6 默认内核下没有nbd 的模块,于是升级内核。
1)
打开 https://elrepo.org/linux/kernel/el7/x86_64/RPMS/
下载
kernel-lt-4.4.234-1.el7.elrepo.x86_64.rpm
kernel-lt-devel-4.4.234-1.el7.elrepo.x86_64.rpm
2)
安装
rpm -ivh kernel*.rpm
执行下面步骤
perl -pi -e 's/saved/0/g' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
上面步骤时间比较久。耐心等
配置好 ceph 的yum 的情况下顺便吧 rbd-nbd 也安装了
yum install -y rbd-nbd.x86_64
reboot
3)
检查下内核变更成功了没有。
uname -r
4.4.234-1.el7.elrepo.x86_64
4)
先配置一下 nbd 的配置文件
echo "options nbd max_part=3 nbds_max=20" >/etc/modprobe.d/nbd.conf
其中 nbds_max 是你本机器打算用多少个nbd 设备。
启用
modprobe nbd
顺便 查看下mod 的信息
modinfo nbd
filename: /lib/modules/4.4.234-1.el7.elrepo.x86_64/kernel/drivers/block/nbd.ko
license: GPL
description: Network Block Device
srcversion: DD8C5FF6C2BE9A22548F48D
depends:
retpoline: Y
intree: Y
vermagic: 4.4.234-1.el7.elrepo.x86_64 SMP mod_unload modversions
parm: nbds_max:number of network block devices to initialize (default: 16) (int)
parm: max_part:number of partitions per device (default: 0) (int)
二
nbd 设备的挂载
这时候可以在 /dev/ 下看到多个nbd文件 (还没挂载的)
ls /dev/nbd*
/dev/nbd0 /dev/nbd10 /dev/nbd12 /dev/nbd14 /dev/nbd2 /dev/nbd4 /dev/nbd6 /dev/nbd8
等等
挂载ceph rbd 设备的办法
rbd-nbd -h
Usage: rbd-nbd [options] map
unmap
list-mapped List mapped nbd devices
Options:
--device
--read-only Map read-only
--nbds_max
--max_part
--exclusive Forbid writes by other clients
--conf/-c FILE read configuration from the given configuration file
--id/-i ID set ID portion of my name
--name/-n TYPE.ID set name
--cluster NAME set cluster name (default: ceph)
--setuser USER set uid to user or uid (and gid to user's gid)
--setgroup GROUP set gid to group or gid
--version show version and quit
-d run in foreground, log to stderr
-f run in foreground, log to usual location
比如我要挂载 纠删的 ecrbd 的测试块 txmnbd-00
rbd-nbd map ecrbd/txmnbd-00 --name client.ms -k /etc/ceph/ceph.client.test.keyring -c /etc/ceph/ceph.conf
如果不是默认 key 和 conf 文件 需要指定一下。
挂载成功 可以用 fdisk 和 lsblk 看到设备。
也可以用 rbd nbd list 命令查看
rbd nbd list 或者使用 rbd-nbd list-mapped
pid pool image snap device
223316 ecrbd txmnbd-00 - /dev/nbd0
用fio 对比 kernel rbd 挂载和nbd 挂载的性能
fio 单 numjobs
-direct=1 -iodepth 1 -thread -rw=write -ioengine=libaio -bs=8k -size=20G -fio -filename=/backupdata/00/txmtestfio8k -direct=1 -iodepth 1 -thread -rw=write -ioengine=libaio -bs=8k -size=20G -numjobs=1 -runtime=60 -group_reporting -name=test8k-runtime=60 -group_reporting -name=test8k
相同集群下如果采用kernel 挂载,采用单进程的 fio 测试只有10-20iops
只有使用 -numjobs=100 以上,或者 加大-iodepth 到 10
iops 才能过100.
也就是是有没有rbd cahe,对小io 影响非常大。
我这里使用的rbd cache 配置 如下(建议根据业务调整)
[client]
rbd_cache = true
admin socket = /var/run/ceph/type.pid.$cctid.asok
rbd_cache_size = 1671088640
rbd_cache_max_dirty = 360994944
rbd_cache_target_dirty = 190663296
rbd_cache_max_dirty_age = 10
rbd_op_threads = 1
rbd_cache_writethrough_until_flush = false