上篇我们分析了raid5与raid10的内部运行细节,这里我们主要分析一下存储阵列的瓶颈,因为瓶颈的出现,与raid方式是有很大差别的,所以我们需要先分析raid5与raid10的具体差别。
阵列的瓶颈主要体现在2个方面,吞吐量与IOPS。
1、吞吐量
吞吐量主要取决于阵列的构架,光纤通道的大小(现在阵列一般都是光纤阵列,至于SCSI这样的SSA阵列,我们不讨论)以及硬盘的个数。阵列的构架与每个阵列不同而不同,他们也都存在内部带宽(类似于pc的系统总线),不过一般情况下,内部带宽都设计的很充足,不是瓶颈的所在。
光纤通道的影响还是比较大的,如数据仓库环境中,对数据的流量要求很大,而一块2Gb的光纤卡,所能支撑的最大流量应当是2Gb/8(小B)=250MB/s(大B)的实际流量,当4块光纤卡才能达到1GB/s的实际流量,所以数据仓库环境可以考虑换4Gb的光纤卡。
最后说一下硬盘的限制,这里是最重要的,当前面的瓶颈不再存在的时候,就要看硬盘的个数了,我下面列一下不同的硬盘所能支撑的流量大小:
10 K rpm 15 K rpm ATA
——— ——— ———
10M/s 13M/s 8M/s
那么,假定一个阵列有120块15K rpm的光纤硬盘,那么硬盘上最大的可以支撑的流量为120*13=1560MB/s,如果是2Gb的光纤卡,可能需要6块才能够,而4Gb的光纤卡,3-4块就够了。
2、IOPS
决定IOPS的主要取决与阵列的算法,cache命中率,以及磁盘个数。阵列的算法因为不同的阵列不同而不同,如我们最近遇到在hds usp上面,可能因为ldev(lun)存在队列或者资源限制,而单个ldev的iops就上不去,所以,在使用这个存储之前,有必要了解这个存储的一些算法规则与限制。
cache的命中率取决于数据的分布,cache size的大小,数据访问的规则,以及cache的算法,如果完整的讨论下来,这里将变得很复杂,可以有一天好讨论了。我这里只强调一个cache的命中率,如果一个阵列,读cache的命中率越高越好,一般表示它可以支持更多的IOPS,为什么这么说呢?这个就与我们下面要讨论的硬盘IOPS有关系了。
硬盘的限制,每个物理硬盘能处理的IOPS是有限制的,如
10 K rpm 15 K rpm ATA
——— ——— ———
100 150 50
同样,如果一个阵列有120块15K rpm的光纤硬盘,那么,它能撑的最大IOPS为120*150=18000,这个为硬件限制的理论值,如果超过这个值,硬盘的响应可能会变的非常缓慢而不能正常提供业务。
另外,我们上一篇也讨论了,在raid5与raid10上,读iops没有差别,但是,相同的业务写iops,最终落在磁盘上的iops是有差别的,而我们评估的却正是磁盘的IOPS,如果达到了磁盘的限制,性能肯定是上不去了。
那我们假定一个case,业务的iops是10000,读cache命中率是30%,读iops为60%,写iops为40%,磁盘个数为120,那么分别计算在raid5与raid10的情况下,每个磁盘的iops为多少。
raid5:
- 单块盘的iops = (10000*(1-0.3)*0.6 + 4 * (10000*0.4))/120
- = (4200 + 16000)/120
- = 168
这里的10000*(1-0.3)*0.6表示是读的iops,比例是0.6,除掉cache命中,实际只有4200个iops
而4 * (10000*0.4) 表示写的iops,因为每一个写,在raid5中,实际发生了4个io,所以写的iops为16000个
为了考虑raid5在写操作的时候,那2个读操作也可能发生命中,所以更精确的计算为:
- 单块盘的iops = (10000*(1-0.3)*0.6 + 2 * (10000*0.4)*(1-0.3) + 2 * (10000*0.4))/120
- = (4200 + 5600 + 8000)/120
- = 148
计算出来单个盘的iops为148个,基本达到磁盘极限
raid10
- 单块盘的iops = (10000*(1-0.3)*0.6 + 2 * (10000*0.4))/120
- = (4200 + 8000)/120
- = 102
可以看到,因为raid10对于一个写操作,只发生2次io,所以,同样的压力,同样的磁盘,每个盘的iops只有102个,还远远低于磁盘的极限iops。
在一个实际的case中,一个恢复压力很大的standby(这里主要是写,而且是小io的写),采用了raid5的方案,发现性能很差,通过分析,每个磁盘的iops在高峰时期,快达到200了,导致响应速度巨慢无比。后来改造成raid10,就避免了这个性能问题,每个磁盘的iops降到100左右。
一直以来,看到关于raid5与raid10的性能之争还是非常多的,甚至很多人那拿出了测试数据,但是,到底谁是谁非。这里,我就这两种raid的内部运行原理来分析一下,我们在什么情况下应当适合选哪一种raid方式。
为了方便对比,我这里拿同样多驱动器的磁盘来做对比,raid5选择3D+1P的raid方案,raid10选择2D+2D的Raid方案,分别如图:

那么,我们分析如下三个过程:读,连续写,随机写,但是,在介绍这三个过程之前,我需要介绍一个特别重要的概念:cache。
cache技术最近几年,在磁盘存储技术上,发展的非常迅速,作为高端存储,cache已经是整个存储的核心所在,就是中低端存储,也有很大的cache存在,包括最简单的raid卡,一般都包含有几十,甚至几百兆的raid cache。
cache的主要作用是什么呢?体现在读与写两个不同的方面,如果作为写,一般存储阵列只要求写到cache就算完成了写操作,所以,阵列的写是非常快速的,在写cache的数据积累到一定程度,阵列才把数据刷到磁盘,可以实现批量的写入,至于cache数据的保护,一般都依赖于镜相与电池(或者是UPS)。
cache的读一样不可忽视,因为如果读能在cache中命中的话,将减少磁盘的寻道,因为磁盘从寻道开始到找到数据,一般都在6ms以上,而这个时间,对于那些密集型io的应用可能不是太理想。但是,如果cache能命中,一般响应时间则可以在1ms以内。
不要迷信存储厂商的iops(每秒的io数)数据,他们可能全部在cache命中的基础上做到的,但是实际上,你的cache命中率可能只有10%。
介绍完cache,我们就可以解释raid5与raid10在不同的模式下,工作效率问题了,那么我们来分别分析以上三个问题。
1、读操作
因为raid5与raid10的磁盘都可以提供服务,所以,在读上面他们基本是没有差别的,除非是读的数据能影响cache命中率,导致命中率不一样。

2、连续写
连续写的过程,一般表示写入连续的大批量的数据,如媒体数据流,很大的文件等等,这个写操作过程,如果有写cache存在,并且算法没有问题的话,raid5比raid10甚至会更好一些(这里要假定存储有一定大小足够的写cache,而且计算校验的cpu不会出现瓶颈)。因为这个时候的校验是在cache中完成,如4块盘的raid5,可以先在内存中计算好校验,同时写入3个数据+1个校验。而raid10只能同时写入2个数据+2个镜相。

如,4块盘的raid5可以在同时间写入1、2、3到cache,并且在cache计算好校验之后,我这里假定是6(实际的校验计算并不是这样的,我这里仅仅是假设),同时把三个数据写到磁盘。而4块盘的raid10不管cache是否存在,写的时候,都是同时写2个数据与2个镜相。
但是,我前面也说过了,写cache是可以缓存写操作的,等到一定时期再写到磁盘,但是,写操作不比读操作,这个写是迟早也要发生的,也就是说,最后落到磁盘上的写还是避免不了的,不过,如果不是连续性的强连续写,只要不达到磁盘的写极限,差别都不是太大。
3、离散写
这里可能是最难理解,但是,也是最重要的部分,数据库,如oracle 数据库大部分操作就是离散写,如每次写一个数据块的数据,如8K;联机日志虽然看起来是连续写,但是因为每次写的量不多,不保证能添满raid5的一个条带(保证每张盘都能写入),所以很多时候也是离散写入。

我们再接上图,假定要把一个数字2变成数字4,那么对于raid5,实际发生了4次io,
先读出2与校验6,可能发生读命中
然后在cache中计算新的校验
写入新的数字4与新的校验8
对于raid10,我们可以看到,同样的单个操作,最终raid10只需要2个io,而raid5需要4个io。
但是,这里我忽略了raid5在那两个读操作的时候,还可能会发生读命中操作,也就是说,如果需要读取的数据已经在cache中,可能是不需要4个io的,也证明了cache对raid5 的重要性,不仅仅是计算校验需要,而且对性能的提升由为重要。曾经测试过,在raid5的阵列中,如果关闭写cache,raid5的性能将差很多倍。
这里,并不是说cache对raid10就不重要了,因为写缓冲,读命中等,都是提高速度的关键所在,不过的是,raid10对cache的依赖性没有raid5那么明显而已。
到这里,大家应当也大致明白了raid5与raid10的原理与差别了,一般来说,象小io的数据库类型操作,建议采用raid10,而大型文件存储,数据仓库,则从空间利用的角度,可以采用raid5。
待续。。。。。。
注:以下言论只代表个人观点,不代表公司意见或者是看法:
240块73G*15K的硬盘,128G的cache,支撑到17000iops的时候,存储就成瓶颈了,单个IO的响应时间居然超过100ms,如果一个语句有100个物理io,那么响应时间将是100*100=10,000ms,也就是10s种才能返回结果,TMD,也太恐怖了,差的有点离谱。
这个转折不是线型的,可能在15000iops的时候,你发现单个io的响应时间还在20ms以下,16000的时候,已经有50ms了,17000的时候,可能就100ms了。也就是说,拐点就在这里出现了,如果一个小的iops的增长,将导致大量的io响应缓慢,再导致所有的应用响应缓慢,再导致整个系统的处理能力下降。。。。。。

造成这么差的原因总是多方面的,但是,根据个人经验的长期总结,有如下2个重要原因
1、cache机制有问题,这款号称最高端的存储采用了令人可笑的cache设计,256k的cache size,也就是说,如果数据库发生了一个8k的io,存储将分配256K的cache size给它,那256-8K的地方呢?空着呗,除非有另外的访问读取了这个8k附近的数据。(这里解释一下,一个cache size所保存的数据,在磁盘上必须是连续的,而且起始地址也是固定的,是为了寻址的设计要求)。
那么,对于一个总是有很小IO,如数据库系统,IO又很离散的话,那么,你将遭遇到令人吃惊的存储命中率,如10%的命中率,对于一个128G的cache,数据库总大小也就1个T的环境来说,是不是太离奇了。
当初我为了跟踪这个问题,几乎是找遍了所有的资源,才得到这个信息,也只能说HDS对中国的技术封锁还是太严重,那么,想修改这个尺寸可以吗?回答是,可以,可以从256K修改成64K,但是需要停机,完全停机!但是,对于一个99.99%的高可用系统,停机一次是一个非常大的代价。
2、算法的设计也有问题,因为存储的瓶颈不在硬盘,我们可以计算每块盘的iops,大致为17000*0.9/200=77左右(90%不命中,200块盘用于数据文件),也就是说,一块盘的iops才77个,存储就如此不行了,一个硬盘,正常可以支撑到120 iops还没有问题(我们都是raid10,而且肯定没有热点硬盘或者热点raid组)。
那么瓶颈在哪里呢,其实我也不是太清楚存储的代码与算法设计,但是,我们比较一个数据,总会有点眉目:
如一个RAID组,分成2个部分,我们就假定part1、part2。当part的iops为150的时候,part2的iops才30,那么,虽然是同样的raid组,虽然part1的命中率比part2要高(part1 15%,part2大概5%),但是,part2的响应时间能保证在10ms,而part1则可能就是50ms甚至更高。
这里说明了什么问题?
很有可能这里就是瓶颈的所在,一个逻辑磁盘,也就是USP的ldev,当接收到一定量的io的时候,产生了瓶颈,发生了严重的等待,甚至是拐点的出现,但是,这个等待不是发生在OS上的,确实是发生在存储内部的,因为以上的数据来自存储本身的监控数据,而不是OS的数据。
如果是存储本身的ldev只能支撑到一定的IOPS,那么,我只能是猜测,存储给一个ldev,分配的资源是有限度的,或者说,一个ldev中存在一个有限的队列,当不能处理超过这个队列的数据时,就发生了严重的等待与拐点。
但是,如果确实是这样,当初设计规划的人,有谁知道这个问题呢?国内的代理厂家?他们根本不懂这些,能帮你装上就不错了,其它的,只能是靠自己了,其实,我们的ldev也不少,一个主机有48个,每个50G,如果这样的话,看样子当初只能规划为每个20G了。但是,增加ldev的数量是否一定能解决这个问题呢?这个天知道。
补充2点,1关于cache size的问题,只是在有些微码版本上是这样,新的微码是64K的,不过升级微码我没有发现有命中率的变化。2中关于怀疑ldev是否有队列的问题,厂家不承认有这个问题。
1、检查所需要的文件集
Powerpath4.3以上要求devices.pci.df1000f7.com 5.1.0.58以上,devices.fcp.disk.rte 5.2.0.17以上
检查文件集
# lslpp -l devices.pci.df1000f7.com devices.fcp.disk.rte
Fileset Level State Description
----------------------------------------------------------------------------
Path: /usr/lib/objrepos
devices.fcp.disk.rte 5.2.0.60 APPLIED FC SCSI CD-ROM, Disk,
Read/Write Optical Device
Software
devices.pci.df1000f7.com 5.2.0.60 APPLIED Common PCI FC Adapter Device
Software
Path: /etc/objrepos
devices.fcp.disk.rte 5.2.0.60 APPLIED FC SCSI CD-ROM, Disk,
Read/Write Optical Device
Software
devices.pci.df1000f7.com 5.2.0.60 APPLIED Common PCI FC Adapter Device
Software
对应的补丁要求(仅仅针对5.2版本)
#instfix -a -ivk IY60183
IY60183 Abstract: Open failure on ESS with FC df1000fa adapter
IY60183 Symptom Text:
Customer sees open failures to FC attached disks across a
McData or Cisco switch. I/O hangs.
across the FC adapter.
----------------------------
Fileset devices.pci.df1000f7.com:5.2.0.42 is applied on the system.
Fileset devices.pci.df1000fa.rte:5.2.0.1 is applied on the system.
All filesets for IY60183 were found.
#instfix -a -ivk IY62117
IY62117 Abstract: I/O hang after 1 second cable pull and recovery
IY62117 Symptom Text:
The customer will notice I/Os hanging or I/Os not recovering.
In the error log, there will be logs on the fcs device
indicating link may have gone down and may have come up, and
IOCB timeouts and error logs on fscsi device indicating NPORT
login timouts, and target reset timeouts, etc.
----------------------------
Fileset devices.pci.df1000f7.com:5.2.0.43 is applied on the system.
All filesets for IY62117 were found.
2、安装agent,先解压agent软件
注意:Agent的软件要求版本最好与存储本身的软件版本一致。
#unzip AIX_NAVIAGNTCLI_619.zip
进去到解压后的目录
# cd AIX_NAVIAGNTCLI_619
运行
#smit install_latest
安装目录选择[.],表示本目录
软件列表选择需要安装的naviagent,或者是默认全部(因为本目录下只有agent)
> NAVIAGENT ALL
+ 6.19.0.4 Navisphere Disk Array Management Tool (AGENT)
> NAVICLI ALL
+ 6.19.0.4 Navisphere Disk Array Management Tool (CLI)
选择接受许可协议
ACCEPT new license agreements? Yes
回车安装
如果安装成功,将会自动在/etc/inittab中增加
naviagent:2:wait:/etc/rc.agent > /dev/console 2>&1
安装完成后,在启动之前,还需要配置agent
#vi /etc/Navisphere/agent.config
在如下部分增加:
user root # only on this machine
#user sblue@picasso # individual user "sblue" on host "picasso"
#user lgreen@hannibal # individual user "lgreen" on host "hannibal"
user system@192.168.168.190
user system@192.168.168.191
红色部分为需要增加的部分
3、安装powerpath ODM补丁
# zcat EMC.AIX.5.2.0.3.tar.Z| tar -xvf -
x ./README.5203, 21598 bytes, 43 media blocks.
x ./EMC.AIX.5.2.0.3, 15360000 bytes, 30000 media blocks.
#smit install_latest
选择安装软件列表或者是全部(假定本目录下只有该补丁)
> EMC ALL
+ 5.2.0.3 EMC CLARiiON Fibre Channel Support Software
+ 5.2.0.3 EMC CLARiiON HA Concurrent Support
+ 5.2.0.3 EMC Symmetrix AIX Support Software
+ 5.2.0.3 EMC Symmetrix Fibre Channel MPIO Support Software
+ 5.2.0.3 EMC Symmetrix Fibre Channel Support Software
+ 5.2.0.3 EMC Symmetrix HA Concurrent Support
如果在Symmetrix或者是CLARiiON不足的环境,可能会包安装错误,根据实际环境决定这个错误是否有影响,如有Symmetrix,CLARiiON的安装则会报错,反之一样。
如果在非ha的环境下,EMC.Symmetrix.ha.rte与EMC.CLARiiON.ha.rte也可能会出现安装错误,如果是非ha就没有关系的了。
如一般在单机情况下使用Clariion存储,如cx700,cx3-80等等,只需要安装第一个文件集即可。
4、安装powerpath
#gunzip EMCpower.AIX.4.5.1.tar.gz
# tar xvf EMCpower.AIX.4.5.1.tar
x EMCpower_install, 9830400 bytes, 19200 media blocks.
#smit install_latest
安装目录选择本目录
软件列表选择Powerpath或者是全部(本目录下只有powerpath)
>EMCpower ALL
+ 4.5.1.0 PowerPath Base Driver and Utilities
+ 4.5.1.0 PowerPath Consistency Group Extension and Utilities
+ 4.5.1.0 PowerPath HighRoad Extension and Utilities
+ 4.5.1.0 PowerPath Multi_Pathing Extension and Utilities
+ 4.5.1.0 PowerPath Multi_Pathing Extension for Active Active
+ 4.5.1.0 PowerPath Multi_Pathing Extension for Active Passive
+ 4.5.1.0 PowerPath Multi_Pathing Extension for Clariion
回车,接受协议,开始安装。
安装完成后,在/etc/inittab中,会增加一行
rcemcpower:2:wait:/etc/rc.emcpower set_ipldevice > /dev/console 2>&1
安装之后,需要输入序列号
#emcpreg -install 输入powerpath序列号
以下是powerpath的管理命令
# powercf -q
#powermt config 产生Emcpower设备
#powermt display dev=all 查看所有Emcpower设备及状态
#powermt display paths 查看光纤卡到EMC的路径
注意:先安装odm补丁,再安装powerpath,安装完成后需要重新启动一下。
安装过的补丁与powerpath可以通过如下命令查看
# lslpp -l EMC*
Fileset Level State Description
----------------------------------------------------------------------------
Path: /usr/lib/objrepos
EMC.CLARiiON.fcp.rte 5.2.0.3 COMMITTED EMC CLARiiON Fibre Channel
Support Software
EMCpower.base 4.5.1.0 COMMITTED PowerPath Base Driver and
Utilities
EMCpower.consistency_grp 4.5.1.0 COMMITTED PowerPath Consistency Group
Extension and Utilities
EMCpower.hr 4.5.1.0 COMMITTED PowerPath HighRoad Extension
and Utilities
EMCpower.multi_path 4.5.1.0 COMMITTED PowerPath Multi_Pathing
Extension and Utilities
EMCpower.multi_path_aa 4.5.1.0 COMMITTED PowerPath Multi_Pathing
Extension for Active Active
EMCpower.multi_path_ap 4.5.1.0 COMMITTED PowerPath Multi_Pathing
Extension for Active Passive
EMCpower.multi_path_clariion
4.5.1.0 COMMITTED PowerPath Multi_Pathing
Extension for Clariion
Path: /etc/objrepos
EMC.CLARiiON.fcp.rte 5.2.0.3 COMMITTED EMC CLARiiON Fibre Channel
Support Software
5、卸载powerpath
注意,确保先停止agent
# /etc/rc.agent stop
删除powerpath盘
#powermt remove dev=all
删除所有hdiskpower*与hdisk*,如
删除EMC的hdiskpower[x]
#lsdev -Ctpower -cdisk -F name | xargs -n1 rmdev -dl
#rmdev -dl powerpath0
#删除EMC CLAR硬盘
#lsdev -CtCLAR* -F name | xargs -n1 rmdev -dl
卸载软件
# smit remove
在SOFTWARE name上,用F4或者Esc+4打开列表
AIX-rpm-5.2.0.50-1
EMC.CLARiiON.fcp.rte
EMC.Symmetrix.aix.rte
> EMCpower.base
> EMCpower.consistency_grp
> EMCpower.hr
> EMCpower.multi_path
> EMCpower.multi_path_aa
> EMCpower.multi_path_ap
> EMCpower.multi_path_clariion
并用F7或者Esc+7多选,选中EMCpower的部分,就是powerpath的安装软件包。
在如下选项中
PREVIEW only? (remove operation will NOT occur) no
REMOVE dependent software? no
EXTEND file systems if space needed? no
DETAILED output? no
确认不是仅仅是review,REMOVE dependent software一般采用默认值no即可,如果确认需要,可以采用yes来删除依赖的相关软件。
回车执行完后,powerpath就卸载删除了。
6、故障处理
在一些老的powerpath版本如4.2上面,如果hdiskpower出现混乱,如pvid的混乱或者是minor does not match with the hdiskpower number这样的事情,如
#ls -Ralsi dev|pg|grep hdiskpower
4258 0 brw------- 1 root system 47, 12 Mar 28 14:48 hdiskpower0
4392 0 brw------- 1 root system 47, 13 Mar 28 14:48 hdiskpower1
4394 0 brw------- 1 root system 47, 14 Mar 28 14:48 hdiskpower2
可以采用如下方法重新做
vary off volume groups on SAN (if any):
- for i in $(lsdev -Cc disk | grep hdiskpower | awk '{print $1}')
- do
- odmdelete -q name=$i -o CuAt
- odmdelete -q name=$i -o CuDv
- odmdelete -q value3=$i -o CuDvDr
- done
#odmdelete -q name=powerpath0 -o CuDv
#odmdelete -q name=powerpath0 -o CuAt
#rm /dev/powerpath0
这里移除老的powermtpath软件
#cd /dev; rm hdiskpower*; rm rhdiskpower*
#savebase -v
#reboot
这里再安装新的powerpath软件,并重新配置
# powermt config
或者
vary off volume groups on SAN (if any):
#cd /dev
#echo hdiskpower* | xargs -n1 rmdev -dl
# rmdev -dl powerpath0
每一个光纤卡执行
#rmdev -Rdl fcs(x)
执行cfgmgr与emc_cfgmgr
最后执行
#powermt config