把排队落到实处——SATA-Ⅱ本机命令排队
在Serial ATA Ⅱ对Serial ATA 1.0所做的诸多功能扩展中,只有一项是与性能密切相关的,它就是本机命令排队(Native Command queuing,也称全速命令排队,简写为NCQ)。借助SATA 1.0改进的DMA机制,SATA Ⅱ本机命令排队结束了PATA命令排队可有可无的尴尬历史,能够更好地满足入门级服务器和网络存储设备的要求,也顺应了PC应用环境向多线程发展的趋势。
并行ATA(PATA)命令排队协议1997年就被加入ATA/ATAPI-4规范,可直到现在仍仅有一家硬盘厂商(HGST,原来的IBM)提供支持该协议的产品。难道是PATA命令排队实现起来太过复杂?答案当然是——非也。
PATA排队难有作为
在这个即将被抛弃的时刻,PATA的“罪恶”自然是罄竹难书。如此说来,再多拎出一条似乎也不能算落井下石。
组成PATA排队协议的命令包括Read DMA Queued(Ext)、Write DMA Queued(Ext)和Service,其中后者是出于PATA DMA的总线从属性需要。前面我们已经介绍过,PATA是非对等的协议,也即硬盘不能主动与主机通信,必须由主机定期交替轮询(同一通道内的)主盘和从盘。这样一来,硬盘在接收到来自主机的命令后,要么立即执行,要么必须通过设置注意标志和Service位来通知主机何时准备就绪执行命令。主机发现Service位后,会发出一条Service命令,以便从硬盘得到将执行哪一条待执行命令的信息。
由于队列的客观属性决定了其中至多有一条命令能够立即执行,因此在深度大于1的队列中Service命令不可避免。由于Service位不包含任何对即将执行命令的识别信息,所必需的命令识别信息要以标记值的形式与数据请求一同传输,而且仅供主机用以设置DMA引擎和接收数据缓冲区,主机不能预先掌握硬盘所设置的辅助位来自哪条命令,数据传输周期开始前也无法设置DMA引擎。本来最清楚数据存放在何处和怎样访问的硬盘,现在反倒被置于完全被动的地位,有关数据传输的所有准备工作和决策都是由主机做出的,自己只剩下设置Service位,等待主机下一次查询的份儿。最终的结果是,受PATA DMA的总线从属性限制,PATA命令排队带来的性能改善,很轻易地就被协议开销抹杀了。在队列深度较浅的时候,性能甚至还比不排队的情况有所下降——连“聊胜于无”都算不上。
所以,尽管接收到来自主机的命令就执行(而不是排队)看起来很傻,可是PATA硬盘的设计者们基本上别无选择。没有命令排队(有也发挥不了多大作用)的后果就是,随着并发访问程度的提高,PATA硬盘与SCSI硬盘之间的性能差距被越拉越大(见图)。

PATA硬盘的IOPS性能随队列深度提高的幅度明显不及SCSI硬盘
在传统的PC单线程应用中,PATA硬盘可以按照主机软件安排的顺序执行命令,因此没有命令排队还不是很严重的问题。但是,随着超线程技术的出现,多线程应用将逐渐在PC领域普及,对硬盘端排队能力的需求渐趋迫切,SATA Ⅱ本机命令排队可谓生逢其时。
FPDMA反客为主
既然PATA DMA的总线从属性是命令排队有名无实的“元凶”,SATA Ⅱ本机命令排队就通过单方DMA(First Party DMA,FPDMA)的机制来解决这个问题。虽然继承了PATA的非对等“传统”,但SATA利用FPDMA促成主机控制器为排队命令的数据传输选择适当的目标或源物理内存区域(允许硬盘经由Scatter/Gather列表直接寻址)并初始化DMA引擎,进而可以自己安排传输数据的时间和顺序。
为了实现硬盘与主机之间的数据和状态通信,SATA 1.0定义了三种类型的帧信息结构(FIS),分别是FPDMA Setup、DMA Active和Set Device Bits,SATA Ⅱ本机命令排队直接使用它们而无需修改现有SATA协议,不过增加了Read FPDMA Queued和Write FPDMA Queued这两条命令。
SATA Ⅱ本机命令排队允许支持和不支持该协议的硬盘连接在一个主机控制器上,当然更能够共存于同一磁盘子系统中。主机控制器驱动程序通过识别设备(Identify Device)功能检测硬盘是否支持SATA Ⅱ本机命令排队,本身还要支持Read FPDMA Queued和Write FPDMA Queued,因此必须做出相应的改动。
5月7日,Intel在WinHEC 2003会议上发布了高级主机控制器接口0.95版规范(Advanced Host Controller Interface,AHCI),为驱动程序和系统软件提供了发现并实施命令队列、热插及电源管理等高级SATA功能的标准接口。AHCI最终规范预计在2004年早期推出,而基于0.95版规范的AHCI SATA独立主机控制器则力争于2003年年底上市。
SATA在DMA方式上的改进,不仅避免了PATA命令排队的协议开销,还提高了无序数据传送的效率。由于PATA DMA的总线从属性和轮询间隔造成的等待,PATA硬盘只有在收到Service命令后,才能将数据写入缓存,然后整块传输;在SATA中,硬盘决定何时开始传输数据,也就是说,从盘片中读取数据后,不等主机完成读时序和置Service位启动DMA设置,立刻就可以利用非零偏移(no-zero offset)数据传输。以磁头错过起始LBA的32扇区数据传输为例,SATA硬盘不是以无序数据传送方式将数据写入高速缓存,然后再启动32扇区DMA传输,而是建立一个部分DMA传输——譬如后16个扇区的DMA传输,等起始LBA旋转到磁头下方,硬盘立刻发出针对前16个扇区的新一条Read FPDMA Queued命令。
由于FPDMA可以充分利用无序数据传送,即使队列深度为1,SATA也可以提高性能。利用明显高于硬盘持续传输率的接口带宽,SATA能通过非零偏移FPDMA Setup先传输第一批数据扇区的数据,然后断开与主机控制器的连接避免无谓地占用带宽,待起始LBA到达磁头下方再启动第二个FPDMA Setup传输其余数据。这实质上就是利用了命令排队的功能,而且在数据传输过程中主机控制器也的确可以插入其他命令。
小结:(硬盘内部)命令排队的本质是什么?就是让硬盘来决定何时及以怎样的形式执行每一条命令以达到节省时间、提高效率的目的。可是在PATA中,硬盘只有排列命令顺序的能力,最关键的时间因素却掌握在主机(控制器)手里,硬盘准备好的数据(往往)不能立即传输给主机,由此产生的无谓等待和命令开销很轻易地就将命令排队所能带来的优势化解为无形,接到命令立即执行成为了PATA硬盘的主旋律。SATA的FPDMA方式帮助硬盘“夺回”对时间因素的控制权,真正可以自主决定何时传输数据,是本机命令排队得以发挥作用的必要保障。
差距源于定位
虽说看起来SATA Ⅱ本机命令排队比PATA要简洁高效许多,但那主要应归功于DMA方式的改变,命令排队本身的功能仍然受到了PATA“遗传”的局限,譬如排队命令与非排队命令不能混合使用、发生错误将导致硬盘放弃队列中的全部命令(主机必须管理恢复过程),不过与SCSI命令排队最大的区别还是队列类型及深度。
SCSI命令排队支持三种队列类型,分别是简单队列(Simple Queue)、有序队列(Ordered Queue)和队列头(Head of Queue)。ATA命令排队只是简单队列,即硬盘享有以任意顺序排列和优化命令的完全自主权。
队列头属性赋予某一命令以优先权,让它排在某个现有队列的前头,以优先响应紧急的I/O请求。如果出现了新的更为紧急的I/O请求,只需发出相应的命令并赋予队列头属性即可,后进先出(LIFO)排序方案随后就会限定优先执行这一新的命令。不过,SATA Ⅱ本机命令排队虽然不能对队列排定优先级,但却可以发出一条虚拟的队列头命令来打乱现有队列,给新的命令让路——代价是队列中未完成的命令必须重新发送。
有序队列要求以命令的接收顺序执行命令,杜绝了在硬盘内部调整执行时间和进行优化的可能性。作为SCSI命令排队中的特例,有序队列用于多启动程序(发起者)/多目标环境,启动程序突然将必须严格遵守的命令排序方案发送给硬盘,随后就释放总线,直到满足该I/O请求为止。通过发送一个由上述三种类型队列组成的混合队列,SCSI命令排队可以提供比SATA Ⅱ本机命令排队更为强大的功能。
至于队列深度的规定,ATA最大为32级,SCSI为256级,两种新兴的串行接口(SATA和SAS)也不例外。对于PC和入门级服务器、网络存储设备,SATA的32级深度已经足够,而SCSI面向的多主机/多设备应用环境则要求更深的队列深度。不过,由于队列越深(实现)成本也就越高,并且满深度利用队列时大量的待处理命令反倒可能成为性能瓶颈,因此并行SCSI硬盘通常“只能”达到64级深度。Marty Czekalski认为,多数SAS硬盘将采用支持128级深度的设计,从而与FC-AL硬盘相当。
在单主机/单硬盘配置中,由于单主机产生不了足够的待处理请求,SCSI的队列深度得不到充分利用,只能靠主轴转速的优势提高性能。随着作业的复杂程度不断提高,SCSI的优势才愈加明显。虽然SAS 1.0的命令排队功能与并行SCSI相比没有什么变化,但是它却具有无需经过共享总线仲裁的优点,并可以利用串行点对点连接赋予的全双工能力在突发数据传输的同时反向接受命令,为命令排队功能提供了更为广阔的发展空间。
本页部分内容改编自希捷科技TP-342号技术论文《全速命令排队》(2003年2月)

用户评论