前言
存储系统是整个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中,用作磁盘(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:
测试软件为IOMeter:
iometer使用
Azure会给每台虚机分配一个SSD的临时磁盘,但是关机时该盘的数据可能会丢失,所以不建议在该盘存放需要持久化的数据,但是一些临时表空间、页面缓存等,可以使用该盘来加速。在测试虚机里,可以看到一个55.9GB的D盘即改临时盘:
我们首先使用该盘来做iometer的使用测试。
运行iomer,选择Access Specification,可以看到已内置了一些测试模型:
由于Azure公布的IOPS数值是基于8KB的IO,内置模型没有,所以我们要点击New创建一个,先创建一个全读全随机的8K测试模型:
然后点击Add添加到测试项目里:
点击左边列表的Worker 1,并在Disk Target里选择D盘(表示以D盘为测试目标),Maximum Disk Size填入83886080(这里表示测试数据的大小,以Sector为单位,每个Sector为512byte,所以83886080个Sectors表示40GB):
点击上部绿色小旗运行,会弹出窗口指定结果保存的路径和文件名,根据实际需求指定即可:
运行后选择Results Display并将Update Frequency选择1,表示每秒刷新一次结果:
打开资源管理器,可以看到D盘的剩余空间在不断减少,这是iometer在准备测试文件:
测试文件准备完成后,可以看到有结果显示了:
点击Stop,停止测试,重新创建一个模型,将100%读改为100%写:
然后移除前次测试模型,添加全写的测试模型:
因为测试文件已经存在,所以运行后马上就有结果显示:
再分别做100%Sequential下的全读和全写结果如下:
全读:
全写:
总结一下单个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测试
在虚机的磁盘选项里,可为虚机附加磁盘(可新建也可使用以前创建的,但是一个磁盘不能给两台虚机共享):
选择附加新项,可看到新加磁盘可以是HDD也可以是SDD,现在选择HDD(性能限制为IOPS500,带宽60MB/s),大小最大为1023GB,需要为创建的磁盘选择一个Blob的容器:
进入虚机的Disk Management,会发现多出一块硬盘:
将其分成一个分区并格式化为NTFS,不压缩,资源浏览器里多出一个0.99TB的新分区F:,即附加的新磁盘:
按照上述方式采用一个worker分顺序随机、读写的方式对F:进行测试:
随机读:
随机写:
顺序读:
顺序写:
可以看到,顺序读的时候达IOPS到了标称值500。普通温式硬盘的结构特征导致了随机性能较差。
将worker数量加到4个,再次测试,结果如下:
随机读 | 随机写 | 顺序读 | 顺序写 |
---|---|---|---|
439 | 501 | 503 | 500 |
可以看出,如果加大并发数量,可以基本达到Azure宣称的500IOPS。
点击新添加的磁盘,可以看到有一项主机缓存,可以为磁盘提供加速,默认设置为无,可选择只读和读写:
分别将主机缓存设置为只读和读写,进行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):
注:
- 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的虚机:
添加1023GB的SSD Page Blob磁盘后,同时运行16 worker的8KB随机写,可看到IOPS达到5000:
Managed DIsk的IOPS测试
Mooncake目前没有提供Managed Disk服务,所以使用azure.com来进行测试。
由于Managed Disk作为数据盘只支持附加到OS盘也为Managed Disk的虚机,所以首先要创建一个符合的虚机,该虚机的Size仍采用16Core的虚机,注意建虚机过程中此处选择Yes:
创建完成后创建Managed Disk的数据盘。
登录azure.com,进入compute-Disk:
点击Add添加Disk,选择建立一个空磁盘,分别建立Stand和Premium的DIsk,可以看到IOPS分别为500和5000,并且添加时无需存储账号的选择:
进入新建虚机,选择Disks-Add data disk,添加刚才创建的两个磁盘:
远程桌面到虚机,可以看到增加了两个磁盘,分区并格式化(F盘HDD和G盘SSD):
启用16 worker,对F盘做随机读测试:
按此对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
- 主机缓存可以提升磁盘性能,但是也带来了数据安全的隐患,尽可能保持默认设置,不要去改动