如何对Azure磁盘性能进行测试

Azure的云存储一直是Azure比较自豪的东西,想到AWS的LSA后面有若干个9,搞得大家都以为它的存储最优秀,其实不然,Azure存储到现在没有丢过客户1bit的数据,但是Azure不会去说我们的LSA是100%,因为是自找麻烦,但是实际上无论从performance还是可靠性,Azure的普通存储或者SSD都是很优越的,口说无凭,必须让事实来说话,就是这么自信,好了,不废话了,直接进入主题。

本次测试中,笔者特地去GitHub上搜索了一下,排名第一的是cxcv/iops,所以本次测试我们选用该工具进行测试,在这里笔者说一下,我知道很多人喜欢用DD测试,但我个人并不推崇DD测试,这是DD测试的原理造成的,只能提供一个大概的结果,而且是连续IO而不是随机IO,理论上是文件越大,测试结果越准确,bs是io一次读的规模,理论上是bs越大,测试的性能越高,count为读了多少个bs,这就是DD测试的大致原理,但总感觉有失偏颇,还有很多人在测试的时候,会去测试虚拟机的C盘,我要提醒大家一句,C盘是vm的系统盘,并不适合进行大规模的读写测试,所以很多人问笔者,你们Azure的C盘IO性能好差啊,连普通磁盘的性能都不如,其实这么说是不对的,Azure的C盘是人为进行设定过的,是不支持大规模的读写测试的,但是笔者曾经测试过Azure的D盘,性能却非常优秀,但是D盘只是临时盘,所以笔者不建议将数据放在临时盘,以免丢失。

首先,说一下本次poc环境,先在中国东部起一台vm,如果有读者想测SSD磁盘的性能,笔者的建议是建一台DS系列的虚拟机,然后用DS系列挂载SSD磁盘,测试SSD磁盘(A系列的VM是不支持挂载SSD的),测试完成以后删除附加的SSD,我们将DS虚拟机降为A系列虚拟机,再挂载普通的HDD磁盘,进行测试,有读者不禁会问,那我可以先建一台A系列机,然后再升成DS系列虚拟机,其实真的是这样嘛?使用过Azure的人会发现有时候A系列虚拟机并不能升成DS系列,这是什么原因呢,在这里笔者先卖个关子,会在后续的博文中单独开一章来讲Azure的底层架构中再详细介绍,在本篇博文重点展示方法论,所以只测试HDD磁盘性能

虚拟机的建立这里不再介绍,如果有不会的读者可以自行百度或者翻看我前面的博文,结果如下

 接下给该台虚拟机附加磁盘

点击确定就可以了

这里笔者想说一句,我们看到了IOPS最大为500,吞吐量最大为60MB/s,但是实测结果会有点偏差,有读者不禁会问,你还没测你怎么会知道,废话,我当然测试过了,不然就来写博客了?开个玩笑,还有一个重要的要点大家记得,就是测试的时候,记得关闭主机缓存,很多人不理解,是这样的,开了主机缓存在测试的时候它首先会查找上次的读写的数据源,如果能hit到性能提升,如果hit不到性能下降,所以笔者的建议是在测试的时候关闭,保证测试结果准确性。

SSH登陆虚拟机,输入sudo ls /dev 看到如下结果

sda为虚拟机系统盘,sdb为虚拟机临时盘,sdc为刚刚附加的磁盘

输入sudo fdisk -l 看到如下结果

磁盘容量为1TB

输入sudo fdisk /dev/sdc看到如下结果

输入p

按照步骤完成以下操作

这样,磁盘就被分好区了,这里为了操作简单,只有一个主分区

接下来格式化磁盘,用mkfs.ext4前,先看一下帮助文件

输入man mkfs.ext4,按空格找到lazy,看到如下截图

输入如下命令进行快速格式化

[yangyang@pocvm ~]$ sudo mkfs.ext4 -E lazy_itable_init /dev/sdc1

看到如下结果

我们发现1TB的硬盘瞬间就格式化完成

接下来我们挂载磁盘,看到如下结果说明磁盘挂载成功

[yangyang@pocvm ~]$ sudo mkdir /1T
[yangyang@pocvm ~]$ sudo  mount /dev/sdc1 /1T
[yangyang@pocvm ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        30G  1.1G   29G   4% /
devtmpfs        829M     0  829M   0% /dev
tmpfs           839M     0  839M   0% /dev/shm
tmpfs           839M  8.3M  831M   1% /run
tmpfs           839M     0  839M   0% /sys/fs/cgroup
/dev/sdb1        69G   53M   66G   1% /mnt/resource
tmpfs           168M     0  168M   0% /run/user/1000
/dev/sdc1      1007G   77M  956G   1% /1T
[yangyang@pocvm ~]$ sudo  mount /dev/sdc1 /1T

 接下来我们开始测试iops,使用cxcv/iops

安装该pyton程序,代码链接

输入vim iops.py  将代码复制进去并保存

修改该文件权限,不然不具备可执行权限

[yangyang@pocvm ~]$ chmod 755 iops.py 
[yangyang@pocvm ~]$ ll
total 12
-rwxr-xr-x. 1 yangyang yangyang 10104 Dec 12 06:19 iops.py
[yangyang@pocvm ~]$ sudo ./iops.py /dev/sdc1
/dev/sdc1,   1.10 T, sectorsize=512B, #threads=32, pattern=random:
 512  B blocks:  729.3 IO/s, 373.4 kB/s (  3.0 Mbit/s)
   1 kB blocks:  405.3 IO/s, 415.1 kB/s (  3.3 Mbit/s)
   2 kB blocks:  336.6 IO/s, 689.3 kB/s (  5.5 Mbit/s)
   4 kB blocks:  243.7 IO/s, 998.3 kB/s (  8.0 Mbit/s)
   8 kB blocks:  246.4 IO/s,   2.0 MB/s ( 16.2 Mbit/s)
  16 kB blocks:  253.7 IO/s,   4.2 MB/s ( 33.3 Mbit/s)
  32 kB blocks:  241.1 IO/s,   7.9 MB/s ( 63.2 Mbit/s)
  65 kB blocks:  177.4 IO/s,  11.6 MB/s ( 93.0 Mbit/s)
 131 kB blocks:  102.3 IO/s,  13.4 MB/s (107.3 Mbit/s)
 262 kB blocks:  105.0 IO/s,  27.5 MB/s (220.3 Mbit/s)
 524 kB blocks:   69.0 IO/s,  36.2 MB/s (289.5 Mbit/s)
   1 MB blocks:   35.7 IO/s,  37.4 MB/s (299.6 Mbit/s)
   2 MB blocks:   21.8 IO/s,  45.7 MB/s (365.3 Mbit/s)
   4 MB blocks:   11.1 IO/s,  46.4 MB/s (371.5 Mbit/s)
   8 MB blocks:    9.7 IO/s,  81.5 MB/s (651.8 Mbit/s)
  16 MB blocks:    4.9 IO/s,  82.7 MB/s (661.5 Mbit/s)
[yangyang@pocvm ~]$ 

我们可以看到iops峰值可以达到700+,吞吐量可以达到80+,说明azure普通磁盘的性能还是非常优秀的,但是每次测试结果可能会有点偏差,但是基本能保持稳定

接下来我们换成另一个测试工具,就是大家都喜欢的fio,我们可以直接到官网上去下载,这里下载的版本为fio-2.1.10 然后通过SSH将压缩包上传上去,关于如何通过SSH上传本地文件,这里就不再赘述,如果有不会的读者自行百度,当然你也可以通过安装epel源来安装fio。

接下来输入

[yangyang@pocvm ~]$ sudo tar -zxvf  fio-2.1.10.tar.gz
[yangyang@pocvm ~]$ sudo cd /home/yangyang/fio-2.1.10
[yangyang@pocvm ~]$ sudo make
[yangyang@pocvm ~]$ sudo make install
[yangyang@pocvm ~]$ sudo cd /usr/local/bin
[yangyang@pocvm ~]$ ls

看到如下结果,说明安装成功

接下来我们开始测试,测试的方式有两种,一种是通过手动输入命令,另一种是通过通过建立配置文件来执行测试,这里我们选择第二种,如果对一种方式感兴趣的读者可以参考如下链接,fio配置测试

 输入vim fio.conf  将以下内容拷贝进去并保存

[global]
ioengine=psync
direct=1
thread=1
norandommap=1
randrepeat=0
runtime=60
ramp_time=6
size=1g
directory=/path/to/test
 
[read4k-rand]
stonewall
group_reporting
bs=4k
rw=randread
numjobs=8
iodepth=32
 
[read64k-seq]
stonewall
group_reporting
bs=64k
rw=read
numjobs=4
iodepth=8
 
[write4k-rand]
stonewall
group_reporting
bs=4k
rw=randwrite
numjobs=2
iodepth=4
 
[write64k-seq]
stonewall
group_reporting
bs=64k
rw=write
numjobs=2
iodepth=4

以上就是各个测试配置的参数

这里共有4个测试,顺序读,随机读,顺序写,随机写,同时采取同步模式进行测试

笔者的习惯是修改一下该文件的权限,以防止因为权限不足不能执行

[yangyang@pocvm ~]$ sudo chmod 777 fio.conf

 

这里有一点要注意需要在根目录下建立如下文件夹,否则接下来的测试会找不到路径

[yangyang@pocvm ~]$ sudo mkdir /path/
[yangyang@pocvm ~]$ sudo mkdir /path/to/
[yangyang@pocvm ~]$ sudo mkdir /path/to/test/

接下来的步骤至关重要

输入如下命令

[yangyang@pocvm ~]$ sudo /usr/local/bin/fio fio.conf>sync.txt

这一步其实就是用fio来执行刚刚的配置文件fio.conf 并且将执行的结果写入sync.txt中,但是这里提醒大家一句,执行完该命令以后,会发现有长时间的卡停,这时候不要急于停止,因为在执行配置文件过程是比较漫长的,如果不等待配置文件中的内容执行完毕,会直接影响以下结果的输出!!!

输入如下命令

[yangyang@pocvm ~]$ grep iops sync.txt

显示sync.txt中的测试结果

[yangyang@pocvm ~]$ grep iops sync.txt
  read : io=118608KB, bw=1975.1KB/s, iops=493, runt= 60027msec
  read : io=1840.9MB, bw=31403KB/s, iops=490, runt= 60027msec
  write: io=62180KB, bw=1033.8KB/s, iops=258, runt= 60153msec
  write: io=974336KB, bw=16782KB/s, iops=262, runt= 58057msec

将配置文件中的ioengine=psync换成ioengine=libaio

[yangyang@pocvm ~]$ sudo /usr/local/bin/fio fio.conf>async.txt
[yangyang@pocvm ~]$ grep iops async.txt
read : io=194248KB, bw=3213.9KB/s, iops=799, runt= 60441msec
read : io=2159.7MB, bw=36798KB/s, iops=574, runt= 60097msec
write: io=66060KB, bw=997.74KB/s, iops=249, runt= 66211msec
write: io=1385.2MB, bw=23310KB/s, iops=364, runt= 60848msec

我们会发现iops有所增加,主要表现在顺序读和写这两者增加比较多

有笔者在进行libaio测试的时候会遇到如下错误

这是由于缺少libaio devel这个安装包造成的

输入sudo yum install libaio-devel即可,但是装完必须重新解压fio 然后再make和make install,否则还是不行!!!

 

posted @ 2016-12-13 14:31  yangyangchenjie  阅读(903)  评论(0编辑  收藏  举报