全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
云服务器 ECS

块存储性能

更新时间:2017-12-06 11:51:53

本文描述了块存储性能的重要指标、不同块存储类型的性能、性能测试方式和结果解读。

衡量指标

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

IOPS

IOPS是Input/Output Operations per Second,即每秒能处理的I/O个数,用于表示块存储处理读写(输出/输入)的能力。如果要部署事务密集型应用,需要关注IOPS性能。

最普遍的IOPS性能指标是顺序操作和随机操作,如下表所示。

IOPS性能指标 描述
总 IOPS 每秒执行的I/O操作总次数。
随机读IOPS 每秒执行的随机读I/O操作的平均次数 对磁盘存储位置的不连续访问。
随机写IOPS 每秒执行的随机写I/O操作的平均次数
顺序读IOPS 每秒执行的顺序读I/O操作的平均次数 对磁盘存储位置的连续访问。
顺序写IOPS 每秒执行的顺序写I/O操作的平均次数

吞吐量

吞吐量是指单位时间内可以成功传输的数据数量。

如果要部署大量顺序读写的应用,需要关注吞吐量。

访问时延

访问时延是指块存储处理一个I/O需要的时间。

如果您的应用对时延比较敏感,比如数据库(过高的时延会导致应用报错),建议您使用固态硬盘介质的SSD云盘、SSD共享块存储或本地SSD盘类产品。

如果您的应用更偏重存储吞吐能力,对时延不太敏感,比如Hadoop离线计算等吞吐密集型应用,建议您使用本地HDD盘类产品,如d1或d1ne大数据型实例。

性能

以下是不同块存储产品的性能对比表。

云盘性能

三种云盘的性能对比如下表所示。

参数 SSD云盘 高效云盘 普通云盘
单盘最大容量 32768 GB 32768 GB 2000 GB
最大IOPS 20000* 3000 数百
最大吞吐量 300 MBps* 80 MBps 30−40 MBps
单盘性能计算公式** IOPS = min{1200 + 30 * 容量, 20000} IOPS = min{1000 + 6 * 容量, 3000}
吞吐量 = min{80 + 0.5 * 容量, 300} MBps 吞吐量 = min{50 + 0.1 * 容量, 80} MBps
访问时延 0.5−2 ms 1−3 ms 5−10 ms
数据可靠性 99.9999999% 99.9999999% 99.9999999%
API名称 cloud_ssd cloud_efficiency cloud
典型应用场景
  • PostgreSQL、MySQL、Oracle、SQL Server等中大型关系数据库应用
  • 对数据可靠性要求高的中大型开发测试环境
  • MySQL、SQL Server、PostgreSQL等中小型关系数据库应用
  • 对数据可靠性要求高、中度性能要求的中大型开发测试应用
  • 数据不被经常访问或者低I/O负载的应用场景(如果应用需要更高的I/O性能,建议使用SSD云盘)
  • 需要低成本并且有随机读写I/O的应用环境

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

数据块大小 IOPS最大值 吞吐量
4 KB或8 KB 约20000 很小,远低于300 MBps
16 KB 约17200 将近300 MBps
32 KB 约9600
64 KB 约4800

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

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

共享块存储性能

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

参数 SSD共享块存储 高效共享块存储
最大容量 单盘:32768 GiB
单个实例:最大128 TB
单盘:32768 GiB
单个实例:最大128 TB
最大随机读写IOPS* 30000 5000
最大顺序读写吞吐量* 512 MBps 160 MBps
单盘性能计算公式** IOPS = min{40 * 容量, 30000} IOPS = min{1000 + 6 * 容量, 5000}
吞吐量 = min{50 + 0.5 * 容量, 512} MBps 吞吐量 = min{50 + 0.15 * 容量, 160} MBps
访问时延 0.5 ms 1 ms
典型应用场景
  • Oracle RAC
  • SQL Server
  • 故障转移集群
  • 服务器高可用
  • 服务器高可用架构
  • 开发测试数据库高可用架构

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

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

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

本地存储性能

本地存储的性能信息,请参考 本地存储

性能测试

根据ECS实例的操作系统不同,您可以使用不同的工具测试块存储性能:

  • Linux实例:可以使用DD、fio或sysbench等工具测试块存储性能。
  • Windows实例:可以使用fio、Iometer等工具测试块存储性能。

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

警告
测试裸盘可以获得真实的块存储盘性能,但直接测试裸盘会破坏文件系统结构,请在测试前提前做好数据备份。建议您只在新购无数据的ECS实例上使用工具测试块存储性能,避免造成数据丢失。

  • 测试随机写IOPS,运行以下命令:

    1. 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,运行以下命令:

    1. 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
  • 测试顺序写吞吐量,运行以下命令:

    1. 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
  • 测试顺序读吞吐量,运行以下命令:

    1. 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

下表以测试随机写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塞满。异步则通常使用libaio这样的方式一次提交一批I/O请求,然后等待一批的完成,减少交互的次数,会更有效率。
-bs=4k 表示单次I/O的块文件大小为4k。未指定该参数时的默认大小也是4k。测试IOPS时,建议将bs设置为一个比较小的值,如本示例中的4k。测试吞吐量时,建议将bs设置为一个较大的值,如本示例中的1024k。
-size=1G 表示测试文件大小为1G。
-numjobs=1 表示测试线程数为1。
-runtime=1000 表示测试时间为1000秒。如果未配置,则持续将前述-size指定大小的文件,以每次-bs值为分块大小写完。
-group_reporting 表示测试结果里汇总每个进程的统计信息,而非以不同job汇总展示信息。
-filename=iotest 指定测试文件的名称,比如iotest。测试裸盘可以获得真实的磁盘性能,但直接测试裸盘会破坏文件系统结构,请在测试前提前做好数据备份。
-name=Rand_Write_Testing 表示测试任务名称为Rand_Write_Testing,可以随意设定。

以下以一块800 GB SSD云盘随机读IOPS性能的测试结果为例,说明如何理解fio测试结果。

  1. Rand_Read_Testing: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=128
  2. fio-2.2.8
  3. Starting 1 process
  4. Jobs: 1 (f=1): [r(1)] [21.4% done] [80000KB/0KB/0KB /s] [20.0K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [28.6% done] [80000KB/0KB/0KB /s] [20.0K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [35.7% done] [80000KB/0KB/0KB /s] [20.0K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [42.9% done] [80004KB/0KB/0KB /s] [20.1K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [50.0% done] [80004KB/0KB/0KB /s] [20.1K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [57.1% done] [80000KB/0KB/0KB /s] [20.0K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [64.3% done] [80144KB/0KB/0KB /s] [20.4K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [71.4% done] [80388KB/0KB/0KB /s] [20.1K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [78.6% done] [80232KB/0KB/0KB /s] [20.6K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [85.7% done] [80260KB/0KB/0KB /s] [20.7K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [92.9% done] [80016KB/0KB/0KB /s] [20.4K/0/0 iops] [eta 00Jobs: 1 (f=1): [r(1)] [100.0% done] [80576KB/0KB/0KB /s] [20.2K/0/0 iops] [eta 00m:00s]
  5. Rand_Read_Testing: (groupid=0, jobs=1): err= 0: pid=9845: Tue Sep 26 20:21:01 2017
  6. read : io=1024.0MB, bw=80505KB/s, iops=20126, runt= 13025msec
  7. slat (usec): min=1, max=674, avg= 4.09, stdev= 6.11
  8. clat (usec): min=172, max=82992, avg=6353.90, stdev=19137.18
  9. lat (usec): min=175, max=82994, avg=6358.28, stdev=19137.16
  10. clat percentiles (usec):
  11. | 1.00th=[ 454], 5.00th=[ 668], 10.00th=[ 812], 20.00th=[ 996],
  12. | 30.00th=[ 1128], 40.00th=[ 1256], 50.00th=[ 1368], 60.00th=[ 1480],
  13. | 70.00th=[ 1624], 80.00th=[ 1816], 90.00th=[ 2192], 95.00th=[79360],
  14. | 99.00th=[81408], 99.50th=[81408], 99.90th=[82432], 99.95th=[82432],
  15. | 99.99th=[82432]
  16. bw (KB /s): min=79530, max=81840, per=99.45%, avg=80064.69, stdev=463.90
  17. lat (usec) : 250=0.04%, 500=1.49%, 750=6.08%, 1000=12.81%
  18. lat (msec) : 2=65.86%, 4=6.84%, 10=0.49%, 20=0.04%, 100=6.35%
  19. cpu : usr=3.19%, sys=10.95%, ctx=23746, majf=0, minf=160
  20. IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
  21. submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
  22. complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1%
  23. issued : total=r=262144/w=0/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
  24. latency : target=0, window=0, percentile=100.00%, depth=128
  25. Run status group 0 (all jobs):
  26. READ: io=1024.0MB, aggrb=80504KB/s, minb=80504KB/s, maxb=80504KB/s, mint=13025msec, maxt=13025msec
  27. Disk stats (read/write):
  28. vdb: ios=258422/0, merge=0/0, ticks=1625844/0, in_queue=1625990, util=99.30%

输出结果中,您主要关注以下这行内容:

  1. read : io=1024.0MB, bw=80505KB/s, iops=20126, runt= 13025msec

表示fio做了1 GB I/O,速率约为80 MB/s,总IOPS为20126,运行时间为13秒。由IOPS值可知,该SSD云盘的IOPS性能为 20126,而根据公式计算的数值为:

min{1200+30 * 容量, 20000} = min{1200+30 * 800, 20000} = 20000

测试结果与公式计算结果相近。

本文导读目录