在做性能测试的时候,主机端有时会成为瓶颈,所以测试的时候往往拿很牛B的主机,然后再插上无数个HBA卡来测试。
有时,可能即使弄了很猛的主机,但是测试结果还是达不到最优,可以注意一下主机端对于挂过来的卷的queue depth设置。
下面的文章是将硬盘的NCQ技术的,有涉及到这方面的一些基础东西:
--------------------------------------------------------------------
NCQ技术深度解析
纵观我们电脑中的储存设备,对机械设备驱动性能要求最强的当属硬盘了。机械设备所固有的属性在很大程度上制约了数据的读取速度,从而影响了硬盘的性能。要想提升硬盘的性能,我们通常会想到两个最为有效的方法:对硬盘机械的物理性进行改进和硬盘机械的流程顺序添加智能化。第一种有效方法的实现是以大幅增加产品成本为代价的;而第二种则不同,产品成本的增加在大规模生成的时候几乎可以忽略不计。而本文所要讨论的命令排序就是属于第二种有效提升硬盘性能的技术。NCQ技术为SATAⅡ规范中重要组成部分,也是SATAⅡ唯一对性能有关系的技术。NCQ为Native Command Queuing的缩写,其实它仅仅是在以前运用于SCIS的TCQ(Tagged Command Queuing)技术改进而来得。好了,闲话就不多说了。让我们一起进入NCQ的旅程中。
NCQ、SCSI TCQ、PATA TCQ和SATA TCQ四者的关系
当读者看到TCQ的时候,可能会感到有些陌生。TCQ和本文所要谈的NCQ相同,也是一种命令排列技术,而且从严格意义上来讲,NCQ技术也就是在ATA TCQ技术上改进而来的,两者同样支持32级的命令深度,但是NCQ对ATA TCQ在技术上存在的缺陷进行了改进从而与TCQ相区分。说到这里,我们要对"命令深度"进行一下简单的说明,其实这个概念很简单,它就是指硬盘需要处理的寻址命令的个数;而下面我们提到的"命令深度级数"就是将"命令深度"具体化,比如NCQ最高可以支持命令深度级数为32级,那么换句话说就是,NCQ可以最多对32个命令指令进行排序。接着上面说,我们需要注意的是,NCQ为SATA专有的技术而TCQ的运用范围就较广了——TCQ运用在SCSI硬盘和PATA硬盘上。其实,TCQ最初是使用在SCSI硬盘上,而PATA TCQ也就是在1997年才被加入到了ATA/ATAI-4规范中。ATA TCQ与最初使用在SCSI硬盘上的TCQ存在了很大的差别:首先,SCSI TCQ支持三种队列类型,他们分别是简单队列(Simple Queue)、有序队列(Ordered Queue)和队列头(Head of Queue)而ATA TCQ仅仅支持简单队列(Simple Queue),这样的设计还是很合理的,毕竟简单队列是最为常用的队列排序,在高端服务器上当命令深度达到256级的时候其余两者队列排序也很难用到,更何况ATA TCQ和NCQ都定位在主流市场,最大命令深度只能支持到32级呢。其次,SCSI TCQ在队列深度上能够支持256级而ATA TCQ只能支持到32级,支持队列深度越高其造成成本也就越大——硬盘缓存的提升是必不可少的,在支持NCQ技术的硬盘上全部采用了8M或者更多的缓存上可以看见,而且如果当深度过大会造成大量指令等待执行,反而会造成系统的瓶颈,所以定位于主流市场的ATA TCQ和NCQ支持32级命令深度已经很合适了;再其次,当ATA TCQ出现错误的时候,将会导致硬盘放弃队列中的全部指令而等待主机对其进行重新管理和恢复,并且排队指令与非排队指令不能混合使用。那么排队指令与非排队指令不能混合使用会给我们的性能带来哪些影响呢?显然,硬盘对命令指令的排序需要时间的,当命令深度级数不是很大的时候可能这个排序的时间很短,但是随着命名深度级数的增大,这个时间就会显得尤为突出。在有的情况下,系统对数据的请求对应硬盘的LBA是连续的,此时并不需要对命令指令进行排序就可以达到排序后的效果,这样就为系统争取到了宝贵的时间使得性能得以提升。SCSI TCQ技术支持该功能显然比ATA TCQ不支持要强劲,毕竟它定位不同。
而PATA TCQ与SATA TCQ的关系就更为密切了。众所周知,现有的SATA硬盘可以分为两大类——本地SATA(Native SATA)和桥接SATA(Bridge SATA),而本地SATA对应了NCQ;桥接SATA对应了SATA TCQ。在前文我们已经提到,在1997年业内厂商便把PATA TCQ加入到了ATA/ATAI-4规范中,而纵观ATA时代的产品也就只有IBM硬盘支持该技术。造成这种情况的原因主要有两个:(1)当时的Intel并不支持超线程技术;(2)当是绝大多数的软件都是绝大多少属于同步I/O软件,也就是说程序的I/O功能的再次调用直到上次实际的I/O操作的完成后才进行,这样在硬盘中仅仅只有一个命令而再将命令排序执行就没有什么意义了。
但随着Intel的超线程技术的普及和应用环境的多任务化,以及异步I/O软件的大量涌现,市场对于命令队列技术有了需求。而且现在已经是SATS结构时代,于是SATA TCQ便应运而生了。我们都知道,桥接SATA硬盘上有一颗桥接芯片,该芯片除了提供将串行数据转换成为并行数据的功能外,有些还可以支持TCQ技术(如,Marvell 88i8030桥接芯片),只要再有一块硬盘控制器便能够实现对TCQ技术的支持,所以SATA TCQ的产生和发展也就成为必然了。可能这时读者会说到,PATA TCQ与SATA TCQ就是一回事。不错,PATA TCQ与SATA TCQ原本就是一回事,只是硬盘的接口不同而已。
支持队列类型
队列深度
排队指令与非排队指令混用
SCSI TCQ
简单队列、有序队列、队列头
256级
YES
PATA TCQ
简单队列
32级
NO
SATA TCQ
简单队列
32级
NO
NCQ
简单队列
32级
NO
小知识:三种队列比较
(1)简单队列(Simple Queue)是最为常用的一个技术,属于本地命令排序技术,是三种队列类型中性能最高的一种;
(2)有序队列(Ordered Queue)则与简单队列(Simple Queue)不同,其属于主机命令排列技术——命令指令可以在硬盘控制器方面进行一次排序,等指令到了本地设备的时候将会调用简单队列(Simple Queue)对前面的一次排序进行矫正,这样可以缩短简单队列(Simple Queue)在本地对命令指令排序的时间;
(3)队列头(Head of Queue)则可使一个系统在接口内重新安排命令顺序和重新确定某些命令的优先级,和有序队列(Ordered Queue )一样,当指令到达本地以后还是会调用简单队列(Simple Queue)对其排列的指令进行矫正。
揭开命令排队的秘密
在我们了解硬盘的NCQ技术以前,有必要对硬盘读写数据的过程进行简单的了解。当我们需要调用硬盘上的某个数据的时候,硬盘将会依次做出如下反映:寻找该数据的目标磁碟(platter,每个硬盘所拥有的磁碟数量不同)并且访问该磁碟,然后开始寻找该数据的目标磁道(track)找到后对其进行访问,下一步则寻找该数据的目标簇(cluster),然后在该簇内寻址该数据的目标扇区(sector),最后我们的数据就可以在目标扇区中被找到并且传送给硬盘控制器。当我们向硬盘写入数据的时候与数据的读取相同。可以看出,平时一个看似很简单的读取数据在实际的操作中是很复杂的。如果当我们使用异步I/O向硬盘提取或者写入数据的时候(使用具有HT技术的处理器或者多任务软件的时候可以出现这样的情况),我们的硬盘缓存中就可能同时存在了两个或者两个以上的命令等待操作。而往往这些指令所对应的数据分布到了硬盘的不同地方,要完成这些命令的读取就得依次对这些命令进行执行,这样问题就出现了!为了能够清楚的阐述这个问题,我们引入具体的事例为大家说明。我们可以将硬盘上所存储数据的逻辑块地址(LBA,Logical Block Address)当作是一个地区内的你几个朋友地的房子,作为磁头的你在一天中受到几个朋友的邀请去"做客"。如果你不懂得安排,那么你就可能会按照收到请帖的顺序对朋友进行访问,这个时候你就可能会沿着绿房子→蓝房子→橙房子→红房子的顺序去朋友家做客(如图 1所示);但是如果你知道安排的话,就会提前想想几个朋友家的具体位置,计划出一个行程表,此时你就会沿着绿房子→红房子→蓝房子→橙房子的路线去朋友家做客了(如图 2所示)。显而易见,采用安排的方法可以为你节约大量的时间。而NCQ就是那一张神奇的行程表的自动生成器——当硬盘接收到软件发出的数据请求的时候,NCQ技术可以按照数据的逻辑块地址的位置进行重新的排列,避免出现那种不科学的访问方法。显然,经过重新排序以后可以大大减少了磁头臂来回移动的时间,使数据读取速度更快。
但是需要提醒大家的是,并不是只要使用了具有NCQ技术的硬盘就可以使系统的性能有较大幅度的提升,出现这种现象的原因是由于应用软件的模式所造成的。就目前的应用软件而已,绝大多少属于同步I/O软件,也就是说程序的I/O功能的再次调用直到上次实际的I/O操作的完成后才进行,这样在硬盘中仅仅只有一个命令而排序就无从谈起。为了大家能够更清楚的理解,我们接着上面的事例继续给大家讲述。你仍然作为"磁头"去几个朋友家"做客",但是此时的情况与上次就不同了——当一个朋友向你发出请求的时候,其余的朋友会保持"沉默",直到你已经从朋友那里回到家以后,第二个朋友才开始向你发出邀请,依此类推下去。这个时候,你在同一段时间中就只有一个"任务",根本谈不上安排。而当我们使用了具有HT技术的处理器或者异步I/O软件的时候情况就不同了,HT技术或者异步I/O软件具有允许多个线程并发运行能力,可以让多个应用程序或者同一个程序同时向硬盘发出数据的请求,使得NCQ派上用场。随着超线程技术的普及和操作系统越来越多的运用到多线程软件,相信NCQ技术将会给我们带来意想不到的惊喜。另外,由于NCQ技术可以减少磁头来回做出不必要的移动,所以对于增加硬盘寿命也是很关键的。
ATA TCQ VS NCQ
由于ATA TCQ是一种非对等的协议,所以在命令中有一条Service命令。作为一种非对等协议,硬盘自然不能主动与硬盘控制器进行联系,必须由硬盘控制器定期对其询问。如果当硬盘接收到应用程序发出的两个或者两个以上请求的时候,这时硬盘必须通过设置Service和标签来通知硬盘控制器。当硬盘控制器发现Service位后,就会发出一条Service命令,以便将硬盘将已找到的数据写入缓存进行传输。这样的数据传输的模式使硬盘完全失去了自主性,本来数据已经可以写入缓存进行传输,但是需要等待硬盘控制器的 Service命令,所以NCQ技术通过减少磁头来回移动所争取来的时间轻易被抵消掉。工程师们清楚地发现了这个弊端,从而使得NCQ技术并不存在这样的 "无奈"。虽然,NCQ同样属于了非对等协议,但是通过单方DMA(First Party DMA,简写为FPDMA)机制使得数据的传输主动权掌握在了硬盘自己手上。当硬盘找到数据以后,不需要等待硬盘控制器的Service命令就可以立即利用非零偏转(no----zero offset)进行数据的传输。
简而言之,ATA TCQ具有命令排列的功能,但是数据传输的权力完全由硬盘控制器所掌握,就算是硬盘有最佳的访问数据路线,但是由于必须等待硬盘控制器的Service命令,这样就造成了严重的等待。而NCQ则不同,在FPDMA的帮助下,硬盘可以自行决定数据读取传输的时间,使得NCQ成为真正能够提升系统性能的技术。
结语
NCQ技术的推出可以说已经完全成熟。首先,随着Intel具有超线程处理器的大量普及,使得用户在使用电脑的过程中可以在同一时间对系统申请多个线程得以实现;其次,SATAII标准的硬盘和支持NCQ技术的Intel ICH6R南桥大量推出,在硬件规矩上可以满足用户多线程的需要。但是,NCQ作为一种新兴的技术,在相关的设计方面和设备的支持方面还有待提高的。可以预见,在未来市场中,SATA TCQ与NCQ将会形成一种共存的局面,但是随着SATAII的深入普及,SATA TCQ将会最终的被淘汰出市场,NCQ成为真正的大哥。
阅读(1023) | 评论(0) | 转发(0) |