虚拟机存储性能-磁盘篇

前言

存储系统是整个IT系统中性能最薄弱的一个环节,很多时候在做系统调优时会发现大多数情况下短板都在存储。

对存储系统的性能评估一般会从三个方面着手:IOPS(每秒能处理多少IO)、延时(每个IO发出请求后多长时间能完成)、带宽(每秒能处理多大量的数据)。这三个指标相互影响(带宽=IO尺寸*IOPS)有时候甚至相互矛盾,不同应用场景的要求也不一样。例如在数据库环境中,要求IOPS尽量高,延时尽量低,而数据库一般IO尺寸大约在4KB、8KB,所以即使很高的IOPS例如5万,带宽也就约400MB/s,还不到一个SFP的接口带宽;而在大文件处理时,由于IO尺寸很大,所以IOPS并不高,而且这种情况下延时并不敏感,存储系统在处理这种大尺寸IO时,会屏蔽cache,通常延时会表现很大。总体而言,IOPS是用作评估存储系统性能最常用的一个指标。

但是,IOPS很难准确的去评估存储性能,同样系统,在不同的IO大小、读写比例、随机还是顺序、测试时间长短、测试数据大小等都会对测试结果产生很大偏差,特别现在AFA(全闪存阵列)越来越普及,测试时是否导致垃圾回收机制、磁盘累计写入数据量大小等也会带来对结果的影响。所以很多传统存储厂商如EMC等拒绝公布产品的IOPS测试值,而是强调根据用户的实际环境来做性能评估(例如Exchange的jetstress、oracle的orion等)。

Azure也公布了一些存储的性能参数,本文通过对Azure下磁盘进行测试,来实际评估Azure的磁盘性能。

Azure的磁盘存储系统简介

不同于传统的DAS、NAS、SAN分类,Azure对存储的分类是从逻辑上来进行的,很容易弄得用户一头雾水,不知道各种存储到底是干嘛用的。这里,简单的把Azure的存储的适用场景做了一下分类:

Azure存储分类

从分类可以看到,Azure中,用作磁盘(VHD)的存储共有三类:Page Blob、高级存储SSD、托管磁盘(分为标准托管磁盘和高级托管磁盘),而目前托管磁盘在Mooncake还未提供。

下边,我们将分别对这几类磁盘存储进行IOPS测试。

Azure磁盘性能测试

Azure公开发布的磁盘性能IOPS如下:

  • Page Blob的磁盘:500
  • 高级存储(不同容量性能不一样):
    • P10:500
    • P20:2300
    • P30:5000
  • 托管磁盘:
    • 标准托管磁盘:500
    • 高级托管磁盘:5000

此IOPS的标准是IO尺寸为8KB,但并未说明读写比、随机还是顺序等。

为了避免CPU和内存成为瓶颈,本次测试采用DS12_V2 Promo(4Core、28GB RAM)的虚机,操作系统Windows2016 DataCenter:

mark

测试软件为IOMeter:

mark

iometer使用

Azure会给每台虚机分配一个SSD的临时磁盘,但是关机时该盘的数据可能会丢失,所以不建议在该盘存放需要持久化的数据,但是一些临时表空间、页面缓存等,可以使用该盘来加速。在测试虚机里,可以看到一个55.9GB的D盘即改临时盘:

mark

我们首先使用该盘来做iometer的使用测试。

运行iomer,选择Access Specification,可以看到已内置了一些测试模型:

mark

由于Azure公布的IOPS数值是基于8KB的IO,内置模型没有,所以我们要点击New创建一个,先创建一个全读全随机的8K测试模型:

mark

然后点击Add添加到测试项目里:

mark

点击左边列表的Worker 1,并在Disk Target里选择D盘(表示以D盘为测试目标),Maximum Disk Size填入83886080(这里表示测试数据的大小,以Sector为单位,每个Sector为512byte,所以83886080个Sectors表示40GB):

mark

点击上部绿色小旗运行,会弹出窗口指定结果保存的路径和文件名,根据实际需求指定即可:

mark

运行后选择Results Display并将Update Frequency选择1,表示每秒刷新一次结果:

mark

打开资源管理器,可以看到D盘的剩余空间在不断减少,这是iometer在准备测试文件:

mark

测试文件准备完成后,可以看到有结果显示了:

mark

点击Stop,停止测试,重新创建一个模型,将100%读改为100%写:

mark

然后移除前次测试模型,添加全写的测试模型:

mark

因为测试文件已经存在,所以运行后马上就有结果显示:

mark

再分别做100%Sequential下的全读和全写结果如下:

全读:

mark

全写:

mark

总结一下单个worker情况下,临时盘的读写性能IOPS如下:

全读 全写
全随机 4400 8600
全顺序 4400 8300

由于该虚机有4个Core,所以最多有4个worker。以全顺序写为基础测试不同数量worker的影响,结果如下:

1 worker 2 worker 3 worker 4 worker
8300 16300 16500 16500

可以看到,当worker从1个增加到2个时,IOPS基本上 翻了一杯,但数量再增加,就基本不变了。

Page Blob的IOPS测试

HDD Page Blob测试

在虚机的磁盘选项里,可为虚机附加磁盘(可新建也可使用以前创建的,但是一个磁盘不能给两台虚机共享):

mark

选择附加新项,可看到新加磁盘可以是HDD也可以是SDD,现在选择HDD(性能限制为IOPS500,带宽60MB/s),大小最大为1023GB,需要为创建的磁盘选择一个Blob的容器:

mark

进入虚机的Disk Management,会发现多出一块硬盘:

mark

将其分成一个分区并格式化为NTFS,不压缩,资源浏览器里多出一个0.99TB的新分区F:,即附加的新磁盘:

mark

按照上述方式采用一个worker分顺序随机、读写的方式对F:进行测试:

随机读:

mark

随机写:

mark

顺序读:

mark

顺序写:

mark

可以看到,顺序读的时候达IOPS到了标称值500。普通温式硬盘的结构特征导致了随机性能较差。

将worker数量加到4个,再次测试,结果如下:

随机读 随机写 顺序读 顺序写
439 501 503 500

可以看出,如果加大并发数量,可以基本达到Azure宣称的500IOPS。

点击新添加的磁盘,可以看到有一项主机缓存,可以为磁盘提供加速,默认设置为无,可选择只读和读写:

mark

分别将主机缓存设置为只读和读写,进行IOPS测试(1 worker),结果如下:

主机缓存 随机读 随机写 顺序读 顺序写
只读 96 478 1165 480
读写 96 12500 1154 16500

可见,启用缓存后对随机写和顺序读写都有比较好的性能提升,但是对随机读基本没有影响。

Tips

​ 在Azure中,临时盘和磁盘的主机缓存都是用服务器本地的SSD硬盘模拟,属于计算资源。当虚机重新开机或漂移时,服务器上SSD的内容并不会随之迁移到新服务器上,所以临时盘和磁盘的主机缓存里的内容不会持久化。在Azure的最佳实践建议里:

  • 临时盘只用作放置无需落地的数据,例如DB临时表,缓存页面文件里
  • 磁盘的主机缓存不建议打开,除非确实数据无需保护,所以默认情况下HHD Page Blob类型的磁盘主机缓存关闭

SSD Page Blob测试

将现有的HDD Page Blob磁盘卸载,重新建立一个SSD Page Blob的磁盘(1 worker):

mark

注:

  • SSD类型的磁盘需要高级存储账号
    • SSD类型的磁盘大小目前固定为3种:128、512、1023GB,每种磁盘的IOPS也是固定的,分别为:500、2300、5000
    • SSD磁盘主机缓存默认为只读,尽量不要修改

为虚机添加一个1023GB的SSD磁盘,按之前步骤用iometer做8KB数据块的随机和顺序读写测试,结果如下:

随机读 随机写 顺序读 顺序写
5250 539 15900 539

可见随机读可以轻易达到公开值,顺序读由于只读缓存的加速,可达到15900。写的值比较低,下边通过增加worker数量测试

随机写 顺序写
1 worker 539 539
2 worker 1020 1017
3 worker 1478 1477
4 worker 1880 1874

可以看到,随着worker的增加,写的IOPS基本上是线性上升,但是受到Core数量的影响(Demo环境最大只允许4Core),预计12Core的情况下能达到标称的5000IOPS。

为了验证,在Azure.com上建立一台16core的虚机:

mark

添加1023GB的SSD Page Blob磁盘后,同时运行16 worker的8KB随机写,可看到IOPS达到5000:

mark

Managed DIsk的IOPS测试

Mooncake目前没有提供Managed Disk服务,所以使用azure.com来进行测试。

由于Managed Disk作为数据盘只支持附加到OS盘也为Managed Disk的虚机,所以首先要创建一个符合的虚机,该虚机的Size仍采用16Core的虚机,注意建虚机过程中此处选择Yes:

mark

创建完成后创建Managed Disk的数据盘。

登录azure.com,进入compute-Disk:

mark

点击Add添加Disk,选择建立一个空磁盘,分别建立Stand和Premium的DIsk,可以看到IOPS分别为500和5000,并且添加时无需存储账号的选择:

mark

mark

进入新建虚机,选择Disks-Add data disk,添加刚才创建的两个磁盘:

mark

远程桌面到虚机,可以看到增加了两个磁盘,分区并格式化(F盘HDD和G盘SSD):

mark

启用16 worker,对F盘做随机读测试:

mark

按此对F、G两个磁盘分别做随机读写、顺序读写结果如下:

随机读 随机写 顺序读 顺序写
F盘(HDD) 500 501 499 501
G盘(SDD) 5100 5098 5102 5099

总结

本次测试比较仓促,只是简单的对Azure的各种磁盘进行了IOPS方面测试,没有涉及延时带宽等,而且测试时间比较短,没有严格的进行固定时长测试。但从结果还是可以看出:

  • Azure标称的IOPS值都可达到,而且和IO类型无关
  • 很多时候的IO性能差,需要从应用负载去找原因,很有可能是压力不够(例如对HDD,1 worker下,随机读只有不到100,随着worker数量增加,可达到标称值500)
  • 如果单块磁盘的性能不够,需要通过lvm或storage pool方式将多个磁盘组合在一起提升性能
  • 如果使用Page Blob形式的磁盘,不仅单个磁盘受限制,同时存储账户还有20000IOPS的限制,换个角度,就是同一个存储账户里如果大于40块HDD磁盘,或者4块1023GB的SSD磁盘,就会出现IOPS争抢,为了避免这种情况,在系统架构设计时,应把磁盘分散到多个存储账户里(存储账户的数量是免费的)
  • Managed Disk由于不属于存储账户,所以没有这方面的性能限制,如果可能情况下(Mooncake支持),应尽量使用Managed DIsk
  • 主机缓存可以提升磁盘性能,但是也带来了数据安全的隐患,尽可能保持默认设置,不要去改动