Skip to main content

如何衡量云硬盘的性能

衡量指标

由于不同应用程序的工作负载不同,若未提供足够的 I/O 请求来充分利用云硬盘,可能无法达到云硬盘的最大性能。

一般使用以下指标衡量云硬盘的性能:

  • IOPS:每秒读/写次数,单位为次(计数)。存储设备的底层驱动类型决定了不同的 IOPS。
  • 吞吐量:每秒的读写数据量,单位为 MB/s。
  • 时延:I/O 操作的发送时间到接收确认所经过的时间,单位为秒。

测试工具

FIO 是测试磁盘性能的工具,用来对硬件进行压力测试和验证,本文以 FIO 为例。

使用 FIO 时,建议配合使用 libaio 的 I/O 引擎进行测试。请您自行安装 FIO 和 libaio。

警告:

  • 请不要在系统盘上进行 FIO 测试,避免损坏系统重要文件。
  • 为避免底层文件系统元数据损坏导致数据损坏,请不要在业务数据盘上进行测试。
  • 请确保 /etc/fstab 文件配置项中 没有 被测硬盘的挂载配置,否则将导致云服务器启动失败。

测试对象建议

  • 建议在空闲的、未保存重要数据的硬盘上进行 FIO 测试,并在测试完后重新制作被测硬盘的文件系统。
  • 测试硬盘性能时,建议直接测试裸数据盘(如 /dev/vdb)。
  • 测试文件系统性能时,推荐指定具体文件测试(如 /data/file)。

测试示例

不同场景的测试公式基本一致,只有 rwiodepthbs(block size)三个参数的区别。例如,每个工作负载适合最佳 iodepth 不同,取决于您的特定应用程序对于 IOPS 和延迟的敏感程度。

参数说明

参数名说明取值样例
bs每次请求的块大小。取值包括 4k,8k,16k 等。4k
ioengineI/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_buffersFIO 将在每次提交时重新填充 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
namejob 的名称。fio-read
sizeI/O 测试的寻址空间。100GB
filename测试对象,即待测试的磁盘设备名称。/dev/sdb

常见用例

随机读/写测试(反映硬盘的时延性能)

  • 随机读时延
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

测试结果如下图所示:

img

顺序读/写测试(反映硬盘的吞吐性能)

  • 顺序读吞吐带宽
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 -rw --size=1G --filename=/dev/vdb

测试结果如下图所示:

img

随机读/写测试(反映硬盘的 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
  • 随机写 IOPS
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

测试 SSD 云硬盘的随机读 IOPS 性能。如下图所示:

img