一次ceph大块性能调优的实践
发表于 2025/08/18
0
背景
客户要求按照如下图顺序测试ceph性能,循环3轮取平均值,目标所有性能都不低于x86 80%
测试结果显示arm大块性能不如x86
调优过程
限流调优
小块测试和大块测试混合测试时由于小块写会将数据写碎,大块性能下降属于正常现象,从测试结果看到arm小块性能明显好于x86,怀疑由于arm小块性能更好导致碎片化更严重导致大块性能下降明显。初步方案将测试方案修改为固定数据量与x86一致,保证碎片化一致,但是与客户讨论不同意修改测试方案。方案二选择对小块性能进行限制,通过修改配置文件限流,将小块性能限制在x86性能80%左右。
通过限流发现碎片化程度得到缓解,大块性能均有一定程度的提升,但是仍达不到性能指标,需要进一步分析。
配置文件调优
实验室环境测试性能下降没有一线明显,怀疑是ceph的某个配置文件导致写碎后1M写碎片化严重,将配置文件提供给一线性能提升明显
后续分析
单独测试大块性能和循环用例测试性能发现大块性能比单独测试下降80%+,抓取iostat发现写盘的wareq-sz变化明显
检查发现bluestore_min_alloc_size_hdd参数默认为64k,但是客户配置文件修改为了8k,此参数含义为hdd做osd时的bluestore分配空间的最小粒度,影响落盘大小
修改该参数为默认值64k并重新部署osd(参考ceph osd重新部署流程),进行复测,性能下降不到50%,且下降时落盘块大小也不会散成不到100k
疑点
一线环境修改配置文件重启后性能就提升明显,实验室环境用一线的配置文件和实验室配置文件性能下降趋势基本一致,无法复现一线替换配置文件后的性能提升,需要进一步分析。
ceph的分配器
经过一线二分配置文件比较,发现现场把bluefs_allocator = bitmap和bluestore_allocator = bitmap两个配置项注释掉性能就获得了很大提升。客户验收数据如下:
bluestore_allocator是一种用于管理bluestore的物理空间分配的组件,常用的两种实现方式:hybrid和bitmap。hybrid是一种混合了bitmap和interval_set的方式,它可以在不同的粒度下使用不同的数据结构来表示空闲空间。bitmap是一种使用位图来表示空闲空间的方式,它可以在固定的粒度下高效地进行分配和释放操作。两者的区别主要在于性能和空间利用率方面,hybrid可以适应不同大小的分配请求,但是需要更多的内存来存储数据结构,而bitmap可以节省内存,但是可能会造成内部碎片。具体原理可以参考ceph bluestore中的磁盘空间管理或自行搜索。
从以上描述可以看出采用hybrid能够提高大块小块混合场景下的大块性能,这与以上现象是一致的。进一步搜索ceph各个版本之间参数变化分析发现,ceph 14.2.11版本的nautilus: os/bluestore: implement Hybrid allocator新增了hybrid的分配器,实验室环境是14.2.8版本,而现场环境为14.2.22版本,因此实验室版本无论使用哪个配置文件都是用的是旧版本的bitmap,这与实验室环境两个配置文件性能下降一致的现象也是符合的。
结论
此次大块性能调优中,从系统层面很快确定了原因,小块测试和大块测试混合测试时由于小块写会将数据写碎,大块性能下降。早期从规避方案上考虑了限制碎片化程度的方案,有一定效果,但任然无法达到目标,进一步分析中发现性能下降时的落盘块大小是有变化的,因此从配置文件上进行了考虑,最终确定了两个影响性能的关键配置项。
配置项 | 描述 |
---|---|
bluestore_min_alloc_size_hdd | hdd做osd时的bluestore分配空间的最小粒度,影响落盘的块大小 |
bluestore_allocator | bluestore分配器类型,当前常用的hybrid和bitmap,hybrid在大小块混合场景能提升大块性能但需要使用更多内存 |