1 云硬盘性能指标
云硬盘性能的主要指标包括:
- IOPS:云硬盘每秒进行读写的操作次数。
- 吞吐量:云硬盘每秒成功传送的数据量,即读取和写入的数据量。
- IO读写时延:云硬盘连续两次进行读写操作所需要的最小时间间隔。
公有云数据,仅供参考:
参数 | 普通IO | 高IO | 通用型SSD |
单个云硬盘的最大IOPS | 2000 | 5000 | 20000 |
单个云硬盘的基线IOPS | 300 | 1800 | 1500 |
每GB云硬盘的IOPS | 2 | 8 | 8 |
云硬盘IOPS计算公式 | min (2000, 300 + 2 × 容量) | min (5000, 1800 + 8 × 容量) | min (20000, 1500 + 8 × 容量) |
单个云硬盘最大吞吐量(MB/s) | 150 | 200 | 250 |
单个云硬盘的基线吞吐量(MB/s) | 100 | 130 | 100 |
每GB云硬盘的吞吐量(MB/s) | 0.1 | 0.1 | 0.5 |
云硬盘吞吐量计算公式(MB/s) | min (150, 100 + 0.1 × 容量) | min (200, 130 + 0.1 × 容量) | min (250, 100 + 0.5 × 容量) |
单队列访问时延(ms) | 5~ 10 | 1~ 3 | 1 |
与云硬盘性能相关的因素:
- 环境因素:硬盘类型、组网、服务器配置等。
- 云硬盘的容量:云硬盘的性能与容量相关,在一定的容量范围内,性能是随着容量线性增长的,达到最大后,无法再增长,见云硬盘IOPS计算公式、云硬盘吞吐量计算公式。
- 业务模型:对于小数据块,例如4KB和8KB,一定并发场景下,性能可达到最大IOPS;对于≥16KB的大数据块,性能可达到最大吞吐量;所以测试不同性能指标需要使用不同的业务模型。
2 云硬盘性能测试方法
2.1 工具安装
需要在虚拟机上安装工具,使用工具对数据盘进行读写性能测试,Windows场景通常使用IOmeter工具,Linux场景通常使用FIO工具,下面以Linux使用FIO工具场景为例。
2.2 常用参数
详细参数可在网上查资料,这里只列出基本参数:
参数名 | 参数说明 | 参数取值 |
ioengine | IO引擎,及发起IO的方式 | sync、libaio、solarisaio、windowsaio等,linux下性能测试通常使用libaio(Linux专有的异步IO) |
direct | 是否使用机器自带的buffer | bool类型,默认为0,设置为1时绕过机器自带的buffer,使测试结果更真实。 |
filename | 测试文件名称,通常选择需要测试的盘的data目录 | 如/dev/vdb |
rw | IO类型 | read 顺序读 write 顺序写 randwrite 随机写 randread 随机读 rw,readwrite 顺序混合读写 randrw 随机混合读写 |
rwmixread | 混合读写中,读占的百分比 | int类型,比如rwmixread=70,则读写比例为7:3 |
bs | 单次io的块文件大小,单次io的块文件大小 | 可以是一个值,如4k,也可以是一个范围 |
size | 将会读/写多少数据 | 可以是一个容量值,如1g,也可以是百分比,如100% |
numjobs | 线程数,即启动多个并行任务 | int类型,默认为1 |
iodepth | IO深度,即一次性提交几个IO | int类型,默认为1 |
thread | 使用pthread_create来创建线程 | bool类型,默认为0 |
runtime | 运行时长 | int类型,单位s,如果不设置,则将文件/盘读写完为止 |
time_based | 如果设置的话,即使file已被完全读写或写完,也要执行完runtime规定的时间。 | N/A |
ramp_time | 记录性能信息前的等待时间,防止前期性能不稳定。 | int类型,单位s |
group_reporting | 打印group的统计值,而不是一个单独的job | N/A |
log_avg_msec | fio每完成一个IO将会记录一个日志(iops,latency,bw log)。当向磁盘写日志的时候,将会很快变的很大。设置这个选项的话,fio将会在一定的时期内平均这些值,指少日志的数量 | int类型,默认为0,建议设置为50 |
2.3 运行方法
运行方式1:命令行
4k随机写:
fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/vdc -name=Rand_Write_IOPS_Test
1M顺序写:
fio -direct=1 -iodepth=32 -rw=write -ioengine=libaio -bs=1024k -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/dev/vdc -name=Write_BandWidth_Test
运行方式2:配置文件
1、vim Rand_Write_IOPS_Test 编写一个测试文件,文件内容示例如下:
[global]
ioengine=libaio
direct=1
thread=1
runtime=300
ramp_time=10
filename=/dev/vdb
bs=4k
size=100%
numjobs=1
iodepth=128
group_reporting
time_based
log_avg_msec=50
rw=randwrite
2、执行命令,启动fio任务 fio Rand_Write_IOPS_Test 3、可以编写多个测试文件,运行shell脚本串行执行多个测试文件,如tesh.sh编写如下内容:
#!/bin/bash
a=1
while (( $a <= 10 ))
do
fio $a >> result_$a.txt 2>&1
let "a++"
sleep 30
done
即串行执行1~10这10个测试文件,每个测试文件结果输出到result_$a.txt文件。
2.4 报告详解
-----------------------------------
BS 4KB read test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
fio-3.7
Starting 1 thread
Jobs: 1 (f=1): [R(1)][100.0%][r=89.4MiB/s,w=0KiB/s][r=23.9k,w=0 IOPS][eta 00m:00s]
BS 4KB read test: (groupid=0, jobs=1): err= 0: pid=18957: Thu Apr 13 14:08:11 2022
read: IOPS=22.7k, BW=88.5MiB/s (92.8MB/s)(5313MiB/60001msec) //关键数据:读IOPS、吞吐量,如果存在写,也会列出数据write: ……
slat (nsec): min=901, max=168330, avg=6932.34, stdev=1348.82
clat (usec): min=90, max=63760, avg=698.08, stdev=240.83
lat (usec): min=97, max=63762, avg=705.17, stdev=240.81 //关键数据:时延(响应时间)
clat percentiles (usec): //clat (提交延时)的排名分布
| 1.00th=[ 619], 5.00th=[ 627], 10.00th=[ 627], 20.00th=[ 635],
| 30.00th=[ 635], 40.00th=[ 685], 50.00th=[ 717], 60.00th=[ 725],
| 70.00th=[ 725], 80.00th=[ 725], 90.00th=[ 734], 95.00th=[ 816],
| 99.00th=[ 1004], 99.50th=[ 1020], 99.90th=[ 1057], 99.95th=[ 1057],
| 99.99th=[ 1860]
bw ( KiB/s): min=62144, max=91552, per=100.00%, avg=90669.02, stdev=3533.77, samples=120
iops : min=15536, max=22888, avg=22667.27, stdev=883.44, samples=120
lat (usec) : 100=0.01%, 250=0.01%, 500=0.01%, 750=93.85%, 1000=5.14%
lat (msec) : 2=0.99%, 4=0.01%, 10=0.01%, 50=0.01%, 100=0.01%
cpu : usr=5.35%, sys=23.17%, ctx=1359692, majf=0, minf=17
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=1360097,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=16
Run status group 0 (all jobs):
READ: bw=88.5MiB/s (92.8MB/s), 88.5MiB/s-88.5MiB/s (92.8MB/s-92.8MB/s), io=5313MiB (5571MB), run=60001-60001msec
Disk stats (read/write):
sda: ios=1357472/0, merge=70/0, ticks=949141/0, in_queue=948776, util=99.88% //磁盘利用率等信息
-----------------------------------
2.5 注意事项
1、默认开启了硬盘限速,如果取消限速或提高限速阈值,性能优于第1章节所列性能数据;
2、为了达到稳定的性能结果,测试性能数据前需要先预埋数据,可用1M大小的IO对预测试的数据盘顺序写一遍,参考命令:
fio -direct=1 -iodepth=32 -rw=write -ioengine=libaio -bs=1024k -size=100% -numjobs=1 -group_reporting -filename=/dev/vdc -name=yumai
3、同一集群下如果并行访问数据盘,性能会互相影响,所以如果要测最大性能,建议集群内无其他业务,且串行执行测试场景;