操作前须知(重要)
警告:
本文使用 FIO 作为测试工具,请不要在系统盘上进行 FIO 测试,避免损坏系统重要文件。
为避免底层文件系统元数据损坏导致数据损坏,请不要在业务数据盘上进行测试。请使用测试机器未存放业务数据的云硬盘进行压测,并提前 创建快照 保障您的数据安全。
请确保
/etc/fstab
文件配置项中没有被测硬盘的挂载配置,否则将导致云服务器启动失败。衡量指标
腾讯云提供的块存储设备根据类型的不同拥有不同的性能和价格,详细信息请参见 云硬盘类型。由于不同应用程序的工作负载不同,若未提供足够的 I/O 请求来充分利用云硬盘时,可能无法达到云硬盘的最大性能。
一般使用以下指标衡量云硬盘的性能:
IOPS:每秒读/写次数,单位为次(计数)。存储设备的底层驱动类型决定了不同的 IOPS。
吞吐量:每秒的读写数据量,单位为MB/s。
时延:I/O 操作的发送时间到接收确认所经过的时间,单位为微秒。
测试工具
FIO 是测试磁盘性能的工具,用来对硬件进行压力测试和验证,本文以 FIO 为例。
使用 FIO 时,建议配合使用 libaio 的 I/O 引擎进行测试。请参见 工具安装 完成 FIO 和 libaio 的安装。
测试对象建议
建议在空闲的、未保存重要数据的硬盘上进行 FIO 测试,并在测试完后重新制作被测硬盘的文件系统。
测试硬盘性能时,建议直接测试裸数据盘(如 /dev/vdb)。
测试文件系统性能时,推荐指定具体文件测试(如 /data/file)。
工具安装
1. 参见 使用标准登录方式登录 Linux 实例(推荐) 登录云服务器,本文以 CentOS 7.6 操作系统的云服务器为例。
2. 执行以下命令,查看云硬盘是否4KiB对齐。
fdisk -lu
如下图所示,若返回结果中的 Start 值能被8整除即是4KiB对齐。否则请完成4KiB对齐后再进行测试。


3. 依次执行以下命令,安装测试工具 FIO 和 libaio。
yum install libaio -y
yum install libaio-devel -y
yum install fio -y
安装完成后,请参见测试示例开始云硬盘性能测试。
测试示例
不同场景的测试公式基本一致,只有 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 |
read | 读写模式。取值包括顺序读(read)、顺序写(write)、随机读(randread)、随机写(randwrite)、混合随机读写(randrw)和混合顺序读写(rw,readwrite)。 | read |
time_based | 指定采用时间模式。无需设置该参数值,只要 FIO 基于时间来运行。 | N/A |
runtime | 指定测试时长,即 FIO 运行时长。 | 100s |
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 测试的寻址空间。 | 1G |
filename | 测试对象,即待测试的磁盘设备名称。 | /dev/sdb |
numjobs | 并发线程数,默认为1。当被测试硬盘性能较高时推荐加大numjobs数(如2或4等)以增加压力。 | 1 |
常见用例如下:
bs = 4k iodepth = 1:随机读/写测试,能反映硬盘的时延性能
警告:
请不要在系统盘上进行 FIO 测试,避免损坏系统重要文件。
为避免底层文件系统元数据损坏导致数据损坏,请不要在业务数据盘上进行测试。请使用测试机器未存放业务数据的云硬盘进行压测,并提前 创建快照 保障您的数据安全。
注意:
执行命令前请务必做好快照。
执行以下命令,测试硬盘的随机写时延(此处测试对象是名为 /dev/vdb 的设备)。
fio -bs=4k -ioengine=libaio -iodepth=1 -numjobs=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
执行以下命令,测试硬盘的随机读时延(此处测试对象是名为 /dev/vdb 的设备)。
fio -bs=4k -ioengine=libaio -iodepth=1 -numjobs=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
执行以下命令,测试硬盘的随机混合读写时延(此处测试对象是名为 /dev/vdb 的设备)。
fio -bs=4k -ioengine=libaio -iodepth=1 -numjobs=1 -direct=1 -rw=randrw -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randread-lat -size=10G -filename=/dev/vdb
示例:
登录云服务器后,执行以下命令,测试设备名为 /dev/vdc 的 SSD 云硬盘的随机混合读写时延性能。
fio -bs=4k -ioengine=libaio -iodepth=1 -numjobs=1 -direct=1 -rw=randrw -time_based -runtime=100 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randrw-lat -size=1G -filename=/dev/vdc
测试结果如下图所示:


bs = 128k iodepth = 32:顺序读/写测试,能反映硬盘的吞吐性能
警告:
请不要在系统盘上进行 FIO 测试,避免损坏系统重要文件。
为避免底层文件系统元数据损坏导致数据损坏,请不要在业务数据盘上进行测试。请使用测试机器未存放业务数据的云硬盘进行压测,并提前 创建快照 保障您的数据安全。
注意:
执行命令前请务必做好快照。
执行以下命令,测试硬盘的顺序读吞吐带宽(此处测试对象是名为 /dev/vdb 的设备)。
fio -bs=128k -ioengine=libaio -iodepth=32 -numjobs=1 -direct=1 -rw=read -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-read-throughput -size=10G -filename=/dev/vdb
执行以下命令,测试硬盘的顺序写吞吐带宽(此处测试对象是名为 /dev/vdb 的设备)。
fio -bs=128k -ioengine=libaio -iodepth=32 -numjobs=1 -direct=1 -rw=write -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-write-throughput -size=10G -filename=/dev/vdb
执行以下命令,测试硬盘的顺序混合读写吞吐带宽(此处测试对象是名为 /dev/vdb 的设备)。
fio -bs=128k -ioengine=libaio -iodepth=32 -numjobs=1 -direct=1 -rw=rw -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-rw-throughput -size=10G -filename=/dev/vdb
示例:
登录云服务器后,执行以下命令,测试设备名为 /dev/vdc 的 SSD 云硬盘的顺序读吞吐性能。
fio -bs=128k -ioengine=libaio -iodepth=32 -numjobs=1 -direct=1 -rw=read -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-read-throughput -size=10G -filename=/dev/vdc
测试结果如下图所示:

bs = 4k iodepth = 32:随机读/写测试,能反映硬盘的 IOPS 性能
警告:
请不要在系统盘上进行 FIO 测试,避免损坏系统重要文件。
为避免底层文件系统元数据损坏导致数据损坏,请不要在业务数据盘上进行测试。请使用测试机器未存放业务数据的云硬盘进行压测,并提前 创建快照 保障您的数据安全。
注意:
执行命令前请务必做好快照。
执行以下命令,测试硬盘的随机读 IOPS(此处测试对象是名为 /dev/vdb 的设备)。
fio -bs=4k -ioengine=libaio -iodepth=32 -numjobs=4 -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(此处测试对象是名为 /dev/vdb 的设备)。
fio -bs=4k -ioengine=libaio -iodepth=32 -numjobs=4 -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(此处测试对象是名为 /dev/vdb 的设备)。
fio -bs=4k -ioengine=libaio -iodepth=32 -numjobs=4 -direct=1 -rw=randrw -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randrw-iops -size=10G -filename=/dev/vdb
示例:
登录云服务器后,执行以下命令,测试设备名为 /dev/vdc 的 SSD 云硬盘的随机读 IOPS 性能。
fio -bs=4k -ioengine=libaio -iodepth=32 -numjobs=4 -direct=1 -rw=randread -time_based -runtime=600 -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randread-iops -size=10G -filename=/dev/vdc
测试结果如下图所示:

