好长时间没有写技术方面的文章了,今天我们来聊聊存储的QoS。
QoS这个术语来源是电信网络,大概在90年代中期吧。那时主要指语音用户的体验,现在已经扩展到各行各业,含义也大了很多。
至于进入存储领域,SolidFire的技术白皮书说是5年前,它们第一次在存储上提供了QoS的功能,然后才被其他存储厂商支持。(我没有仔细考究历史,其他高端存储厂商估计有不同看法,欢迎讨论)
QoS刚开始设计的初衷是防止坏邻居的干扰。也就是说,你的资源是有限的,当资源被共享使用的时候,如何防止坏人抢夺资源,影响到其他用户的体验。
由于历史上网络就是共享的,因此,网络的QoS发展得比较成熟。我们家的路由器就有QoS的功能。
大家看到,仅仅一个家用的路由器,就可以支持复杂的QoS控制。
但是,存储刚产生的时候,典型的部署都是DAS模式,也就是一套存储只服务一台主机,因此,那个时候存储无需考虑坏邻居的问题,因为根本就没有邻居。
直到后来,存储渐渐成为一个数据平台,现代数据中心,存储的资源基本都是共享的,特别在虚拟化环境下尤其如此,因此,QoS也就成为现代存储的必要技能之一。
但直到现在,还有很多存储,甚至是高端存储对QoS支持并不好。
存储QoS的支持,不同的厂商做法不同,效果也不同。不是所有的QoS都是一样的。不是所有的QoS都可以保证你关键业务的性能。
常见的QoS支持手段有两种:
1、优先级
采用优先级的方式是最简单的方式,关键业务的优先级高,普通业务的优先级低。这个策略特别像飞机登机的时候,金卡会员优先登机。只要有金卡会员来,总是先给他们提供服务。现在金卡会员越来越多,普通旅客总是要等老半天才能登机,体验非常不好。而且,优先级其实没有解决坏邻居的问题,因为你的关键业务可能也有很多,如果某个关键业务突然异常了,把所有的资源都抢占了怎么办?因此,这种方式虽然很通用,但是它也保证不了关键业务的性能。
2、限速
也就是控制应用的最大的IOPS或者带宽。这个也是很多存储厂商支持的。但是,限速的设计初衷并不是为了保证关键业务的性能,而是为了保护存储系统。所有的应用都限制其最大IOPS和带宽,是比较好的解决了坏邻居干扰的问题,但是也造成资源的浪费。关键是它只是限制了坏邻居的干扰,但其实并不能保证关键业务的性能。
其他的QoS手段,高端存储一般还有Cache分区功能,比如EMC、HDS和华为都支持。中端存储支持这个特性的不多,主要是Cache的资源有限。Cache分区特别像机场的VIP通道,可以保证关键业务的Cache需求。Cache现在也不仅仅只DRAM,也可以是SSD,但SSD一般比较便宜,就不用Cache分区了。
但是,这个还不能保证关键业务的性能。因为Cache只是影响性能的一个关键部件,还有CPU和磁盘等等,特别是磁盘资源,经常会成为性能的瓶颈。
因此,我们看到很多存储厂商,针对磁盘来做文章。原来机械盘时代,很多高端存储只用磁盘里面转速最快的一部分容量(叫fast track),而且,常常多配置很多盘来满足性能的要求而不是容量的要求。后来,有了分布式RAID技术,每个卷都可以用到所有的磁盘,才比较好地解决了性能和容量的关联问题。现在进入闪存时代,分层技术被广泛采用,甚至部分应用可以pin(绑定)在闪存层,基本可以保证关键业务的性能。但是,这种分层的方式,需要统计热点,然后按照策略迁移到不同的层,会产生很多后台的I/O,对整个系统的性能会产生不利的影响。关键的关键,分层也不能保证关键业务的性能。
优先级和限速这些QoS手段的应用,还有一个粒度和时间段问题。
现在的存储一般都支持应用到端口一级,多数支持应用到LUN一级(或者快照和文件系统)。有些可以支持到VM级别,支持VVOL的可以支持到VVOL级别。
在时间段上的关联也是必须的,比如备份应用晚上开始做备份,你应该给予它足够的带宽,但如果是白天,你就要限制它的带宽,否则它就成为了坏邻居。
说了这么多,这些都是传统存储的QoS的实现手段,但是,他们都无法保证关键业务的性能。
如何保证关键业务的性能呢?
我认为只有支持最低速率设置的存储,才能真正能够保证关键业务的性能。
在全闪存阵列里,SolidFire的QoS能力一直得到大家的公认。我们来看看其QoS的一些特点。它说它设计初衷就考虑了QoS的问题,因为它主要定位是云环境下使用。
首先,性能和容量可以独立设置。
第二,它不用优先级,采用设置最小、最大和突发IOPS三个阈值来保证系统的性能。它和很多传统存储不同的是,能够保证负载的最小性能。也就是MIN是给你保证的,MAX是控制你长久不能超过这个值,防止你变成一个坏邻居来影响别人。但他还考虑一个BURST,也就是你瞬间你可以突破MAX,这种情况在VM重启等某些场景还是特别有用的。
这是一个设置的界面,我们看到,其三个值可以根据负载的块大小来指定。也就是可以这算出对应带宽的值。因此,设置的时候,并不需要设置带宽限制。
由于SolidFire是做AFA的,因此,它认为只有它的独特架构才能保证实现其设定的性能目标。其实,这个我持保留态度,只要你知道自己的资源情况,调度得当,都是可以实现的,不仅仅是AFA才行。
不过它提的后面3点,如平衡的负载分配,细粒度的QoS控制,性能可视化确实还是很重要的。
比如,我们来看看华为的高端存储OceanStor 18000 V3,其采用的SmartQoS功能也很丰富,也可以设置最低性能指标,保证关键系统的性能。
SmartQos支持的设置比较丰富,除了支持Cache分区外,也支持优先级和限速。
优先级的设置分三级,高中低,基本可以满足大部分场景的需求。
但真正功能强大的是流量控制策略。华为可以针对读I/O,写I/O,读写I/O分别控制,可以选择控制的带宽、IOPS,甚至时延。关键的关键,除了可以控制最大值外,还可以控制最小值,也就是可以保证关键系统的性能。
如果设置了最小值,这个LUN的优先级就不能修改了,由系统来分别资源给他。原理上,主要是通过令牌的方式来保证关键系统的性能。比如某个关键系统需要1000个IOPS,那么系统每秒就分给他1000个令牌,有令牌的I/O系统才会处理,也就保证了关键系统的性能。当然,系统的资源怎么换算成令牌,那是非常复杂的事情。另外,系统也有很多阈值考虑,如CPU达到多少,磁盘负载超过多少就需要停止令牌的分配,保证整个系统不会瘫痪,这样得到令牌的I/O才能够正常处理。
QoS策略的时间段也是可以灵活设置的。
当然,如果你需要中途修改QoS策略,需要变成未激活状态,修改完后再激活就可以了。
我们看到,SolidFire和华为的OceanStor V3存储在QoS上都支持针对目标设定最小性能阈值,也就是可以保证系统的关键应用的性能。由于其能保证关键系统的性能,因此在多租户的存储整合或者云环境是一个比较理想的选择。
Gartner的高端存储关键能力评估报告,华为高端存储在多租户和安全性的关键能力上得分就很高,而SolidFire在AFA的关键能力评估报告里,在多租户的得分是很高的。这里面重点的支撑就像丰富的QoS策略。
如果你要保证你的关键系统的存储性能,可以看看你使用的存储是否支持设置LUN的最小性能阈值就可见分晓。据我所知,这样的存储不太多。