为了提高CEPH HDD的性能,我买了Samsung 983ZET用来做Bcache缓存盘。

4个CEPH节点,每个节点OSD配置:4x4TB HDD,Samsung 983ZET一拖四用作Bcache缓存盘。1500个左右VM,平时负荷差不多23MiB/s wr | 1.5k op/s上下wr,rbd上的VM 60以上线程并发写入时经常有500ms以上的io延迟,偶尔延迟达到1000ms以上,如果更高并发写入时有时候甚至超过10000ms延迟,使用影响很大,但是并发读的却非常低的延迟一般保持在0ms,偶尔上个几十ms。

Bcache调优

可能的原因之一是Bcache会有写入放大,而Samsung 983ZET的官方参数中随机4k写入在60,000 IOPS,可能是性能不足拖不动了,而随机4k读在750,000 IOPS,所以并发读取上目前完全没有压力。因为Bcache除了调整为了writeback,其他一直是默认设置,现在来简单优化一下:

# 打开顺序IO缓存
echo 0 > /sys/block/bcache0/bcache/sequential_cutoff
echo 0 > /sys/block/bcache1/bcache/sequential_cutoff
echo 0 > /sys/block/bcache2/bcache/sequential_cutoff
echo 0 > /sys/block/bcache3/bcache/sequential_cutoff

# 关闭读写拥塞控制命令
echo 0 > /sys/fs/bcache/{cache set uuid}/congested_read_threshold_us
echo 0 > /sys/fs/bcache/{cache set uuid}/congested_write_threshold_us

# 设置磁盘的预读缓存
echo "8192" > /sys/block/sdb/queue/read_ahead_kb
echo "8192" > /sys/block/sdc/queue/read_ahead_kb
echo "8192" > /sys/block/sdd/queue/read_ahead_kb
echo "8192" > /sys/block/sde/queue/read_ahead_kb
echo "8192" > /sys/block/nvme0n1/queue/read_ahead_kb

# 提高缓存盘缓存比例
echo 40 > /sys/block/bcache0/bcache/writeback_percent
echo 40 > /sys/block/bcache1/bcache/writeback_percent
echo 40 > /sys/block/bcache2/bcache/writeback_percent
echo 40 > /sys/block/bcache3/bcache/writeback_percent

一般writeback_percent常见设定是默认的10%,因为比例越高意味越多脏数据还没刷入后端数据盘,如果writeback模式,缓存盘挂了意味着数据损坏。

这调整可以保住一时小命,缓解一些压力,但如果负载继续上升一些就会再次出现之前的情况。

目前的方案是购买Intel Optane 900P,划分区做WAL/DB给HDD加速,傲腾官方参数随机4k写入在500,000 IOPS。由于三星983ZET具有非常好的4k随机读性能,是超过傲腾的,所以为了避免浪费,可以继续用作Bcache,但可以将writeback模式调整为writearound,即写入时不经过缓存盘,只用作读缓存。

另外还有个就是如果983ZET单独为每个OSD划出个分区用作Bcache、以及WAL/DB那会不会有性能改善呢?也许983ZET的写性能还没完全发挥,这样做能不能进一步榨干983ZET的性能和HDD的性能呢?因为看测评虽然官方说4k随机写60,000 IOPS,但评测数值有189,288 IOPS,就带4个HDD应该不算多。

据说WAL/DB给NVME SSD可以提高一倍左右的iops,但我只打算给RocksDB到L3 划分35GB每个分区,具体提升多少还待调整升级好后测试,这可能很有意思,等到了我试试贴上来。

Bcache缓存盘即WAL/DB盘型号的选择

那怎么选购Bcache缓存盘、及用作WAL/DB的SSD盘时应考虑什么呢?我在开始时了解不够吃了亏,买了Samsung 983ZET,嘛,也不能说浪费了吧吃亏了吧,毕竟用来做Bcache只读缓存它还是有用武之地,如果用作写缓存应该Nvme企盘里的渣渣了。这种用途的盘,选择上:

1、应该选高耐用的企业级SSD,因为会涉及写放大的问题,如果耐用不够没几下就炸了会哭。企业级和消费级SSD最大的区别也是这个耐用了。
2、最好是pci-e3 / 4接口的兼容高、原生支持,U.2口比较新插上去可能要做一些调整。
3、带有掉电保护电容,万一突然断电,你不会想在缓存里的数据消失,这对ceph的打击可能非常大。
4、以及较高的随机4k读写IOPS,原因参考上文我遇到的问题,但具体多少取决你想带多少盘和你的用途;对参数不太了解或者想看实际性能测试的可以看看 https://www.storagereview.com/ 这是我后面发现的宝藏网站!目前我见到社区类似帖子提到过的有Intel 3600P AIC/ Intel Optane AIC/ Samsung pm1725b AIC

一般如果加速盘容量够,也可以同时用于Bcache、WAL、DB盘,这个可以参考华为鲲鹏存储的方案设置:https://support.huaweicloud.com/fg-kunpengsdss/kunpengswc_20_0010.html
更新:实测在把WAL/DB放到SSD的同时再为HDD启用Bcache,对读写性能是会有再次提升的!当然,你的SSD性能得够。具体测试数据我晚点再发个文。

预留容量

有关Ceph bluestore的DB分区容量,ceph官方建议是hdd的4%,但ceph社区里的普遍意见是30GB以及300GB,而大多数选择30GB能以经济的方式提高性能(看来全世界人都有共同的难题-穷)。其他容量可能没有很多意义,因为不会被使用。但目前也有说octopus及之后的版本会充分利用容量。这个我没有具体测试过,如果资金充裕当然是尽量300GB或者按照官方推荐的4%,越大肯定效果越好。

至于原因,RocksDB L3在30GB,如果要用到L4则需要有286GB的容量/ 所以会说是300GB。而我选择35GB分区是因为我在研究分区容量的时候,看到社区很多人30GB溢出了,然后看到大神的文章:https://www.cnblogs.com/zphj1987/p/13879581.html 重点:

parted命令分区的GB转换是按1000进制处理容量的,而对容量的需求的是真正的1024的去算的,这个地方就存在误差了,所以30GB会出现溢出,这时候DB分区放大到35GB即可,默认配置下就不会出现L3溢出。

WAL分区ceph社区大多数人设定的2GB,我参照suse建议是4GB。

标签: Ceph, Bcache

添加新评论