本文介绍云盘、共享块存储和本地盘的性能衡量指标,性能规格以及性能测试方式。

性能指标

衡量块存储产品的性能指标主要包括IOPS、吞吐量和访问时延。

  • IOPS(Input/Output Operations per Second)

    IOPS指每秒能处理的I/O个数,表示块存储处理读写(输出/输入)的能力,单位为次。如果您需要部署事务密集型应用,例如数据库类应用等典型场景,需要关注IOPS性能。

    常用的IOPS指标包括顺序操作和随机操作,如下表所示。

    指标 描述 数据访问方式
    总IOPS 每秒执行的I/O操作总次数 对硬盘存储位置的不连续访问和连续访问
    随机读IOPS 每秒执行的随机读I/O操作的平均次数 对硬盘存储位置的不连续访问
    随机写IOPS 每秒执行的随机写I/O操作的平均次数
    顺序读IOPS 每秒执行的顺序读I/O操作的平均次数 对硬盘存储位置的连续访问
    顺序写IOPS 每秒执行的顺序写I/O操作的平均次数
  • 吞吐量(Throughput)

    吞吐量是指单位时间内可以成功传输的数据数量,单位为MBps。如果您需要部署大量顺序读写的应用,例如Hadoop离线计算型业务等典型场景,需要关注吞吐量。

  • 访问时延(Latency)
    访问时延是指块存储处理一个I/O需要的时间,单位为s、ms或者μs。过高的时延会导致应用性能下降或报错。
    • 如果您的应用对高时延比较敏感,例如数据库应用,建议您使用ESSD云盘、SSD云盘、SSD共享块存储或本地SSD盘类产品。
    • 如果您的应用偏重数据吞吐能力,对时延相对不太敏感,例如Hadoop离线计算等吞吐密集型应用,建议您使用d1或d1ne大数据型实例规格包含的SATA HDD本地盘产品。
容量无法衡量块存储性能,但对于存储设备而言,不同的容量能达到的性能不同,容量越大,存储设备的数据处理能力越强。相同类型块存储产品的单位容量的I/O性能均一致,但云盘性能随容量增长而线性增长,直至达到该类型块存储的单盘性能上限。
说明 块存储容量按照二进制单位计算,单位为GiB、KiB、TiB或者MiB。二进制单位用于表示1024进位的数据大小。例如,1GiB=1024MiB。

云盘性能

四种类型云盘的性能对比如下表所示。
性能类别 ESSD云盘 SSD云盘 高效云盘 普通云盘***
性能级别(Performance Level,简称PL) PL3 PL2 PL1
单盘最大容量 1261~32768GiB 461~32768GiB 20~32768GiB 32768GiB 32768GiB 2000GiB
最大IOPS 1000000 100000 50000 25000* 5000 数百
最大吞吐量 4000MBps 750MBps 350MBps 300MBps* 140MBps 30−40MBps
单盘性能计算公式** IOPS = min{1800 + 50 * 容量, 1000000} IOPS = min{1800 + 50 * 容量, 100000} IOPS = min{1800 + 50 * 容量, 50000} IOPS = min{1800 + 30 * 容量, 25000} IOPS = min{1800 + 8 * 容量, 5000}
吞吐量 = min{120 + 0.5 * 容量, 4000} MBps 吞吐量 = min{120 + 0.5 * 容量, 750} MBps 吞吐量 = min{120 + 0.5 * 容量, 350} MBps 吞吐量 = min{120 + 0.5 * 容量, 300} MBps 吞吐量 = min{100+ 0.15 * 容量, 140} MBps
数据可靠性 99.9999999% 99.9999999% 99.9999999% 99.9999999% 99.9999999% 99.9999999%
单路随机写访问时延 0.2ms 0.5−2ms 1−3ms 5−10ms
API名称 cloud_essd cloud_ssd cloud_efficiency cloud
应用场景
  • OLTP数据库:如MySQL、PostgreSQL、Oracle、SQL Server等关系型数据库
  • NoSQL数据库:如MongoDB、HBase、Cassandra等非关系型数据库
  • ElasticSearch分布式日志:ELK(Elasticsearch、Logstash和Kibana)日志分析等
对数据可靠性要求高的中小型开发测试环境
  • 开发测试应用
  • 系统盘
  • 数据不被经常访问或者低I/O负载的应用场景
  • 需要低成本并且有随机读写I/O的应用环境

* SSD云盘的性能因数据块大小而异,数据块越小,吞吐量越小,IOPS越高,如下表所示。只有挂载到I/O优化的实例时,SSD云盘才能获得期望的IOPS性能。挂载到非I/O优化的实例时,SSD云盘无法获得期望的IOPS性能。

数据块大小 IOPS最大值 吞吐量
4KiB 约25000 约100MBps
16KiB 约17200 约260MBps
32KiB 约9600 约300MBps
64KiB 约4800 约300MBps

** 单盘性能计算公式说明:

  • 以单块SSD云盘最大IOPS计算公式为例说明:起步1800 IOPS,每GiB增加30 IOPS,最高25000 IOPS。
  • 以单块SSD云盘最大吞吐量计算公式为例说明:起步120MBps,每GiB增加0.5MBps,上限为 300 MBps的吞吐量。

*** 普通云盘属于上一代云盘产品,目前已经逐步停止售卖。请根据业务实际需求,选择高效云盘、SSD云盘、ESSD云盘等其他类型的云盘产品。

共享块存储性能

两种类型共享块存储的性能对比如下表所示。

性能类别 SSD共享块存储 高效共享块存储
单盘最大容量 32768GiB 32768GiB
单台实例最大容量 128TiB 128TiB
最大随机读写IOPS* 30000 5000
最大顺序读写吞吐量* 512MBps 160MBps
单盘性能计算公式** IOPS = min{1600 + 40 * 容量, 30000} IOPS = min{1000 + 6 * 容量, 5000}
吞吐量 = min{100 + 0.5 * 容量, 512} MBps 吞吐量 = min{50 + 0.15 * 容量, 160} MBps
单路访问时延 0.5−2ms 1−3ms
应用场景
  • Oracle RAC
  • 故障转移集群
  • 服务器高可用
服务器高可用架构

* 最大IOPS和吞吐量是在两台或两台以上ECS实例同时压测裸设备能达到的性能数值。

** 单盘性能计算公式说明:

  • 以单块SSD共享块存储最大IOPS计算公式为例:起步1600 IOPS,每GiB增加40 IOPS,最高30000 IOPS。
  • 以单块SSD共享块存储最大吞吐量计算公式为例:起步100MBps,每GiB增加0.5MBps,上限为512MBps的吞吐量。

本地盘性能

本地盘的性能信息,请参见本地盘

性能测试

Linux实例和Windows实例都推荐使用FIO工具进行测试块存储性能。

说明 您也可以使用其他工具测试块存储性能,但不同工具测试出来的硬盘基准性能会有差异,如ddsysbenchiometer等工具可能会受到测试参数配置和文件系统影响,难以反映真实的磁盘性能。本文中所描述的性能参数,均为Linux实例下采用FIO工具的测试结果,以此作为块存储产品性能指标参考。

本文以Linux实例和FIO为例,说明如何使用FIO测试块存储性能。在进行测试前,请确保块存储设备已经4KiB对齐。

警告 测试裸盘可以获得真实的块存储盘性能,但直接测试裸盘会破坏文件系统结构,请在测试前提前做好数据备份。建议您只在新购无数据的ECS实例上使用工具测试块存储性能,避免造成数据丢失。
  • 测试随机写IOPS,运行以下命令:
    fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Write_Testing
  • 测试随机读IOPS,运行以下命令:
    fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Read_Testing
  • 测试顺序写吞吐量,运行以下命令:
    fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Write_PPS_Testing
  • 测试顺序读吞吐量,运行以下命令:
    fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Read_PPS_Testing
  • 测试随机写时延,运行以下命令:
    fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=iotest -name=Rand_Write_Latency_Testing
  • 测试随机读时延,运行以下命令:
    fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=iotest -name=Rand_Read_Latency_Testingrandwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=iotest -name=Rand_Write_Latency_Testing

下表以测试随机写IOPS的命令为例,说明命令中各种参数的含义。

参数 说明
-direct=1 表示测试时忽略I/O缓存,数据直写。
-iodepth=128 表示使用AIO时,同时发出I/O数的上限为128。
-rw=randwrite 表示测试时的读写策略为随机写(random writes)。作其它测试时可以设置为:
  • randread(随机读random reads)
  • read(顺序读sequential reads)
  • write(顺序写sequential writes)
  • randrw(混合随机读写mixed random reads and writes)
-ioengine=libaio 表示测试方式为libaio(Linux AIO,异步I/O)。应用程序使用I/O通常有两种方式:
  • 同步

    同步的I/O一次只能发出一个I/O请求,等待内核完成才返回。这样对于单个线程iodepth总是小于1,但是可以透过多个线程并发执行来解决。通常会用16−32根线程同时工作将iodepth塞满。

  • 异步

    异步的I/O通常使用libaio这样的方式一次提交一批I/O请求,然后等待一批的完成,减少交互的次数,会更有效率。

-bs=4k

表示单次I/O的块文件大小为4KB。未指定该参数时的默认大小也是4KB。

  • 测试IOPS时,建议将bs设置为一个比较小的值,如本示例中的4k。

  • 测试吞吐量时,建议将bs设置为一个较大的值,如本示例中的1024k。

-size=1G 表示测试文件大小为1GiB。
-numjobs=1 表示测试线程数为1。
-runtime=1000 表示测试时间为1000秒。如果未配置,则持续将前述-size指定大小的文件,以每次-bs值为分块大小写完。
-group_reporting 表示测试结果里汇总每个进程的统计信息,而非以不同job汇总展示信息。
-filename=iotest 指定测试文件的名称,例如iotest。测试裸盘可以获得真实的硬盘性能,但直接测试裸盘会破坏文件系统结构,请在测试前提前做好数据备份。
-name=Rand_Write_Testing 表示测试任务名称为Rand_Write_Testing,可以随意设定。