天下武功,唯快不破——Linux虚机的磁盘调优初探

话说天下武功、唯富不破,不对,是唯快不破,对于IT系统,这句话也同样适用。虽然现在的IT系统发展方向逐步弱化单机性能和安全性,但对单机的性能优化永远是解决问题的根本之道。

而磁盘系统作为IT系统中最慢的一个环节,在用户DC里,可以通过对RAID配置修改、调整缓存、增大并发等各种方式来优化磁盘性能,但在公有云环境里,每种磁盘的性能是固定的:

mark

对于磁盘本身,没有什么可调优的空间;而对主机系统来说,我们还是可以有些手段来优化磁盘。下边就看看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),然后解压缩即可:

mark

解压缩后有两个可执行文件:

  • Dynamo:磁盘测试的守护进程,附着对磁盘进行读写
  • IOmeter:控制台程序,负责配置管理所有测试,并输出结果

运行IOmeter,进入管理界面:

mark

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(一般为本机):

mark

在向控制台注册过程中会有些报错,先不用管。

回到Windows主机的控制台,可看到Linux的客户端已注册:

mark

IOmeter使用测试

IOmeter测试的主要参数:

mark

IOmeter测试的IO模型,因为Azure磁盘的公布IOPS以8K为基准,所以点击New创建一个8K,随机50%,写50%的模型:

mark

并加入左侧的测试栏:

mark

选择测试热身时间30秒,测试10分钟:

mark

现在对临时盘(sdb)进行测试,数据量为10GB(20971520),outstanding IOs并发保持1(注意磁盘选择要到每个worker里去做):

mark

点击上部绿色小旗开始测试,指定结果保存的文件目录及文件名,并转到Results Display检查运行状况(update Frequency指定结果显示的刷新间隔时间):

mark

测试完成,打开结果文件,可以看到测试情况:

mark

单盘测试

DS系列vm同时支持HDD和SDD两种磁盘,分别对这两种磁盘做测试:

HDD磁盘

在VM的设置-磁盘添加数据磁盘,并选择创建磁盘:

mark

创建一块S30磁盘:

mark

由于Linux不会自动扫描硬件更新,所以重启系统识别新加硬盘:

mark

分区并格式化为ext4的文件系统:

mark

挂载到/mnt目录:

mark

再次执行Dynamo命令运行测试工具,在控制台可以看到多出一个/mnt目录做测试:

mark

选择/mnt作为目标进行测试,测试参数仍参照对sdb的参数:

mark

在VM的设置-磁盘选项里点击编辑,可以为磁盘配置缓存:

mark

分别为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:

mark

测试IOPS,结果未达到标称5000

mark

这是因为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硬盘,不启用缓存:

mark

启动测试机,检查已经多出4块硬盘:

mark

如下将sdc和sdd划分分区,指定为LVM格式(8e),并创建pv

mark

将sdc1和sdd1创建为vg:

mark

通过lvcreate –h可以查看创建不同类型lv的方法:

mark

在Azure底层,所有存储都做了本地强一致的三副本,无用担心数据安全,所以直接创建strip的lv即可(通过-i参数指定分布的pv宽度,本例中只有两个pv,所以设定为2):

mark

检查该lv的stripe情况可以看到已经stripe到2个pv:

mark

格式化此lv并挂载:

mark

再次进行IOPS测试,由于俩块ssd硬盘并发,所以Outstanding IOs设置为8:

mark

可以看到,IOPS可达到单盘的两倍:

mark

将第三块硬盘加入vg,检查可以看到之前创建的lv的stripe仍然为2,并没自动balance到3块硬盘:

mark

实测结果也是如此:

mark

按照lvm的规范,stripe的lv扩展时必须以原有的lv的pv数量为倍数。例如原有lv分布在2个pv,那么扩展时必须以2个pv为倍数。并且原有的pv写满后才会写入新的pv。所以需要加入2个pv,再将lv扩展到所有pv容量之和,才能实现strip到所有pv。

现将sdf也加入vg,并扩展lv到所有pv容量之和:

mark

检查stripe的情况:

mark

可以看到扩展成功,但是实际上之前的lv和扩展的空间是串联的方式,实际IOmeter测试结果也如此:

mark

总结一下:

  • lvm如果使用stripe方式创建lv,可以线性提升IO性能
  • 创建好的lv无法通过各种方式提升性能,需要预先固定好性能需求
  • vg最好为单一lv使用,以保证性能

软Raid

Linux系统也可以用软Raid方式组合磁盘,同样因为Azure底层已经有数据保护,所以可以直接使用Raid0方式避免写惩罚。

首先将磁盘创建为raid类型的分区:

mark

还是先用2块磁盘创建Raid0:

mark

格式化Raid并挂载:

mark

可以看到,IOPS可以达到单盘的2倍:

mark

向raid增加硬盘:

mark

出现错误,查阅文档说明raid0不支持扩容。

查询文档可知,Linux(CentOS7)支持的Raid类型如下:

mark

现在以Raid5做测试:

mark

raid初始化需要一定时间:

mark

测试结果:

mark

由于Raid5有4倍写延时,所以总体IO是:3468+3475*4=17368,充分发挥出3块sdd硬盘的性能。

现在给Raid添加一块新硬盘:

mark

将这块硬盘online:

mark

开始reblance:

mark

由于已经有数据(IOmeter测试时生成的文件),所以时长较长,此时可正常使用,但是性能很差:

mark

等到Rebanlance完成,重新测试:

mark

可以看到整体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会带来性能损失,不建议使用。