话说天下武功、唯富不破,不对,是唯快不破,对于IT系统,这句话也同样适用。虽然现在的IT系统发展方向逐步弱化单机性能和安全性,但对单机的性能优化永远是解决问题的根本之道。
而磁盘系统作为IT系统中最慢的一个环节,在用户DC里,可以通过对RAID配置修改、调整缓存、增大并发等各种方式来优化磁盘性能,但在公有云环境里,每种磁盘的性能是固定的:
对于磁盘本身,没有什么可调优的空间;而对主机系统来说,我们还是可以有些手段来优化磁盘。下边就看看Linux具体的测试结果。
测试环境准备
测试环境
本次测试,还是采用老牌的IOPS测试工具IOmeter。
测试主机:
- OS:Centos7.4
- 机型:DS3v2(4core、14GB RAM),避免主机性能影响测试结果,采用支持SSD磁盘的机型
- IP:172.17.0.4
控制台主机(IOmeter在Linux下不提供管理和结果显示,所以需要一台windows主机作为控制台):
- OS:Windows 2016 Datacenter
- 机型:A4m_v2(4core、32GB RAM)
- IP:172.17.0.5
测试软件安装
Windows控制台
windows下安装比较简单,只需要到IOmeter下载windows版本的软件(一般为x64版本,注意不要选择ia64),然后解压缩即可:
解压缩后有两个可执行文件:
- Dynamo:磁盘测试的守护进程,附着对磁盘进行读写
- IOmeter:控制台程序,负责配置管理所有测试,并输出结果
运行IOmeter,进入管理界面:
IOmeter将自动启动本机的Dynamo,并显示在All Managers。也可单独运行Dynamo,注册到同一网络里其他的IOmeter控制台,做集中管理。
建议关掉Windows的防火墙,避免影响与测试客户端的通讯。
Linux客户端
Linux环境下载IOmeter,如果没有GUI桌面,可通过命令行下载(一般也是x64版本):
wget https://downloads.sourceforge.net/project/iometer/iometer-stable/1.1.0/iometer-1.1.0-linux.x86_64-bin.tar.bz2?r=http%3A%2F%2Fwww.iometer.org%2Fdoc%2Fdownloads.html&ts=1511539548&use_mirror=nchc
如果下载的文件名为:
iometer-1.1.0-linux.x86_64-bin.tar.bz2?r=http:%2F%2Fwww.iometer.org%2Fdoc%2Fdownloads.html.1
请重命名为:
iometer-1.1.0-linux.x86_64-bin.tar.bz2
然后解压缩:
tar -xvf iometer-1.1.0-linux.x86_64-bin.tar.bz2
得到Linux下的磁盘测试文件Dynamo。请检查该文件权限,如果没有可执行权限,请用chmod 755赋予可执行权限。
运行dynamo并注册到控制台:
sudo ./dynamo -i 172.17.0.5 -m 172.17.0.4
其中,-i后是控制台的ip,-m是需要测试的机器的ip(一般为本机):
在向控制台注册过程中会有些报错,先不用管。
回到Windows主机的控制台,可看到Linux的客户端已注册:
IOmeter使用测试
IOmeter测试的主要参数:
IOmeter测试的IO模型,因为Azure磁盘的公布IOPS以8K为基准,所以点击New创建一个8K,随机50%,写50%的模型:
并加入左侧的测试栏:
选择测试热身时间30秒,测试10分钟:
现在对临时盘(sdb)进行测试,数据量为10GB(20971520),outstanding IOs并发保持1(注意磁盘选择要到每个worker里去做):
点击上部绿色小旗开始测试,指定结果保存的文件目录及文件名,并转到Results Display检查运行状况(update Frequency指定结果显示的刷新间隔时间):
测试完成,打开结果文件,可以看到测试情况:
单盘测试
DS系列vm同时支持HDD和SDD两种磁盘,分别对这两种磁盘做测试:
HDD磁盘
在VM的设置-磁盘添加数据磁盘,并选择创建磁盘:
创建一块S30磁盘:
由于Linux不会自动扫描硬件更新,所以重启系统识别新加硬盘:
分区并格式化为ext4的文件系统:
挂载到/mnt目录:
再次执行Dynamo命令运行测试工具,在控制台可以看到多出一个/mnt目录做测试:
选择/mnt作为目标进行测试,测试参数仍参照对sdb的参数:
在VM的设置-磁盘选项里点击编辑,可以为磁盘配置缓存:
分别为HDD01配置只读和读写缓存,做同样测试(配置后重启Linux,确保配置生效),最后结果:
缓存配置 | 无缓存 | 启用读缓存 | 启用读写缓存 |
---|---|---|---|
IOPS | 493 | 512 | 463 |
读IOPS | 246 | 256 | 231 |
写IOPS | 247 | 256 | 232 |
从测试结果可见,缓存对磁盘的加速不一定有作用,有时候反而会降低性能。
如何能发挥缓存的作用?在启用读写缓存情况下,对outstanding IOs进行配置测试:
Outstanding IOs | 1 | 2 | 4 | 8 | 16 |
---|---|---|---|---|---|
IOPS | 463 | 633 | 749 | 789 | 833 |
读IOPS | 318 | 318 | 373 | 394 | 416 |
写IOPS | 315 | 315 | 376 | 395 | 417 |
延时(ms) | 8.61 | 12.63 | 21.20 | 40.27 | 76.80 |
读延时(ms) | 14.49 | 18.07 | 28.12 | 51.84 | 95.01 |
写延时(ms) | 2.75 | 7.15 | 14.26 | 28.72 | 58.62 |
可以看出,增加并行的IO,可以提升IOPS,但是延时也会增加。
通过以上测试,可以得到如下结果:
- Azure的hdd磁盘性能和容量无关,IOPS都是500,实测情况满足
- 单块磁盘可以通过启用缓存的方式来提升性能,但是要提高并发数量,客户的应用设计需要考虑到这个因素
- 写缓存可能会在异常停机时导致数据丢失,需慎用
- 提高并发虽然增加了IOPS,但是导致延时上升,所以要根据客户的实际需求决定是否使用此方法
- 使用缓存可降低cpu的使用率,优化系统性能
- 配置缓存后重启系统生效
SSD磁盘测试
再给VM添加一块SSD磁盘P30:
测试IOPS,结果未达到标称5000
这是因为SSD和传统HDD结构不一样,HDD只有一个磁头,并发IO不能同时处理,而SSD没有这个问题,需要通过提高并发(队列深度)来提升性能。
针对不同Outstanding IOs测试结果如下:
Outstanding IOs | 1 | 2 | 4 | 8 | 16 |
---|---|---|---|---|---|
IOPS | 1683 | 3327 | 5095 | 5101 | 5099 |
读IOPS | 842 | 1661 | 2545 | 2554 | 2541 |
写IOPS | 841 | 1666 | 2550 | 2547 | 2559 |
延时(ms) | 2.38 | 2.40 | 3.14 | 6.27 | 12.55 |
读延时(ms) | 2.56 | 2.62 | 3.36 | 6.47 | 12.71 |
写延时(ms) | 2.19 | 2.18 | 2.92 | 6.08 | 12.38 |
可以看出对单块SSD盘,当Outstanding IOs=4时,可以达到性能的标称值(5000),再提升并发,对性能提升无影响,但是IO的堆积反而导致延时上升。
测试缓存对SSD磁盘的影响(Outstanding IOs=4):
缓存配置 | 启用读缓存 | 启用读写缓存 |
---|---|---|
IOPS | 6143 | 6372 |
读IOPS | 3072 | 3182 |
写IOPS | 3071 | 3190 |
延时(ms) | 2.60 | 2.51 |
读延时(ms) | 2.30 | 3.41 |
写(ms) | 2.91 | 1.62 |
可以看出,启用缓存后,IOPS有显著提高,特别在启用读写缓存后,在IOPS提高的同时,写延时明显下降。
通过以上测试可以看出:
- 对SSD磁盘,通过提高并发可以明显提升性能,但是有极限,超过极限后,性能基本不上升,而延时会增加
- 启用缓存可以有效提升性能,但是如果数据安全比较重要,不建议启用读写缓存,而只启用读缓存(Azure默认配置)
多盘测试
对于Azure提供的磁盘服务,无论怎么优化,单盘有性能极限。如果客户有超过极限的性能需求,如何处理?这时候就需要通过多盘组合的方式来实现了。
在Linux环境下,多盘组合的方式有两种:LVM和软Raid。下边就看看这两种方式的区别。
LVM
LVM是Linux系统从Unix继承的一种磁盘管理方式。LVM抛弃了在单盘创建分区文件系统的方式,而是将多块磁盘组合形成一块逻辑大磁盘,并在上分区创建文件系统。LVM突破了单盘容量限制,并可以灵活调整文件系统大小,非常方便用户使用。
LVM支持三种方式的lv映射到pv:Linear、Strip、Mirror。为了提升磁盘性能,希望多块磁盘可以并发,所以要使用Strip方式。
下边测试LVM方式的性能。
为了方便测试,给测试机添加4块ssd硬盘,不启用缓存:
启动测试机,检查已经多出4块硬盘:
如下将sdc和sdd划分分区,指定为LVM格式(8e),并创建pv
将sdc1和sdd1创建为vg:
通过lvcreate –h可以查看创建不同类型lv的方法:
在Azure底层,所有存储都做了本地强一致的三副本,无用担心数据安全,所以直接创建strip的lv即可(通过-i参数指定分布的pv宽度,本例中只有两个pv,所以设定为2):
检查该lv的stripe情况可以看到已经stripe到2个pv:
格式化此lv并挂载:
再次进行IOPS测试,由于俩块ssd硬盘并发,所以Outstanding IOs设置为8:
可以看到,IOPS可达到单盘的两倍:
将第三块硬盘加入vg,检查可以看到之前创建的lv的stripe仍然为2,并没自动balance到3块硬盘:
实测结果也是如此:
按照lvm的规范,stripe的lv扩展时必须以原有的lv的pv数量为倍数。例如原有lv分布在2个pv,那么扩展时必须以2个pv为倍数。并且原有的pv写满后才会写入新的pv。所以需要加入2个pv,再将lv扩展到所有pv容量之和,才能实现strip到所有pv。
现将sdf也加入vg,并扩展lv到所有pv容量之和:
检查stripe的情况:
可以看到扩展成功,但是实际上之前的lv和扩展的空间是串联的方式,实际IOmeter测试结果也如此:
总结一下:
- lvm如果使用stripe方式创建lv,可以线性提升IO性能
- 创建好的lv无法通过各种方式提升性能,需要预先固定好性能需求
- vg最好为单一lv使用,以保证性能
软Raid
Linux系统也可以用软Raid方式组合磁盘,同样因为Azure底层已经有数据保护,所以可以直接使用Raid0方式避免写惩罚。
首先将磁盘创建为raid类型的分区:
还是先用2块磁盘创建Raid0:
格式化Raid并挂载:
可以看到,IOPS可以达到单盘的2倍:
向raid增加硬盘:
出现错误,查阅文档说明raid0不支持扩容。
查询文档可知,Linux(CentOS7)支持的Raid类型如下:
现在以Raid5做测试:
raid初始化需要一定时间:
测试结果:
由于Raid5有4倍写延时,所以总体IO是:3468+3475*4=17368,充分发挥出3块sdd硬盘的性能。
现在给Raid添加一块新硬盘:
将这块硬盘online:
开始reblance:
由于已经有数据(IOmeter测试时生成的文件),所以时长较长,此时可正常使用,但是性能很差:
等到Rebanlance完成,重新测试:
可以看到整体IOPS反而下降,分析原因应该是cpu在做软raid时的瓶颈。
测试总结
总结一下本次的测试:
1、ssd与hdd相比可显著提升IO性能,但是要想充分发挥ssd性能,应用必须多线程并发读写。
2、ssd延时表现较好,即使在与hdd同样甚至更低iops情况下(P10以下硬盘),对延时敏感的业务(如数据库日志等),使用ssd能获得较好的感受
3、对于ssd,缓存可显著提升性能,但是写缓存有数据风险,谨慎使用
4、条带化的lvm和raid0都可以实现IO性能的线性增长,但是做完后无法扩充,所以要提前预估业务所需性能;如果业务确实面临性能增长超过预期的情况,只能新建lvm或raid0,然后做数据迁移
5、Azure有底层的数据保护哦,带容错机制的软raid会带来性能损失,不建议使用。