冬瓜头答疑:磁盘阵列内部FC-AL的性能问题
冬瓜头答疑:磁盘阵列内部FC-AL的性能问题
问:
大多数磁盘阵列都是通过两个控制器后端的端口,组成1/2/4条FC-AL环,来连接所有磁盘。
FC-AL仲裁环的协议规定,同一时刻只有两个设备能传送数据,也就是说,在一条FC-AL环里面,控制器的一个后端端口充当了发起者的角色,环上的一个硬盘充当了目的地的角色,在一个时刻里,后端端口发出数据读写指令,只有一个硬盘能响应这个指令并传输数据。
那是否就意味着,一条FC-AL环的总体性能,取决于一个硬盘的读写性能?15K转速的硬盘,持续读写带宽不到70MB/S,IOPS不到400。那像IBM DS4800、EMC CX-80之类的,总共4条环,后端的性能岂不是只有280MB/S、1600 IOPS?除了以阵列里CACHE来提高速度,我不知道有没有别的办法,或者,磁盘阵列内部采用的不是工业标准的FC-AL?
答:
这个问题非常好,而且也非常经典。要解释这个问题,需要明白三点:
1.FCAL的传输通道的确同一时刻只允许两点间独占通道带宽来传输数据。
2.控制器在有足够IO请求的情况下绝对不会让通道闲着,会充分利用带宽。
3.磁盘的外部传输率和内部传输率。FCAL环路上存在多个设备的时候,由于控制器的轮询策略充分利用带宽,整个系统在外体现为一个永远都在读写数据状态而不是寻道状态的大虚拟设备(《大话存储》第53页也有描述),一旦某个设备需要寻道,那么就让其他设备来传输数据来弥补所浪费的时隙,所以整体系统可以发挥出一个单一设备的内部传输率。
下面是详细总结:
当FCAL环路上存在多个设备的时候,控制器向谋设备发起IO之后,该设备需要一定的寻道时间,而此期间内AL环出于被释放的状态,此时控制器依然可以向另外的设备发起IO,也就类似于先把该做的命令全部下发,待某个设备寻道完成请求将数据返回给控制器的时候,往往是多个设备都出于积攒状态,也就是他们都干完活了,准备交差了,而此时只能排队一个一个来,大家都鼓着劲呢。明白了这一点,我们就往下看。
关于IOPS数值的矛盾:
IOPS与吞吐量是一对矛盾关系。在关注IOPS的环境下,IO SIZE往往比较小,因为只要较小的SIZE才不至于充满带宽达到瓶颈,所以,要达到较高的IOPS,IO SIZE需要比较小。而这种情况下控制器将IO请求发送给设备之后,多个设备出于积攒状态,他们会仲裁从而一个一个的分别得到传输数据的机会,由于IO SIZE很小,所以每次传输数据很快就结束,这样,一个IO就飞快的完成了,而上一个设备的IO完成之后,下一个设备接着也会很快完成,因为他已经出于积攒态,待返回的数据早已在cache中准备发送。
这样的话,这个整体系统对外就表现为一个永远在完成IO而不需要寻道的虚拟设备。而如果AL环上除了控制器之外只有一个设备,那么环路就必须等待它寻道,因为寻道的时隙内,AL环上已经没有其他设备可工作了。
然而,AL环的这种弥补寻道时隙的效果也不是设备越多就越好,不同的设计和产品都有自己不同的最佳设备数量,目前的经验值为64个,也就是环路总容量的一半,超过这个值,性能不会再有提高,甚至有所下降。
我们可以推论出另外一个结论,也就是,慢速设备,比如寻道时间长的设备,越是慢速设备,组成AL环路之后其带来的整体提升越大,越是快速设备,高规格的设备,组成AL环路之后,提升的性能越有限。这就是AL环或者其他共享总线/环方式弥补设备自身处理产生的时隙的效果。
关于吞吐量/带宽值的矛盾:
经过上面的描述,我们已经对共享总线/环传输方式的底层机制以及其效用有了一个很好的理解了。在重视和追求高吞吐量,也就是充分利用带宽的环境下,IO SIZE往往非常大,以至于在较低的IOPS值下就已经可以吃满通道带宽了。
往往这种情况下,上层所发出的IO都是连续大块的IO,以至于AL环之上的设备寻道时间可以大大降低,这就使得设备更快的出于积攒态,准备向外发送数据。我们知道磁盘外部传输率由于磁盘内部不断换道被打断,致使其数值较内部传输率降低了大约20倍。而AL环的效用就是弥补寻道所浪费的时隙,所以整体系统的外部吞吐量,就被提升了上来,从而解决了这个矛盾。
冬瓜头答疑:磁盘阵列内部FC-AL的性能问题的更多相关文章
- java对象头信息和三种锁的性能对比
java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 |-------------------------------- ...
- [ZT]DAS\NAS\IP SAN\FC SAN之区别
DAS:服务器直接后挂存储设备,最经济的一种结构. NAS:网络上直接挂接的存储设备,其实就是处于以太网上的一台利用NFS.CIFS等网络文件系统的文件共享服务器. SAN是网络上的磁盘,NAS是一个 ...
- DB9 公头母头引脚定义及连接、封装
DB9 公头母头引脚定义及连接.封装 转自:http://blog.csdn.net/yangshuodianzi/article/details/8997478 1.实物及引脚简介 在做开发的时候经 ...
- RAID磁盘阵列介绍
磁盘阵列 RAID介绍 一.简介: 磁盘阵列(Redundant Arrays of Independent Drives,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意. 最初是由加利福尼亚 ...
- FC网络学习笔记02 -网络配置方法
随着新一代飞机的综合化航电系统对通信需求的不断提高,传统的ARINC429.1553B总线的传输速率分别只有100Kbps和1Mbps,其带宽已远远不 论文联盟 http://Www.LWlm.cOm ...
- 磁盘阵列RAID
磁盘阵列RAID 年提出的.RAID名为独立 ...
- 存储之磁盘阵列RAID
存储之磁盘阵列RAID RAID是由美国加州大学伯克利分校的D.A. Patterson教授在1988年提出的.RAID名为独立冗余磁盘阵列(RedundantArray of Indepe ...
- iSCSI存储系统知识
一.概述 SCSI 即小型计算机系统接口(Small Computer System Interface:简写:SCSI),一种用于计算机和外部设备之间(硬盘.光驱.软驱.打印机等)系统级接口的独立处 ...
- 【转】怎样查出SQLServer的性能瓶颈
怎样查出SQLServer的性能瓶颈 --王成辉翻译整理,转贴请注明出自微软BI开拓者[url]www.windbi.com[/url]--原帖地址 如果你曾经做了很长时间的DBA,那么你会了解到SQ ...
随机推荐
- 在BCH硬分叉后防止重放攻击-1
导致新加密货币的硬分叉为加密交换运营商带来了独特的机遇和挑战.Poloniex在最近的Bitcoin Cash硬叉之后面临的一个挑战是保护我们的客户免受重播攻击.由于SV链后面的开发团队选择在分叉后近 ...
- 【gRPC使用问题4】
1.进行gRPC服务调用出错:服务不可用 2.解决方案: linux系统部署的节点服务的确不可用,愿意是 系统是泡在虚拟机里面, 计算核数只有一核,太小,服务没有跑起来.
- 已经卸载了hyper-v 仍然提示 vmware 与 hyper-v 不兼容;天天模拟器,提示VT模式没有开启,BIOS里面已经设置过了
环境win10,vm的失败和模拟器的失败都是hyper-v冲突导致的...网上看了很多千篇一律的都只是提到了卸载hyper-v,实际上我电脑仅仅卸载hyper-v是不够的. 解决办法: 卸载 hype ...
- 使用独立的log4net.config文件配置log4net,将日志记录到Mysql数据库【原创】
开发环境: VS2013, Asp.Net MVC 4.0, .Net Framework 4.0, Log4net 1.2.13.0, Mysql.Data.dll,6.8.3.0 设置步骤: 1. ...
- POJ1966 Cable TV Network
原题链接 割去点使得无向图不连通,和最小割相似. 我们可以将点转化成边,这样就能跑最小割了. 枚举每两个不能直接到达的点\(S,T\),使得删去一些点(除去这两个点)使得这两个点不连通(若两点能直接到 ...
- Python之路(第二十六篇) 面向对象进阶:内置方法
一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...
- 设计模式之生成者模式java源代码
假设要组装一辆自行车,并且自行车就是车轮和车架组成. Builder对应于组装自行车所使用的车轮和车架 ConcreteBuiler对应于自行车的车轮和车架,同时可以返回一辆自行车. Product对 ...
- NotificationMangerService处理显示通知
设置——>应用——>点击“已下载”列表中的任一APP,如图: 代码位置:Settings\src\com\android\settings\applications\InstalledA ...
- 如何上传Packages到PyPI并批量抓取
1.如何上传包到PyPI ? 更新中... 2.批量抓取simple网站第三方模块 https://pypi.python.org/simple/ 3. 第三方模块的安装和使用 python set ...
- JQuery中after() append() appendTo()的区别
首先 after() 是追加在元素外边而append() appendTo()是追加在元素里面. $(selector).after(content) $("span").afte ...