压测要先定义问题
存储压测最容易滑向「跑个分」:数字很大,但没人知道它对应哪种业务。有效方案从问题出发——是要验证验收指标、比较两套配置、还是为容量规划取数。问题不同,负载模型与判读方式都不同。设计时还要明确缓存与数据集规模:数据集如果明显小于缓存,测出来的其实是内存速度;数据集远大于业务常态,则又会夸大介质压力。
基本信息
| 设计要素 | 目标问题、负载模型、数据集规模与冷热、时长与稳态、指标口径、对照基线 |
|---|---|
| 负载维度 | 读写比例、块大小、随机与顺序、队列深度与并发数、访问热点分布 |
| 采集要求 | 稳态区间内的平均值与分位数,必须包含 P99 及以上 |
| 环境要求 | 尽量减少其他负载干扰,明确缓存与预热状态并写入报告 |
| 判读方式 | 找稳态平台与拐点,而不是取瞬时峰值 |
| 副作用 | 压测会真实写入数据、消耗介质寿命并占用精简置备与快照空间 |
典型使用场景
- 新阵列或新链条上线验收,需要验证是否达到设计指标时
- 选型对比,需要在同一负载模型下比较两套方案时
- 调优前后对比,需要排除负载差异带来的干扰时
- 为容量规划取数,需要知道单卷或单位容量能承载多少业务时
- 排查性能争议,需要一套可复现的测量方法时
两类典型负载模型
两类典型负载模型
# 小随机写密集(数据库类):4K 随机读、高队列深度、直接 IO
fio --name=oltp --rw=randread --bs=4k --iodepth=32 --numjobs=4 \
--runtime=300 --ramp_time=60 --direct=1 --group_reporting \
--percentile_list=50:99:99.9 --filename=/data/test.bin
# 顺序大块读(备份扫描类):1M 顺序读,观察带宽上限
fio --name=scan --rw=read --bs=1M --iodepth=8 --runtime=300 \
--direct=1 --filename=/data/big.bin
# 混合读写最贴近真实业务:按业务实测比例设置 rwmixread
fio --name=mix --rw=randrw --rwmixread=70 --bs=8k --iodepth=16 \
--runtime=300 --direct=1 --filename=/data/mix.bin负载维度与业务对应
| 维度 | 业务含义 | 设置思路 |
|---|---|---|
| 块大小 | 访问粒度 | 按业务实际读写粒度设置,别只测最大吞吐口径 |
| 随机度 | 寻道压力 | 数据库类偏随机,备份与媒体类偏顺序 |
| 队列深度 | 并发压力 | 按实际并发或应用线程数估算,过高只反映排队 |
| 数据集规模 | 缓存命中比例 | 需大于缓存容量,否则测的是缓存不是介质 |
压测报告中必须写明负载模型、缓存与预热状态、采样时段三项。缺少任一条件的数据,无法与其他结果比较,也无法支撑容量规划。
在生产存储上压测会真实占用精简置备池与快照空间,并消耗介质寿命。开工前要评估空间、性能影响与清理方案,测试文件用完及时删除并确认空间回收。