分享

SATA全速命令队列(NCQ)提高性能

 clover_xian 2012-04-12
高层建筑的电梯与硬盘技术 SATA 接口全速命令队列( NCQ )之间有什么共同之处?二者都具有可靠、高效地输送能力,这使得这两种完全不同的运输机制,在技术上有了非常相似之处。在高层办公建筑内乘坐电梯。当工作人员和来访者进入电梯要去不同的楼层时,他们就按楼层按钮。当许多人在不同的楼层进入电梯,要去往不同的楼层时,电梯并不是按照按钮按下的顺序去停靠楼层,这种方法会给电梯的各种部件造成不必要的磨损,比如: 钢索系统、刹车、液压系统、传动装置 和导向轴等。对于许多乘客来说,当一部笨拙的电梯哼哼唧唧地从一层开到另一层,按照按钮按下的顺序停靠卸栽乘客时,会产生许多额外的等候时间。电梯最顺畅有效的运行顺序是,每次都运行到最近的楼层停靠,每次向反方向运行之前,先要到达最高或最低的停靠点。

  硬盘的 NCQ 技术使用类似的方法来高效地安排和运行数据命令。没有 NCQ 的硬盘像笨拙的电梯一样效率低下,并会按照命令发送到硬盘的顺序来执行它们。有了 NCQ ,硬盘会考虑读 / 写头在盘片上的位置,然后决定最有效的命令执行顺序,像电梯一样,先将磁头移到最近的位置执行命令,再按照相同的方式到下一个位置。

  更特别的是, NCQ 通过让硬盘在内部优化工作负荷或命令的执行顺序,从而提高了硬盘性能并延长了硬盘寿命。在硬盘内部,命令队列对命令进行智能重排,最大程度地减少硬盘的机械定位延迟,有助于改善工作队列的性能。这一点非常重要,因为在今天的计算机系统中,只有硬盘内的所有移动部件是机械装置,包括:磁头驱动臂、盘片等。

  正是这种有效地对传输路径进行排序的能力,最大程度地减小了机械磨损降,优化了性能,使 SATA 硬盘与电梯技术有了相似之处。NCQ 为系统构建商提供了一种方法,可以轻松地将用于台式机的高容量 SATA 硬盘扩大到用于高性能 PC 机、工作站和初级服务器,而且只需为每 GB 容量支付不到 1 美元。

  在“ SATA1.0 技术规范扩充版”引入的大多数先进特性中, NCQ 是一种命令协议,它能允许同一块硬盘在同一时间有多个待执行命令。 NCQ 有一个待执行命令的内部队列,该队列与跟踪待执行命令和已完成工作的机制一起,对队列中的命令进行重新计划或排序。 NCQ 还允许主机在硬盘为另一个命令查寻数据时,对硬盘发出附加命令。这样做的结果是减少了机械运动,降低了盘片的旋转延迟,提高了性能。

  有这样几种方法来最大程度地减少旋转延迟。一种方法是部署更高转速的硬盘,比如具有 10K 甚至更高主轴转速的 ATA 硬盘。然而,具有高 RPM 主轴转速的硬盘却价格昂贵。另一种方法就是根据硬盘磁头的旋转位置,确定下次应该执行的最佳命令,并对待执行命令重新排序。还可以使用无序数据传送方式来降低旋转延迟,这种特性不需要磁头首先去访问初始 LBA (逻辑块寻址)。磁头可以在目标 LBA 内的任意位置开始读取数据。当磁头定位在正确的磁道上方时,就开始读取数据,错过的数据待磁盘旋转回来后再补上即可;而不需要为回到被请求数据的第一个 LBA 上方进行旋转。

  NCQ 通过在较少的磁盘旋转中处理更多的 IOPS 来减少旋转延迟。结果是在繁重工作负荷中,有更多的 IOPS 被处理了。 NCQ 是动态的,工作负荷越重,硬盘性能越高。

  当明显需要对待处理命令重新排队以减小机械负担,改善输入 / 输出( I/O )延迟时,这样做要比简单地在队列中收集命令效果好。重排序算法使用一个被称为“基于寻道和旋转优化的命令重新排序”,或者称为标记命令队列( TCQ )的过程,优化了目标数据的线性和角度定位,从而最大程度地缩短总服务时间。命令队列减轻了机械负荷,降低了机械磨损,延长了硬盘寿命。 NCQ 是执行标记命令队列( TCQ )的高效协议。与 TCQ 不同的是, SATA NCQ 降低了队列算法导致的额外开销。 TCQ 没有在 ATA 硬盘中获得广泛采用的原因,是其所提高的性能被额外开销给抵消了。 SATA 通过采用高效的状态返回机制(无竞争)、低中断开销和第一方 DMA 等技术,极大地降低了额外开销,上述这些技术是无法在 PATA 中实施的。

无竞争状态返回机制

  这一特性消除了传统上硬盘为了返回状态而与主机之间必须进行的“握手”过程,允许在任意时刻交流任意命令状态,使硬盘可以顺序或者同时完成多个命令。

中断聚合

  硬盘为了完成一条命令通常会中断主机许多次。中断越多,主机的处理负担就越重,性能就越低。 NCQ 将处理每条命令的平均中断次数降低到了一次。如果硬盘在很短的时间内完成多条命令(这在工作负荷繁重时经常出现), NCQ 可以将单个中断聚合起来,这样主机控制器只需处理一个中断就可以了。

第一方 DMA ( FPDMA )

  NCQ 采用第一方 DMA 技术,使硬盘能够在没有主机软件干预的情况下,为数据传输设置直接内存访问( DMA )操作。硬盘通过向主机控制器发送一个 DMA Setup FIS (桢信息结构)来选择 DMA 内容 。这一 FIS 为被设置的 DMA 指定了命令标记。主机控制器根据标记值,为该命令向 DMA 引擎内装载 PRD 表指针,然后,数据传输就可以在没有软件干预情况下进行,硬盘由于可以自己选择所传送的缓冲区,就能够更有效地对命令重新排序。

对 NCQ 的详细说明

  NCQ 由三个主要过程组成:

  在硬盘中建立一个命令队列

  为每个命令传输数据

  返回完成命令的状态

建立队列

  当硬盘接到一个命令时,它需要知道是该将其放入队列,还是立即执行它,以及使用何种协议(比如 NCQ 、 DMA 或 PIO 等)来处理它。硬盘根据主机发送的特定的命令操作代码( opcode )来决定使用的协议。

  为了使 SATA 能够利用 NCQ ,人们开发了两个特殊的 NCQ 命令: Read FPDMA Queued 和 Write FPDMA Queued 。这两个命令是对 LBA 和扇区计数命令的扩展, LBA 和扇区计数命令是为满足今天的大容量硬盘的需要而设计的。这些命令还包含了支持高可用性应用的 FUA (force unit access) 位。当一个 Write FPDMA Queued 命令的 FUA 位被设置时,硬盘会在标记该命令无错完成前将数据提交给介质。通过对写命令使用 FUA 位,主机可以管理硬盘内部缓存中还没有提交给盘片的数据。

  除此之外,每个进入队列的命令都会被分配一个唯一的标记值,用来识别主机和硬盘之间所有待执行的命令。标记值的范围是 0 到 31 (硬盘可以支持小于 32 的队列深度 ),使所有命令的状态都可以用一个 32 位的值来报告。

  队列与非队列命令之间的区别在命令发出后就显示出来了。当非队列命令发出后,硬盘传送相关的数据,清除状态寄存器中的忙碌位( BSY ),并通知主机命令完成。当队列命令发出后,硬盘在将数据传输给主机之前就清除 BSY 位。这时, BSY 位的作用不是通知命令完成,而是通知主机硬盘已经准备接受新的命令。一旦 BSY 位被清除,主机就可以向硬盘发送其它队列命令,使硬盘内可以建立一个命令队列。

传输数据

  NCQ 使用第一方 DMA 在硬盘和主机之间传输数据。第一方 DMA 特性让硬盘能够控制对 DAM 引擎的编程以传输数据,使其可以以最有效的方式对命令重新排序,从而减少旋转延迟。由于在特定时刻,只有硬盘才知道磁头的角度和旋转位置,所以对于 SATA 来说,这是一项重要改进。硬盘控制了 DMA 引擎的编程,这样就可以选择使寻道和旋转延迟时间最小的数据进行传输。

  第一方 DMA 通过使硬盘无序返回数据,进一步减少了旋转等待。该特性使硬盘可以先返回一条命令的一部分数据,再发送另一条命令的一部分数据,然后再完成发送第一条命令的所有数据,前提是这样做是完成数据传输的最有效方式,这与智能电梯的运行方式非常相似。

状态返回

  无竞争状态返回将多条命令的中断聚集起来,以提高性能。主机与硬盘协调工作,不需要通讯就能无竞争地返回状态,并且确保 32 位的 S A ctive 寄存器的内容在任何时间都保持准确,它是主机和硬盘为了确定哪些命令还未执行所需要使用的。 S A ctive 寄存器为每个标记分配了一个位,比如,第 x 位表示的是标记为 x 的命令的状态。 S A ctive 寄存器中的一个位,表示硬盘中对应标记的命令还未执行(或者与该标记对应的命令将被发送给硬盘)。从 S A ctive 寄存器中清除一位,意味着硬盘中与该标记对应的命令已经执行。

  另一项重要的状态返回功能是, Set Device Bits FIS 能够在硬盘完成了多条命令后同时通知主机,这样就可确保主机在多条命令完成后只接受一次中断。如果一个请求队列在硬盘中建立起来,队列只对命令的重排序进行优化。在今天的台式机的工作中,许多应用在某一时刻只请求一块数据,只有在接收到前面的数据后,才会请求要后面的数据。在这种情况下,硬盘一次只能收到一条未执行命令。这样,由于不用重新排序,硬盘就不可能利用队列的优势。

  然而,即使应用一次只发送一个请求,超线程技术也使建立队列成为可能。超线程技术能够对多个同一程序的并发使用进行管理,极大地提高了多线程的数量,这样,在同一时间,就很可能有多个未处理的 I/O 请求出现。然而,为了利用队列的优点来获得最佳性能,需要对应用进行修改。

  为了建立队列而需要对应用进行的修改并不大。今天,大多数应用在编程时采用同步 I/O ,也称为阻塞 I/O 。在同步 I/O 中,只有当对文件的读或写完成后,功能调用才会返回。为了利用队列,应用要采用异步 I/O 。异步 I/O 是非阻塞的,就是说在对文件的读写请求完成之前,功能调用就会返回。应用将决定是通过校验事件还是接收回叫( callback )来判断 I/O 是否完成。由于功能调用后立即返回,应用就可以继续做有用的工作,包括发出更多的读写文件指令。 仅有硬件支持 NCQ 是不够的。操作系统和软件应用也需要向存储设备发送异步 I/O 命令来利用 NCQ 。硬件和软件 NCQ 可以降低硬盘产生的热量、改善系统可靠性并提高多种系统的 IOPS 性能,这些系统包括单硬盘的台式机和笔记本电脑,以及工作站和入门级服务器。

  编写访问多个文件的应用的最佳方式,是使用非阻塞 I/O 调用同时发出所有文件访问命令。应用可以使用事件或回叫来确定各个调用何时完成。如果有很多 I/O 任务,比如 4 到 8 个,同时将它们都发送出去可以将数据检索时间降低一半。

  在主流计算系统中利用硬盘 NCQ 带来的性能优势方面,独立软件开发商( ISV )和操作系统供应商起着关键作用。 NCQ 对性能的提高主要表现在系统启动、应用装载和文件拷贝上。但是,当异步 I/O 被广泛地部署在软件应用和操作系统中时, NCQ 的性能提高将会扩展到所有计算应用上。 ISV 通过采用异步 I/O ,可以在优化各种计算机的性能上提高一大步,这些计算机包括:笔记本电脑、台式机、工作站和入门级服务器,在它们当中, NCQ 硬盘和主机硬件正在获得越来越广泛地使用。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多