第一次接触Ceph集群性能测试时,我踩过一个坑:用单节点fio工具测试RBD性能,结果在生产环境多节点并发访问时,性能直接腰斩。这才明白,分布式存储的性能评估必须模拟真实业务场景。而vdbench正是解决这个痛点的利器。
vdbench作为Oracle开发的存储基准测试工具,相比fio有三个独特优势:
去年我们给某视频平台做Ceph集群扩容前,用vdbench发现了OSD磁盘的尾延迟问题——虽然平均延迟只有3ms,但99分位延迟高达800ms。这个发现让我们及时调整了Crush Map,避免了上线后的卡顿投诉。
测试集群需要满足这些条件:
bash复制# 检查时间同步状态
timedatectl status
bash复制# 生成密钥对
ssh-keygen -t rsa
# 批量配置免密登录
for node in {node1,node2,node3}; do ssh-copy-id $node; done
bash复制firewall-cmd --permanent --add-port=5560-5570/tcp
firewall-cmd --reload
从Oracle官网下载vdbench压缩包后,解压即用。但要注意:
实测中发现个细节:如果测试节点磁盘空间不足,vdbench会静默失败。建议提前检查:
bash复制df -h /path/to/test
先通过裸盘测试摸清单OSD性能天花板。这是我的标准测试模板:
text复制sd=sd1,lun=/dev/sdb,openflag=o_direct
wd=wd1,sd=sd1,seekpct=0,rdpct=0,xfersize=1M
rd=rd1,wd=wd1,iorate=max,warmup=60,elapsed=600,interval=5
关键参数解读:
openflag=o_direct:绕过系统缓存,测真实磁盘性能warmup=60:前60秒数据不计入结果,避免冷盘影响xfersize=1M:模拟视频存储场景的大块写入曾经有客户抱怨测试结果波动大,最后发现是没设warmup——磁盘阵列的缓存策略导致前30秒性能虚高。
集群测试配置文件示例:
text复制hd=default,vdbench=/opt/vdbench,user=ceph,shell=ssh
hd=hd1,system=node1
hd=hd2,system=node2
sd=sd1,hd=hd1,lun=/dev/rbd0
sd=sd2,hd=hd2,lun=/dev/rbd1
wd=wd1,sd=sd*,seekpct=100,rdpct=70,xfersize=4k
rd=rd1,wd=wd1,iorate=max,elapsed=1800,interval=10
踩坑提醒:
skew参数分配权重depth和width,避免产生海量小文件在output/totals.html中重点关注这些数据:
| 指标 | 健康值 | 异常排查 |
|---|---|---|
| resp_time | <10ms | 检查OSD负载和网络延迟 |
| cpu% sys | <30% | 优化内核参数减少系统调用 |
| queue_depth | ≈线程数 | 调整并发线程数量 |
| MB/sec | 接近理论带宽 | 检查网络链路聚合 |
去年遇到一个典型案例:测试显示resp_time高达50ms,但CPU利用率很低。最后发现是客户端网卡的TSO/GRO特性导致,关闭后延迟直接降到3ms。
通过summary.html的interval数据可以分析:
ceph osd perf查看是否有慢盘附赠一个实用命令,实时监控测试期间的OSD状态:
bash复制watch -n 1 'ceph osd perf | sort -nk3'
真实业务往往是读写混合的,推荐这样配置:
text复制wd=wd1,sd=sd*,seekpct=100,rdpct=30,xfersize=4k,skew=70
wd=wd2,sd=sd*,seekpct=0,rdpct=0,xfersize=1M,skew=30
这个配置模拟了:
添加-jn参数启用异步校验,能发现静默数据错误:
bash复制./vdbench -f test_parm -jn
校验原理:每次写入时在数据块中嵌入LBA和校验码,读取时反向验证。曾帮我们发现过硬盘固件bug导致的数据位翻转。
heartbeat issues错误,用chrony同步messagescan=no过滤系统日志rados df确认集群状态健康最难忘的一次是测试中所有节点突然断开,查日志发现是防火墙触发了DoS防护。现在我的检查清单里一定会加上这条:
bash复制systemctl status firewalld