Ceph测试调优案例分享
Ceph测试调优案例分享_鲲鹏BoostKit_鲲鹏_华为云论坛 (huaweicloud.com)
Ceph性能测试案例分析与调优
测试模型:
使用3台TaiShan 2280 V1服务器搭建ceph集群,每个节点包含3块HDD盘用作数据盘、一块SSD盘作为journal日志盘,所使用的ceph版本为12.2.11,存储引擎为filestore。
案例1:Rados测试时4M写速度遇到瓶颈且不符合预期
现象描述:
测试工具使用的是ceph自带的测试工具Rados。在进行4M块大小数据写入时,随着并发数(4并发)增加很快达到了处理速度瓶颈,后续不管如何增加处理线程均无法提升写入速度。
过程分析:
从CPU资源看,CPU资源尚空闲比较多,不存在CPU瓶颈。从内存方面分析,存在部分跨numa内存访问,但不应该直接一刀切式的阻碍速度提升。鉴于节点间的数据流通过网络传输,随后分析网络瓶颈。网络带宽为10GE,在停止ceph业务时通过iperf测试节点间网络速度,实测速度达到9.3Gb/s,符合预期。而后对比4M块大小的读取速度,Rados的4M读取速度远大于写速度。此时,开始怀疑是磁盘本身的问题。
通过iostat工具分析各个磁盘的读写,发现SSD盘速度保持恒定,平均请求队列长度很长。随后通过fio工具测试该款SSD单盘在4M块大小的写入速度,发现测到的速度与之前iostat看到的速度很接近,说明在集群测试中SSD速度已经达到了瓶颈,阻碍了整体速度上升。
在ceph集群中,SSD作为日志盘,数据写入时先写journal再写数据盘。这就导致了journal盘很容易成为瓶颈点。
优化手段:
对于SSD的优化策略有两个方向,一个是对SSD本身调度方式优化,将SSD盘的调度策略从CFG改为noop,这样能让SSD速度有小幅提升。还有一种方法是直接更换到速度更快的盘。本次测试中更换到速度更快的SSD并修改调度策略,Rados 4M块大小写入速度有大幅提升。
注:不同品牌、容量的SSD读写速度差异巨大,本次使用的SSD为同一品牌的400G、800G两款SSD。800G的产品最大写入速度比400G的产品高一倍,用户需注意选择。
案例2:Rados测试时4k写入时出现掉速现象
现象描述:
在进行Rados 4k块大小写入测试时,速度很不稳定,速度可能长时间掉落到0,导致整体的测试结果很低。
过程分析:
同样的,首先排查网络因素,看是否存在网络抖动。通过Rados 的4k读做对比,4k读时速度很平稳,未出现掉速的情况,从而可以排除网络抖动影响。
随后通过ceph osd perf统计集群中每个OSD的数据落盘时延,发现在出现掉速为0时,会出现某个OSD盘的时延超高,达到秒级。根据ceph的写入流程,首先会向主OSD写入数据,随后向两个副本osd写入数据。当全部副本写入完毕,流程结束。若一个流程阻塞,会阻塞整体的写入。
为了验证是否为磁盘影响,通过blktrace命令分析磁盘一段时间内的读写过程。
- 读写过程中通过blktrace跟踪磁盘调度
blktrace -d /dev/sdg
- 通过blkparse做数据分析
blkparse -i sdg -d test.bin
- 通过btt命令解读结果
btt -i test.bin
上图中I2D表示IO请求等待被处理所消耗的时间,D2C表示IO请求被处理所消耗的时间。从图中看到D2C最大耗时很高,达到0.7s。连带导致I2C处理时间长,造成IO请求长时间等待。
检测结果说明磁盘存在偶发性的处理耗时长的现象,导致ceph 4k写入掉速。
优化手段:
鉴于所使用的的HDD磁盘均为使用年限较长,可能出现驱动异常问题。更换到全新磁盘后,掉速现象消失,测试结果大幅提升。
案例3:Rados测试4k 读取,更换磁盘无提升
现象描述:
在前面的案例中,更换到性能更稳定、速度更快的HDD/SSD,Rados的4M/4K写性能有大幅提升,但Rados的读性能无任何变化。
过程分析:
在进行Rados 4k读测试时,通过iostat跟踪每个OSD磁盘的读写情况。发现读测试时,磁盘活动为0。随后通过blktrace分析磁盘的IO请求,发现不存在磁盘IO。
结合Rados 4k读测试必须在Rados 4k写完成之后进行,判断Rados 4k读直接使用的是缓存中的数据,未从磁盘读取数据。
由于未使用磁盘、网络未成为瓶颈。调优的方向就转向了CPU、内存和操作系统。
优化手段:
- Numa绑核
通过numastat观察发现测试进行过程中存在一定的numa miss,numa绑核可以减少跨numa内存访问,提升访问速度。
ceph节点numa绑核方法:
1) 打开每个ceph节点的osd配置文件/usr/lib/systemd/system/ceph-osd@.service
vim /usr/lib/systemd/system/ceph-osd@.service
2) 在ExecStart选项前添加numactl字段,将osd节点绑定在0~15 CPU核
ExecStart=/usr/bin/ceph-osd -f --cluster ${CLUSTER} --id %i --setuser ceph --setgroup ceph
改为
ExecStart=/usr/local/bin/numactl -C 0-15 /usr/bin/ceph-osd -f --cluster ${CLUSTER} --id %i --setuser ceph --setgroup ceph
3) 重新加载service配置
systemctl daemon-reload
4) 重启所有的ceph-osd service
如:systemctl restart ceph-osd@0
5) 验证:
执行systemctl cat ceph-osd@0,观察ExecStart选项是否有numactl字样
绑核之后,Rados 4k读性能有一定提升。
- 时钟函数优化
通过strace跟踪Rados进程发现,有大量的clock_gettime的函数调用。通过GDB分析其过程,其走的流程为内核的syscall系统调用,未走VDSO加速。通过修改内核中的代码,可以让arm的clock_gettime函数同样走VDSO模式。实测修改后Rados 4k读场景有一定提升。
修改方法:
1) 获取内核源码
2) 屏蔽如下代码
linux-4.14.0-115.el7.0.1.aarch64/drivers/clocksource/arm_arch_timer.c
3) 编译并安装内核
4) 重启生效
参考https://bbs.huaweicloud.com/forum/thread-24362-1-1.html
通过修改时钟函数,Rados 4k读性能有一定的提升。