打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
!!!!!谈谈硬盘的存取速度等 如何从程序效率的角度理解

谈谈硬盘的存取速度等

wdqwdq 发表于: 2006-12-18 17:03 来源: DOIT博客

在过去的30年中,硬盘一直是存储的主力,在未来的15年甚至更长时间内,可以预计硬盘仍然是大容量存储的主力。只有理解了硬盘的性能,才能明白存储能提供什么样的性能。

要从应用程序角度理解硬盘的存取速度,就必须理解硬盘是如何工作的,硬盘的数据存储在一个圆盘的表面,圆盘不停的旋转,磁头在上面读取,这就象唱片一样,不同的是唱片是螺旋线,而磁盘保存数据的磁道是同心圆。要读取硬盘不同位置的数据,磁头就必须来回移动,这叫寻道,和磁头在一个磁道上顺序读取数据比,磁头寻道的速度是很慢的。要明白这点非常重要,假如你要自编应用程序读写海量数据,这是非常关键的。

我来举例说明下,对一个典型的7200RPM硬盘,平均寻道时间可能是8.9ms,也就是说磁头平均要花8.9ms的时间才能移动到磁盘表面的任意磁道,但是且慢,磁头移动到了正确的磁道并不等于你的数据正好到了磁头下面可以读,磁头还需等待平均是磁盘旋转一圈周期的一半时间才能读到想要的数据,对7200RPM来说,每秒120圈,这就是4.2ms,这就是说磁头平均移动读一次至少要8.9+4.2=14.1ms,1秒钟只能读70次,当然假如你不是对全盘任意位置读取数据,而只是限定在开头的比如1/10容量的分区随机存取,那样平均寻道时间会短不少,但4.2ms平均等待时间是不变的(如果用NCQ这方面会有所改善,这里不讨论),所以1秒钟随机存取次数也不会超过150次(典型的10K硬盘工作时次数也不超过250次/秒)。假如我们每次只读4KB的数据,那随机访问你每秒钟只能读0.6MB/s的数据,或者假如你的数据库内容没有缓存入内存,你每秒只能读不到150条记录,这和7200RPM硬盘典型的66~33MB/s持续传输速率比,落差无异是十分巨大的。

早期的硬盘每个磁道的容量都是一样的,大概是为了解码电路工作在固定频率上吧,现在的磁盘采用可变的磁道容量,所以越靠外面的磁道容量越大,目前典型的7200RPM硬盘传输率在66到33MB/s之间变化,这个最大速率取决于磁道的线密度,磁道的最大半径,转速,而磁道的最小半径决定了最低速率。10K的硬盘一般采用比3.5寸盘小一点的3.3寸盘,半径小了些,同时由于最小半径与最大半径的比值比7200的盘大,面积进一步缩小,所以同样的线密度下容量会少不少,而传输速率增加则没有40%这么高,典型比如最大80Mb/s。15K的盘速度更高,尺寸更小,一般是2.5寸的,所以同样的线密度的情况下持续传输率并不会有什么明显的增加,而容量又小了很多,当然如果还是3.5寸的,那增加还是不少的。

高速盘的主要优点是缩短了随机存取的时间,这个是随转速和盘径的减小直线增长的,15K盘和7200比几乎能增加一倍,缺点是昂贵和单盘存储容量的下降。如果你期望增加持续传输率的话,磁盘阵列应该是更好的解决方案。大部分应用程序工作在随机存取和持续传输之间,所能期望得到的速率就取决于读取数据的方式。简单的说,假如一个盘比另外一个盘,随机寻道时间和平均等待时间降低了30%,平均传输速率增加了30%,那不管什么应用,磁盘速度都可以说提高了30%,如果两边的性能增长不是这么平衡,那改善的效果就取决于应用读数数据的方式更趋向于随机还是顺序存取了。

对于自用的PC,建议用户划分小的操作系统分区(8~12G),把需要快速存取的文件尽量放在硬盘靠前(靠外道)的位置,而把备份和不常访问的数据放在末尾的分区,这个传输速率差异还是很大的

接下来要说缓存了,缓存分硬盘内缓存和硬盘外缓存,盘外缓存又分存储的缓存和主机的缓存。盘内缓存有些盘外缓存不具备的优点,就是对磁道的数据预取,磁头不光读你指定位置的数据,也会自动读之前和之后的数据,假如OS没有预取的功能,盘内的预取就有明显的优点,而且不传输不必要的数据因此不占用传输通道。基于这种考虑,我认为磁盘的缓存起码要足够存储几个磁道的数据,以一个7200的盘计算,最外面每秒66MB数据,而每秒转120转,因此一个磁道大概也就是0.5MB,这样看,2MB的缓存起码能存4个磁道的数据,也还差不多了,因此把缓存增加到16MB通常情况下是不会有太大效益的。我的意思并不是说16MB的缓存毫无用处,其实现在内存这么便宜我认为个个硬盘都该配这么大缓存,只是厂家为了差异化故意搞出这些差异,但是你要对16MB期望太高那是不现实的。硬盘外缓存,如果只是读而言,同样的容量存储的缓存不会比主机的缓存更有优势,除非是很多主机共享读同样的文件,但就写而言,如果存储的缓存带电池备份,可以在实际硬盘没有写完前就通知主机的应用程序已经写完毕,性能上的提高有可能是很大的。

下面简略的说一次RAID阵列的速度和磁盘速度的关系,RAID0用分片存储方式把数据分布在两个盘或更多盘上,读写持续传输速率会增加一倍,随机读写速度按理论是有可能增加的,这取决于数据分片大小和读写的大小,不过总的来说很值得怀疑;硬件RAID1的随机和持续写速率和单个硬盘是完全一样的,但读的话由于可以从两个硬盘随意选一个读,随机读性能会有明显的增加,可能至2倍,至于持续读取速率理论上有可能增加,不过我很怀疑有这方面的优化,估计还是一样的;RAID5由于写要N+1个盘一起写,所以随机读写速率和单个硬盘是一样的(或者更差),而持续读写速率按理论是单个硬盘的N倍,不过我也遇到过还不如RAID1的情况,这怎么说呢?没法说了。
最后说下IDE、ATA、SATA、SCSI、FC等这些传输通道,我知道我说这些肯定是会有争议的。既然现在的传输通道速率已经远远的超过了硬盘的持续传输速率,还要这些更高的速度有什么必要呢?我只能这样看,这不是完全没必要的,更高的速率能减轻通道的拥塞,让缓存中的数据更快传输,也许还能减低主机的CPU占用率什么的。但正如这些怀疑论者所想,存储的性能根本上是由硬盘决定的,其它这些外围的东西只能起有限的提高,不能起决定作用。

另外再多嘴说下硬盘的可靠性,很多用户会想当然的认为他们花几倍价钱买来的硬盘肯定是更可靠的。就我的经验,实际的情况不是这样,我所遇到的硬盘损坏比例服务器和存储专用硬盘明显高于普通消费级别硬盘,几年前这点还很明显,近几年可能是由于硬盘可靠性普遍提高,两方面的例子都变少了,不太好下结论了。简单的说,硬盘厂家把最先进的技术同时用于专用硬盘和消费硬盘,甚至可能由于保守的缘故消费级别硬盘先采用新技术;专用硬盘转速更快,发热更高,同样的技术水平更容易坏;消费级别硬盘出货量远远高于专业硬盘,故障更有可能暴露出来,我想这是最重要的因素。当然我不否认采用更好的轴承等技术,专用硬盘可能有更好的寿命,(但是我所接触的环境PC机也常常24小时运行,特别是几年前),但不管怎么说专业硬盘的可靠性绝对不可能是消费级别硬盘的价格倍数。

写的很匆忙,必定有很多错漏之处,欢迎指正!

订正下,上面的文字就不动了。

“RAID5由于写要N+1个盘一起写,所以随机读写速率和单个硬盘是一样的(或者更差)”
这段我对RAID5的存储方式理解有错误,读不是要N+1个盘一起读,所以每秒随机读次数在并发IO的情况下能有很大提高。
感谢冬瓜头指出!

[ 本帖最后由 wdqwdq 于 2006-12-28 18:41 编辑 ]

最新回复

林肯 at 2006-12-19 18:04:45
表扬的话我不说了,希望你的帖子更多一点....
对于磁盘底层技术,如果一定要给你挑一点刺的话
Avg 146K read IOPS = 1000ms / (3.8 + 2.01) = 172
Avg 146K write IOPS = 1000ms / (4.1 + 2.01) = 164
2.01是所谓 average latency,  3.8/4.1是所谓seek time

硬盘的可靠性方面当然应该是磁盘阵列的要高很多,起码在做工用料方面,当然做工好并不能100%保证会更加可靠,就像宝马车说不定比夏利更加容易坏一样,但不能说宝马用料不好

至于RAID计算损耗方面,感觉还是有点认识上的不一样,但对于一个用户来说,已经是非常不错了

[ 本帖最后由 林肯 于 2006-12-19 18:06 编辑 ]
paulwang at 2006-12-19 18:15:41
什么东西的边际收益都会下降的 不能要求一直成线性关系 性价比在下降 研发人员的时间回报也在下降 
说白了 中低端产品才讲性价比 高端产品就讲品牌/服务/.....
wdqwdq at 2006-12-19 19:41:36
>>表扬的话我不说了,希望你的帖子更多一点....

谢谢,其实我写这些可能给编程的看更有价值一点。

>>对于磁盘底层技术,如果一定要给你挑一点刺的话

这个...,没发现和你说的有什么不一致的地方啊,我说过15K的盘随机存取性能是7200的2倍啊。我知道写会比读稍微慢些的,但只是普及性的说说,所以没有提出来。你是说我说的150/250高了吗,对一个典型的几G的数据库读写是有可能高一些的,当然10K的盘每秒250次可能怎么也达不到,是我看数据库监视器经过OS缓存后的值。

>>硬盘的可靠性方面当然应该是磁盘阵列的要高很多,起码在做工用料方面,当然做工好并不能100%保证会更加可靠,就像宝马车说不定比夏利更加容易坏一样,但不能说宝马用料不好

这个我不得不说了,版主的说法有道理,有水平~~用料我相信肯定是好的。

>>至于RAID计算损耗方面,感觉还是有点认识上的不一样

请明示。

补充几点吧。
1. 是前面说存储的缓存不比主机强有些偏颇,如果主机的内存不够大,又有多台主机访问存储,存储的大缓存被多台主机共享还是有价值的。
2. 是硬盘的随机访问性能差几乎是根本性的缺陷,15K的盘也出现有5年以上了,速度很难再大幅度提升了。如果在闪存盘上运行数据库对比的话,出现10倍的性能差距也是不会让人惊讶的。除了大缓存,就是数据库全放内存中运行,但这总不够理想。
3. 虽然随机读性能这个物理缺陷很难有解决办法,但是随机写的性能是可以靠较大缓存来有个明显提高的(特别是和排队技术集合起来),这对整体性能提高仍然会有不少帮助。电池后备的内存毕竟昂贵,而且感觉上也还是不够可靠,期望厂家以后开发的硬盘里能带flash后备存储和较大的电容,当掉电的时候把未写完的数据写入flash中,这样的硬盘成本增加不多,性能却能增加不少。
firewire800 at 2006-12-19 21:04:08

精华啊,又学到了!~

从头到尾看了一遍,花了不少时间,但收获也是成正比的。。

终于明白为什么FC、SCSI、SAS硬盘设计成2.5寸的,原来为了减少Seek Time!原来以为只有提高转速才能提高速度的。。

[ 本帖最后由 firewire800 于 2006-12-19 22:39 编辑 ]
rechardluo at 2006-12-19 23:55:58

QUOTE:

原帖由 wdqwdq 于 2006-12-19 19:41 发表
补充几点吧。
1. 是前面说存储的缓存不比主机强有些偏颇,如果主机的内存不够大,又有多台主机访问存储,存储的大缓存被多台主机共享还是有价值的。
    ---光有缓存,或者缓存容量大,是不够的;设计灵活的缓存算法,才是灵魂,他就像一个乐队的主唱那样!

2. 是硬盘的随机访问性能差几乎是根本性的缺陷,15K的盘也出现有5年以上了,速度很难再大幅度提升了。如果在闪存盘上运行数据库对比的话,出现10倍的性能差距也是不会让人惊讶的。除了大缓存,就是数据库全放内存中运行,但这总不够理想。 “全放内存中”,想法挺好,就是花得起这个银子的用户可不多!

btw, LZ挺厉害的!
chenmengliang at 2006-12-20 08:50:48
不得不顶
chenmengliang at 2006-12-20 09:10:53
RAID5的写速率慢,愚见如下:
由于RAID5比单硬盘写多了个校验工作,尤其是改写数据时,要经过读原数据-读校验数据-比较新数据与原数据-生成新校验数据-用新数据覆盖原数据-用新校验数据覆盖原校验数据-返回操作成功信号,经过如此之多的步骤,RAID5的写速度比单块硬盘的写速度慢就可以理解了
抛砖引玉,疏漏之处,请方家指点
wxshun at 2006-12-20 10:04:49

QUOTE:

原帖由 firewire800 于 2006-12-19 21:04 发表

精华啊,又学到了!~

从头到尾看了一遍,花了不少时间,但收获也是成正比的。。

终于明白为什么FC、SCSI、SAS硬盘设计成2.5寸的,原来为了减少Seek Time!原来以为只有提高转速才能提高速度的。。
深有同感!!
firewire800 at 2006-12-20 10:41:56

QUOTE:

原帖由 wxshun 于 2006-12-20 10:04 发表

深有同感!!
以前从来没有想得这么深入,楼主很厉害。。。。。
冬瓜头 at 2006-12-20 10:53:39
钻,使劲钻,大家都来钻牛角尖
xylfred at 2006-12-20 15:58:21
楼主能指点一下编程人员的角度怎么来理解你的这篇文章?
fani007 at 2006-12-20 16:43:32
顶!
又明白许多。其实我觉得FC、SCSI、SATA硬盘没什么差别,只是用户有钱烧的。其实买一堆SATA盘,做Raid0+1,多好啊,Raid5不行。
wdqwdq at 2006-12-20 17:51:17
>>楼主能指点一下编程人员的角度怎么来理解你的这篇文章?

这个不是几句话能说清楚的,基本点是编程人员要想像自己做的每步操作磁盘会怎样的存取,减少随机存取,减少存取次数,当然基本的缓存你每读一次数据附近的几MB数据还是有可能已经缓存上来了,这些也都要考虑到,缓存既是重要的,又是不可完全依赖的

我觉得比如估算下每秒钟要存取多少次是个好方法,这样就会对自己的程序性能心中有数,如果设计数据结构,预先估算后为了性能做出的设计可能会和不考虑磁盘存取特性有很大不同。我举个例子,有很多短信的网关程序,每秒钟跑一百条就吃不消了,你如果了解了磁盘存取特性就会知道怎么回事了,他一个程序往数据库中写短信记录,一个程序轮询读,那还能行?数据库读写一条记录可不是一次磁盘读写这么简单,即使有缓存顶着也还是够呛。反之,如果短信转发放内存中处理,每秒几千条也应该是很轻松的,这时候要考虑的就是交换机吃不消了,当然,短信必须保存在硬盘上备查,怎么处理?很简单,积累若干条在内存缓冲区中,一次象日志一样批量写入硬盘,或更好点为了保险起见限定到0.5秒条数不够也写,这时候网关服务器会负载很小,兼干其它事情也不吃力。如果希望内容放到数据库中好查询,可以定时把日志导入进去,这是顺序处理,非常快的。

有些情况下,可以一次读较多的数据到内存再进行处理,虽然现在有预读了,还是不可以太依赖,没有什么缓存比你应用程序更知道你的存取特性,BT的缓存就是一个很成功的例子,按说OS有缓存了为什么BT自己还要搞呢?电骡为什么不太成功,没有缓存是一个因素。1992年的时候,同事找我说他们处理计费的预处理程序30M数据要2个小时才能处理完,太慢了,我一看程序是getc一个一个字节读,一个一个字段判断处理,我改成一次读64KB,用C++的类内存中按记录来转换,再一次写入,2分钟就处理完了(那个时候的硬盘和CPU速度)。

>>其实我觉得FC、SCSI、SATA硬盘没什么差别,只是用户有钱烧的。其实买一堆SATA盘,做Raid0+1,多好啊,Raid5不行。

还是不要匆忙下结论吧,不然又要被批了。
林肯 at 2006-12-20 18:31:12
写得很好,从应用角度考虑底层技术,底层技术为应用优化,所谓application optimized,顶一个

说FC和SATA一样就和说因为宝马和santana一样长,所以质量一样,完全不靠扑。另外重申一句,对于数据库随机OLTP交易来说,什么接口流量都是骗人的,管你1G/2G/4G还有什么10G iscsi,能够有40MB的写流量就吓死人了(当数据库db_block_size=8KB时)
richstone at 2006-12-20 21:54:34
比如,大家都以为硬盘的cache越大越OK, 但实际上在RAID环境或者存储环境硬盘的cache一般都是disable.
因为开启后对数据的安全有影响, 在RAID中, CACHE是由RAID battery来保护, 同样在存储中
也有类似的机制来完成保护. 但是如果每个硬盘的cache打开后,如果停电,你就不会知道, 那个写了,那个没有.
其实做存储,第一位是数据安全,第二位才是性能.
wdqwdq at 2006-12-21 09:05:57
>>实际上在RAID环境或者存储环境硬盘的cache一般都是disable.

我对这些了解不多吧?但是是写缓存 disable吧,不然硬盘自动预读的功能不就没有了?
如果能做到我说的硬盘自带flash,就不需要disable了,有足够大的写缓存再通过排队优化磁头移动(结合磁盘旋转相位还有适当在读的间隙插入写),随机写性能一定能高很多,这种优化只能靠硬盘本身来完成,外部设备缺乏必要的信息来优化操控。

正好看到文章Vista有个ReadyBoost技术可以用闪存盘来做虚拟内存加速,原理就是闪存盘随机读写比硬盘快太多了(即使持续速率慢很多)。

还有就是假如硬盘厂商要想提高持续传输率,应该是很容易的,我们知道多层盘有多个磁头,但是实际上同时只有一个磁头在工作,如果每个磁头都配上读写电路,速率不就提高N倍了吗?这个成本会增加些,但肯定不是大到难以接受的。但是正如我们所讨论的,随机存取性能才是主要矛盾,单纯提高持续速率是意义不大的,所以才不见厂商有做。

再说下硬盘读写数据的方式。还是以7200RPM盘为例,我们来看下什么样算随机读写,什么样算顺序读写,盘的平均持续读写速率大概是50MB/s的样子,我们假定一秒钟时间一半在寻道,那就是70的一半35次,一半时间读数据,就是25MB,因此中间位置是每次读约25/35约0.7MB,对于高速盘,由于传输率没有随机访问速度增加的快,这个值可能低到0.4MB。因此,如果程序一次读写的数据远低于这个值,那就是随机读写,性能主要按读写次数估算(当然每次读的位置很接近要另外考虑),如果明显大于这个值,就说明硬盘在寻道上花的时间较少,主要是受持续传输速率的制约。当然这只是个简单化的情况,实际我们一般读写的是文件,而文件可能是有碎片的,当然另一方面我们又有预读和缓存,所以要更复杂些,但作为大致的评估还是可以参考的。

我举个文件拷贝程序的例子,即使到现在仍然有人在讨论这个快还是那个快,如果一个程序一次读256KB就写,另一个读2MB才写,孰快孰慢呢,即使有预读和缓存,考虑到读写操作的干扰,在同一个盘拷贝,几乎肯定后者比前者快,在不同盘之间拷贝就不一定了,因为有个传输的交替问题,但一般来说,1MB应该会比256KB要好。做这个分析并不是建议你每次都读写大块的数据,即使不必要,虽然现在内存很便宜了。但是做了这种磁盘性能评估后看问题,确实会有很大不同的。

记得很多年前FICQ的作者问我你估计OICQ(就是现在的QQ啦)是什么工作机制?那时候FICQ人多了的时候性能有些不理想,我说还不是钱多搞一大堆数据库服务器堆出来的吗?你如果现在问我是什么,我估计还是一样的。现在的问题是假如你没那么多钱又想达到一样的性能你该怎么做?如果我说用100台服务器(也许再少很多)就能把QQ的基本IM功能承担起来(不包括代理和传输中转还有各种附加功能),你可相信?
兔爷 at 2006-12-28 11:10:24

QUOTE:

原帖由 fani007 于 2006-12-20 16:43 发表
顶!
又明白许多。其实我觉得FC、SCSI、SATA硬盘没什么差别,只是用户有钱烧的。其实买一堆SATA盘,做Raid0+1,多好啊,Raid5不行。
SATA硬盘单个进程读写的时候速度很好,一点不输FC,但多进程,随机读写的时候,性能下降的比FC差太多了。所以感觉SATA硬盘适合做备份之类的,或者给个高清的编辑工作站做存储。
自己很随意的测试数据而已,仅供参考。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
硬盘性能的深度解析 - 教学 - PC绝对领域
iops 条带深度 队列深度 NCQ
硬盘结构详解;详解MBR和GPT分区结构;详解raid磁盘阵列
存储系统讲解——硬件层介绍
磁盘的格式化有什么作用
磁盘阵列原理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服