从缓存谈硬盘性能
技术空间
希捷公司最新的Barracuda 7200.8系列硬盘即将大量上市了,而Maxtor公司的DiamondMax Plus10也正式进入了市场,。除了SATAⅡ接口技术以外,单碟容量的提高和缓存数量的增多才是新一代硬盘真正的亮点,特别是缓存容量增加到16MB的产品尤其吸引用户的眼球。

缓存的效用
在整个PC系统中,在高速部分和低速部分之间都会出现瓶颈现象,而面对瓶颈现象通常的解决办法就是设置缓存。常见的缓存通常有两类,一种是数据缓存,另一类是指令缓存。前者的主要目的在于缩短数据传输过程消耗的时间,后者的主要目的是缩短对数据寻址定位所花费的时间。
PC系统中大部分操作都需要和硬盘打交道,而硬盘的读写速度和内存相比还不到其十分之一,基本上可以将它认定为系统内最慢的部分之一,瓶颈现象相当明显,在硬盘和其它设备之间设置缓存缓解瓶颈现象,也就成了十分重要的事情。
现阶段硬盘缓存主要是起到数据缓存的作用,因为硬盘的缓存一般都采用DRAM作为存储介质,读写速度接近于主流内存产品,远高于硬盘磁存储系统的速度。当系统需要在硬盘中寻找数据时,首先会在硬盘的缓存中寻找,如果找到了数据,那么利用缓存的高速特性,硬盘与主系统之间读写速度的瓶颈现象就会得到大大的缓解。
当然,如果能适当地对硬盘指令进行缓冲、排序也会提高硬盘整体性能,不过这部分工作现在一般都交给其它部分来实现,比如NCQ技术等,本文主要介绍硬盘缓存作为数据缓存以及与之相关的磁盘调度算法方面的知识,关于指令方面的知识就不再提及了。
磁盘的调度管理
磁盘控制器的调度算法是每家公司的不传之秘,但都是基于一些基本的算法发展起来的,我们这里就来简单介绍几种基本的磁盘调度算法和对磁盘性能考评的基本概念。
FCFS、SSTF与SPTF算法
FCFS是First Come First Service的缩写,也就是先来先服务的一种算法,这种算法是按照系统对磁盘数据读写请求的先后次序来决定服务的先后顺序。从性能优化的角度来看,这是一种最原始的调度策略,只能保证磁盘的正常工作而无任何优化可言。
磁盘调度管理首要任务是让磁盘能正常工作,其后才是对性能的优化,从这个意义上来说FCFS算法也算完成了自己的本职工作,而且FCFS算法在磁盘负载较轻时还是能正常发挥磁盘性能的。
SSTF是Shortest Seek Time First的缩写,也就是最短寻道时间优先的一种算法。这种算法的处理方法是,让寻道时间较短的请求在较早的时间就被执行,目的是获得尽可能短的平均寻道时间。显然,磁头在对某一个请求进行寻道的时候其它所有请求都处于排队状态,优先处理寻道时间较短的请求,可能会让整个队列的等待时间缩短,这就达到了缩短平均寻道时间的目的。
对于SSTF算法需要指出两个问题。对于每一个请求,寻道时间的估算通常是很麻烦的,这和上一个请求结束时磁头的位置有关,也就是说对于同样的请求,因为上一个请求的不同,其寻道时间也不同,进而在服务优先级上就会产生差异。
第二个问题是,因为一般来说SSTF算法用寻道距离来衡量寻道时间,最外和最内柱面的请求通常是最远的寻道距离,那么对于这一类请求往往在服务优先级上会排得很靠后,这会在软件应用层面上造成一些不良的影响。
有一定硬盘知识的用户一定会想到这样一个问题,硬盘的平均访问时间基本上等于硬盘平均寻道时间与平均潜伏时间之和。任意一个数据请求除了在径向上的寻道需要花费时间以外,还需要旋转盘片花费时间(即潜伏时间)。如果用SSTF算法只考虑寻道的时间,那么对于整个请求队列等待时间的最优化还做得不够彻底,于是结合考虑寻道时间和潜伏时间的SPTF算法就出现了。SPTF是Shortest Position Time First的缩写,就是最短定位时间优先的算法。
从原理上来说,SPTF和SSTF算法有很多相通之处,如果请求队列不是太复杂,很容易用SPTF算法降低平均访问时间,这对提高磁盘的I/O性能有着相当大的帮助。但SSTF算法存在的问题在SPTF算法中一样存在,对于处于一些区域的数据的请求,很可能被延误很久甚至难以得到服务。
针对这样的问题,引入有效定位时间这么一个概念,可以一定程度上解决SPTF算法中存在的问题。加入了这种时间因素的SPTF算法,通常被称为ASPTF算法。有效定位时间就是用预测的实际定位时间减去等待时间,通过权重分配,就可以将等待较久的请求赋予较高的优先级,至于具体实现这里就不详细介绍了。
SCAN系列算法
SCAN算法又称EA(Elevator Algorithm,电梯算法)算法,主要是让磁头沿磁盘径向来回扫描,依次服务前进方向上所有请求的一种算法,每次扫描都是达到最内或者最外磁道后才反向继续扫描。上面介绍的SCFS、SSTF和SPTF算法,都是将每次请求作为单一的考虑对象来设计算法的,而SCAN算法的着眼点在于以磁头运动为主,这是另一类的算法思路。
SCAN系列算法有多个变种,最常见的有CSCAN、LOOK和C-LOOK等,都是基于SCAN算法的改进型算法。CSCAN算法是让磁头沿一个方向扫描到底以后,就返回起始柱面,在返回过程中不响应任何请求,可以理解为单向扫描。LOOK算法是,如果当前运行方向没有请求了,就立即改变扫描方向执行另一个请求。而C-LOOK算法是,如果当前运行方向没有请求了,就立即返回起始柱面。
这几种都是最常见的也是最古老的SCAN算法,以磁头运动为着眼点的SCAN算法还有大量的变种。比如带参数的VSCAN算法就是实际应用较多的算法。
磁盘性能评价
对磁盘性能的评价,从调度算法的角度来看,主要采用“平均响应时间”和“平均响应时间的方差”两个指标来进行衡量。
平均响应时间,是衡量磁盘系统I/O性能的主要指标之一,针对同样的任务请求,平均响应时间越短,磁盘的IOPS(每秒的输入/输出操作数)就越高。在一些零散数据较多的应用上,比如网络服务器这类应用上就能体现出优势。在硬盘厂家中,IBM桌面硬盘的单碟容量往往相对较低,但与对手单碟容量相对较高的产品相比,在性能上却能打成平手,表面上看是其产品在平均寻道时间等指标上有优势,硬盘物理性能好。其实最根本的是其磁盘调度算法的优势,因为IBM在注重IOPS性能的高端硬盘设计上经验丰富,有更多的办法在桌面硬盘的平均寻道时间指标上获得优势,应该说IBM在这方面的成功主要得益于优秀的软件。
平均响应时间的方差这个指标更具有统计学的意味。从应用程序的层面来看,一个用户级别的请求很可能对磁盘产生多次I/O请求,只有与这个用户请求相关联的所有I/O请求都完成后这个请求才能算完成。前面介绍的一些算法,对某些I/O请求可能很快能完成,而对另一些I/O请求则可能拖延很久,这样即使平均相应时间不见得变大,但平均响应时间的方差肯定会变大。回到用户层面来看,这种平均响应时间的方差一样会影响性能,而且对于普通应用来说,平均响应时间的方差甚至比平均响应时间对性能的影响更明显。

当然,还有一个很重要的因素,就是磁盘负载。如果磁盘负载较小,那么几乎所有磁盘调度管理算法效率都差不多,而随着负载的提升,各自的表现就有所差异了。讨论磁盘调度管理算法,肯定要在某固定负载状况下才能讨论,改变了负载状况,结论就不一样了。下图是在不同负载下几种算法的性能参考(值越高越好),这可以帮助我们理解这几种基本算法,但请注意图中的数据不是精确的测试结果。
磁盘调度管理与缓存的关系
硬盘的缓存和PC系统其它部分的缓存一样,通常可以分为一些独立的Cache段,可以支持多个交叉的顺序数据流负载,同时可以实现一定程度的自动预取。还可以按照被存取数据经过读写磁头的顺序实现存取,而不必按照严格的逻辑块顺序进行传输。
当数据在磁盘的Cache中被命中时,具有最小的响应时间,所以Cache存在的意义是非常重要的。有测试结果显示,即使是最基础的SSTF算法,如果有了Cache的支持,SSTF算法很可能会超过很多更先进的算法。
但Cache的设计并不仅是增大容量以提高命中率这么简单,在Cache←→磁盘这个架构里面,Cache不仅是充当了数据缓冲Buffer的作用,特别是在RAID环境中,聚散操作、数据校验、I/O合并等都是要利用Cache的。即使这些操作都不提,Cache和磁盘调度策略之间的关系也是不可忽略的,而这个关系很大程度是通过Cache对数据可以一定程度上的自动预取来联系上的。
前面已经介绍了几种最基本的磁盘管理算法,当然实际产品中管理算法是不会这么简单。实际产品中,会采用以前面介绍的算法为基础的改良算法,而且很多时候在整个磁盘调度管理中不是只采用一个调度管理算法,而是针对不同的优化目的让多种调度算法并存。
在没有Cache介入的时候,对于算法的选择是比较麻烦的,有了Cache就很简单了。因为通常考虑管理算法的优化,除了考虑磁头在磁盘径向上的移动以外,还要考虑旋转盘片消耗的时间,这样就很难准确地估计平均访问时间。此时就产生了优先考虑旋转还是优先考虑径向寻道对整体性能更有帮助的困惑,进而对算法的取舍产生了困难。但如果直接把一个柱面的部分数据预读到Cache中去,那么很多问题就可能得到简化。
当然这只是一个比方,并不见得需要读取同一个柱面的部分数据到Cache中。但可以明确指出的是,有没有Cache,磁盘调度管理方法的选择是不同的;不同大小的Cache,其磁盘调度管理方法的选择也不同。在Cache增大以后,如何适当调节磁盘调度算法,发挥Cache的作用这才是核心问题。
潜在的问题
显然,增大缓存容量就可以缓冲更多的数据,这也就提高了磁盘对系统请求的响应能力,即提高了磁盘的性能。作为磁盘缓冲区使用的DRAM在价格上也并不昂贵,这么简单地的方法为什么这么多年没看见被硬盘厂家采用呢?
这方面的原因有二。其一是对于海量存储硬盘来说增加的缓存数量不大的话,对于命中率的提高并不明显。前面提到Cache可以分段,这些Cache段还可以在某些情况下被合并起来应付大数据块。如果Cache容量提高了,而并不同步更新Cache数据预取的算法,也没有针对性地调整磁盘调度管理策略,那么此时Cache容量的增大就只是增多了Cache段而已。而在有一定命中数量的情况下单纯提高数据Buffer,对命中率的进一步提高帮助并不大,反而可能会因为Cache管理难度的增大而影响性能。
有资料表明,某公司在推出一款8MB缓存硬盘之前的Beta测试中,采用最初版本的Firmware的8MB缓存硬盘比同规格2MB缓存硬盘在性能上毫无优势可言。在更新了Firmware算法以后8MB缓存的优势才逐渐显示出来。研发出能发挥大缓存优势的算法,这并不是一件很容易的事情。
第二个原因就是,增大了缓存对于数据的安全性存在相当大的隐患。现在硬盘缓存都是采用DRAM作为缓存,就速度和成本而言它是较好的选择,但是DRAM是易失性存储器,一旦掉电里面的数据就会完全丢失。比如在写的过程中,数据通常是先写入缓存中,此时硬盘会给系统回馈数据已写入的信息,此时如果断电,数据会因为实际上并没有写入硬盘的磁介质而全部丢失。
在一些安全要求较高的场合,硬盘的DRAM这种易失性缓存默认是被禁用的。当然,禁用缓存对性能是有损失的,桌面用户一般是无法自己关闭缓存的。不过对于桌面用户也有一些相应的措施,比如将缓存里面的数据即时写入部分隐藏的磁介质区域,这也在一定程度上会降低大缓存对数据安全性的威胁。
增大缓存容量,是否能提高性能还要看厂家在缓存算法设置方面的功力,不过一般来说作为成品推向市场,就已经说明了厂家对自己产品的信心。而数据安全性是否更低了,这虽然取决于厂家的附加保护设计,但对桌面用户而言,如果不能自由开关缓存的话,安全性降低这已经是不可否定的事实,不过桌面用户对这个还不那么在乎。