云硬盘性能测试
云硬盘是一种高可用、高可靠、低成本、可定制化的网络块存储,可作为云服务器的独立可扩展硬盘使用。它提供数据块级别的数据存储,采用三副本的分布式机制,为云服务器提供数据可靠性保证。云硬盘提供以下 SSD 云硬盘、高性能云硬盘及普通云硬盘三种云硬盘类型,不同的硬盘类型、性能、特点和价格均不同。
- SSD 云硬盘:SSD 云硬盘是基于全 NVMe SSD 存储介质,采用三副本的分布式机制,提供低时延、高随机 IOPS、高吞吐量的 I/O 能力及数据安全性高达99.9999999%的高性能存储。SSD 云硬盘适用于对 I/O 性能有较高要求的场景。
- 高性能云硬盘:高性能云硬盘是腾讯云推出的混合型存储类型,通过 Cache 机制提供接近固态存储的高性能存储能力,同时采用三副本的分布式机制保障数据可靠性。高性能云硬盘适用于高数据可靠性要求、普通中度性能要求的中小型应用和 MySQL、SQL Server等中小型关系数据库应用的场景。
- 普通云硬盘:普通云硬盘是腾讯云提供的上一代云硬盘类型,适用于数据不经常访问的低 I/O 负载的业务场景。采用磁介质作为存储介质,采用三副本的分布式机制实现高可靠的数据存储。
SSD 云硬盘、高性能云硬盘及普通云硬盘的性能指标分别为:
|
SSD 云硬盘 |
高性能云硬盘 |
普通云硬盘 |
---|---|---|---|
随机 IOPS |
最大随机 IOPS = 1800 + 存储容量(GB)× 30且最大随机 IOPS 不超过26000 |
最大随机 IOPS = 1800 + 存储容量(GB)× 8且最大随机 IOPS 不超过6000 |
提供10GB - 16000GB的规格选择,以及数百随机 IOPS 性能 |
吞吐量(MB/s) |
最大吞吐量 = 120 + 存储容量(GB)× 0.2且最大吞吐量不超过260MB/s |
最大吞吐量 = 100 + 存储容量(GB)× 0.15且最大吞吐量不超过150MB/s |
支持50MB/s的 I/O 吞吐性能 |
时延 |
<3ms |
<4ms |
- |
云硬盘性能测试
由于不同应用程序的工作负载不同,若未提供足够的 I/O 请求来充分利用云硬盘时,可能无法达到云硬盘的最大性能。
一般使用以下指标衡量云硬盘的性能:
- IOPS:每秒读/写次数,单位为次(计数)。存储设备的底层驱动类型决定了不同的 IOPS。
- 吞吐量:每秒的读写数据量,单位为MB/s。
- 时延:I/O 操作的发送时间到接收确认所经过的时间,单位为秒。
测试工具
FIO 是测试磁盘性能的工具,用来对硬件进行压力测试和验证,本文以 FIO 为例。
使用 FIO 时,建议配合使用 libaio 的 I/O 引擎进行测试。请您自行安装 FIO 和 libaio。
警告:
- 请不要在系统盘上进行 FIO 测试,避免损坏系统重要文件。
- 为避免底层文件系统元数据损坏导致数据损坏,请不要在业务数据盘上进行测试。
- 请确保
/etc/fstab
文件配置项中没有被测硬盘的挂载配置,否则将导致云服务器启动失败。
测试对象建议
- 建议在空闲的、未保存重要数据的硬盘上进行 FIO 测试,并在测试完后重新制作被测硬盘的文件系统。
- 测试硬盘性能时,建议直接测试裸数据盘(如 /dev/vdb)。
- 测试文件系统性能时,推荐指定具体文件测试(如 /data/file)。
测试示例
不同场景的测试公式基本一致,只有 rw、iodepth 和 bs(block size)三个参数的区别。例如,每个工作负载适合最佳 iodepth 不同,取决于您的特定应用程序对于 IOPS 和延迟的敏感程度。
参数说明:
参数名 |
说明 |
取值样例 |
---|---|---|
bs |
每次请求的块大小。取值包括4k,8k,16k等。 |
4k |
ioengine |
I/O 引擎。推荐使用 Linux 的异步 I/O 引擎。 |
libaio |
iodepth |
请求的 I/O 队列深度。 |
1 |
direct |
指定 direct 模式。True(1)表示指定 O_DIRECT 标识符,忽略 I/O 缓存,数据直写。False(0)表示不指定 O_DIRECT 标识符。默认为 True(1)。 |
1 |
rw |
读写模式。取值包括顺序读(read)、顺序写(write)、随机读(randread)、随机写(randwrite)、混合随机读写(randrw)和混合顺序读写(rw,readwrite)。 |
read |
time_based |
指定采用时间模式。无需设置该参数值,只要 FIO 基于时间来运行。 |
N/A |
runtime |
指定测试时长,即 FIO 运行时长。 |
600 |
refill_buffers |
FIO 将在每次提交时重新填充 I/O 缓冲区。默认设置是仅在初始时填充并重用该数据。 |
N/A |
norandommap |
在进行随机 I/O 时,FIO 将覆盖文件的每个块。若给出此参数,则将选择新的偏移量而不查看 I/O 历史记录。 |
N/A |
randrepeat |
随机序列是否可重复,True(1)表示随机序列可重复,False(0)表示随机序列不可重复。默认为 True(1)。 |
0 |
group_reporting |
多个 job 并发时,打印整个 group 的统计值。 |
N/A |
name |
job 的名称。 |
fio-read |
size |
I/O 测试的寻址空间。 |
100GB |
filename |
测试对象,即待测试的磁盘设备名称。 |
/dev/sdb |
常见用例如下:
bs = 4k iodepth = 1:随机读/写测试,能反映硬盘的时延性能
执行以下命令,测试硬盘的随机读时延。
fio -bs=4k -ioengine=libaio -iodepth=1 -direct=1 -rw=randread -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randread-lat --size=10G -filename=/dev/vdb
fio -bs=4k -ioengine=libaio -iodepth=1 -direct=1 -rw=randwrite -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randwrite-lat --size=10G -filename=/dev/vdb
fio --bs=4k --ioengine=libaio --iodepth=1 --direct=1 --rw=randrw --time_based --runtime=100 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-read --size=1G --filename=/dev/vdb
bs = 128k iodepth = 32:顺序读/写测试,能反映硬盘的吞吐性能
执行以下命令,测试硬盘的顺序读吞吐带宽。
fio -bs=128k -ioengine=libaio -iodepth=32 -direct=1 -rw=read -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-read-throughput --size=10G -filename=/dev/vdb
执行以下命令,测试硬盘的顺序写吞吐带宽。
fio -bs=128k -ioengine=libaio -iodepth=32 -direct=1 -rw=write -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-write-throughput --size=10G -filename=/dev/vdb
fio -bs=128k -ioengine=libaio -iodepth=32 -direct=1 -rw=write -time_based -runtime=100 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-write-throughput --size=1G -filename=/dev/vdb
bs = 4k iodepth = 32:随机读/写测试,能反映硬盘的 IOPS 性能
执行以下命令,测试硬盘的随机读 IOPS。
fio -bs=4k -ioengine=libaio -iodepth=32 -direct=1 -rw=randread -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randread-iops --size=10G -filename=/dev/vdb
fio -bs=4k -ioengine=libaio -iodepth=32 -direct=1 -rw=randwrite -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randwrite-iops --size=10G -filename=/dev/vdb
测试高性能云硬盘的随机写 IOPS 性能。如下图所示:
fio -bs=4k -ioengine=libaio -iodepth=32-direct=1-rw=randwrite -time_based -runtime=100-refill_buffers -norandommap -randrepeat=0-group_reporting -name=fio-randwrite-iops --size=1G -filename=/dev/vdb
测试结果指标介绍
io= 执行了多少M的IO
bw= 平均IO带宽
iops= IOPS
runt= 线程运行时间
slat 提交延迟
clat 完成延迟
lat响应时间
bw 带宽
cpu利用率
IO depths=io队列
IO submit=单个IO提交要提交的IO数
IO complete= Like the above submit number, but for completions instead.
IO issued= The number of read/write requests issued, and how many
of them were short.
IO latencies=IO完延迟的分布
io= 总共执行了多少size的IO
aggrb= group总带宽
minb= 最小.平均带宽.
maxb= 最大平均带宽.
mint= group中线程的最短运行时间.
maxt= group中线程的最长运行时间.
ios= 所有group总共执行的IO数.
merge= 总共发生的IO合并数.
ticks= Number of ticks we kept the disk busy.
io_queue= 花费在队列上的总共时间.
util= 磁盘利用率