PCEVA,PC绝对领域,探寻真正的电脑知识
开启左侧

想知道你是否被忽悠?看浴室对硬盘性能的深度解析之二

  [复制链接]
neeyuese 发表于 2011-8-12 22:42 | 显示全部楼层 |阅读模式
点击数:61184|回复数:119
上一期帖子发布后反响不小,时隔一年时间,趁着忙里偷闲的时间,这里我想更深入一点来解释下性能的定义,希望能帮助更多的朋友去了解自己的存储系统,而不是被众多厂家的高数字广告来忽悠。

目前3大主控家族的产品主要性能指标如下:(官方指标)

采用SandForce 2281的金士顿HyperX系列:




Intel家族新320系列:



510系列:




镁光M4系列:



看到那么多数字,是不是心中很没底?这些数字代表的到底是啥意思呢?你的应用到底需要多少IOPS和传输率?你当前的电脑配置能不能发挥出或者使用到这些数字代表的性能?

------------------------------------------------------------------------------------

任何东西都需要从基础学起,基础的概念一定要先掌握,不然没法去深入解释性能的概念。

硬盘控制器,机械硬盘主控/固态硬盘主控,硬盘控制器驱动程序

硬盘控制器

我们使用的机械硬盘或固态硬盘的接口包括了物理接口, 物理接口的每根针都有自己的定义,除了物理接口规范之外,还定义了一套指令系统,叫做逻辑接口规范。

硬盘通过物理线缆和接口连接到硬盘控制器后,如何在硬盘上做存取操作?因此就有了指令系统。指令集规范定义了“如何向硬盘发送数据和从硬盘读取数据”。这里要注意的是,这些指令并不是由CPU直接执行代码来生成的,而是由专门的部分来负责的,它就是硬盘控制器,驱动程序只要将需要读写的设备号、读写的初始地址和长度告诉硬盘控制器即可,剩下的都由硬盘控制器来负责。


机械硬盘主控/固态硬盘主控

这个要和上面提到的硬盘控制器区别开来。这里的主控负责的是驱动磁头臂或者对闪存操作来读写数据;而主板上的硬盘控制器是专门用来对它发送指令来操作硬盘的,我们的CPU做的仅仅是操作主板上的硬盘控制器即可。

CPU操作主板上的硬盘控制器不需要很复杂的指令,这些指令叫控制器驱动程序。CPU通过执行驱动程序,生成指令发送给主板上的硬盘控制器,收到这些指令后,通过电路逻辑运算生成另一种指令(ATA指令集/SCSI指令集),其中ATA指令集是由ATA硬盘控制器发送给IDE或者SATA硬盘的,而SCSI指令集是由SCSI硬盘控制器发送给SCSI或者SAS硬盘的。


硬盘控制器驱动程序

在电脑刚开机,操作系统还没有启动起来挂载硬盘控制器驱动程序的时候,CPU会先从主板BIOS里取得最基本的驱动程序控制电路指令,主板BIOS中存放了初始化系统所必须的基本代码。

主板BIOS初始化过程会去查找硬盘控制器的BIOS地址并执行此地址的代码,初始化连接到主板的硬盘控制器,并向主板BIOS报告控制器后面连接的硬盘情况。(就是我们开机硬盘自检)最后主板BIOS让CPU发送指令,读取硬盘0磁道第一个扇区中的代码进内存执行并挂载操作系统。

主板BIOS只包含最基本的硬盘控制器驱动程序,在操作系统内核启动过程中,会用更完整的,全功能的硬盘控制器驱动来替代BIOS中的简化版驱动程序。(在我们的Windows安装光盘里,并不包含所有的硬盘控制器驱动程序,所以有些第三方硬盘控制器就需要事先挂载驱动程序才能安装操作系统。)



结合上面的解释,这里我画张图总结。(图中为我自己用的主板GIGABYTE P67A-UD4-B3)



并行传输与串行传输

假设我们有8个数字需要传送给对方。此时我们与对方连通8条导线,每条导线上传输一个字符,这就是并行传输。并行传输要求通信双方之间的距离足够短,如果距离太长,那么这8条导线上的数字因为导线电阻不均衡以及其他各种原因影响,最终到达对方的速度就会出现差距,造成接收方必须等待8条线上所有数字都到达后,才能发起下一轮传送。

并行传输的缺点前面说过了是长距离,首先,长距离用多条线缆成本比单条来的高;然后,长距离传输为了降低信号衰减,导线也需要加粗,试想一下把那么粗的导线捆到一起有多麻烦。例如老旧的IDE接口,使用的40或者80芯电缆就是典型的并行传输。40芯里有32芯是传输数据用的线,其他8芯是别的控制信号线。80芯的另外40芯是接地,屏蔽干扰用的。所以这种接口一次同时传输数据为32bit(4字节)。

再来说说串行传输,一样传8个数字的话,只用一条导线来连接到对方,则我们依次在这条线上发送,需要发送8次才能将数字全部传送完毕,因此在效率上显得不如并行传输。但是串行的传输频率可以做的很高,由于电路高速震荡时,数据线之间会产生干扰,造成数据出错,所以必须增加屏蔽线。但是即使增加了屏蔽线,也不能保证屏蔽掉高速下的频率干扰,所以并行传输效率高但是速度并不快。而串行传输刚刚相反,效率非常低,每次只传输1bit,但是它的速度非常高。串行传输适用于远距离通行,PCIE接口就是典型的串行传输方式,其单条线路传输率高达5.0Gb/s (PCIE 2.0),还可以在每个接口上将多条线路并行,等于将速度再次翻倍,16X的PCIE槽就是将16条5.0Gb/s的线路并行连接。但是这只能用在短距离上,主板上各个部件之间才能承受如此高速的并行连接,远距离传输自然就不行了。


内部传输率与外部传输率

机械硬盘的内部传输率指的是磁头读写磁盘时的最高速率。这个速率不包括机械臂寻道和潜伏期消耗的时间。它属于一种理想化的最佳速率。实际使用中发现硬盘的速率是浮动的,有时候变化非常大,这是因为寻道花的时间造成的影响。

举个例子,光速小东东正在嗑瓜子,他每秒可以嗑瓜子100个,此时唠叨小娟娟每隔0.1秒,和他说话打断他,每次时间0.5秒,意味着每0.6秒光速小东东只能嗑瓜子10个,可以计算出光速小东东每秒嗑瓜子实际是16个。

我们不断用换道动作来打断磁头。磁头划过盘片一圈,只需要很短的时间(取决于盘片转速),而换道所需要的时间远远比盘片旋转一圈耗费的时间多,所以造成磁盘传输率显著下降。RAID技术的多盘应用下,提速的奥秘就类似当一个硬盘的磁头换道时,另个硬盘的磁头还是在读写来提高平均传输速度。

固态硬盘虽然寻址时间相对比较快,但是零散的地址访问会带来很多碎片,增加了之后做垃圾回收需要消耗的时间,所以实际内部传输率也会明显受到之前写入数据分布的影响。

机械硬盘磁头从盘片上读出数据,然后存放到缓存芯片内(固态硬盘主控从闪存上读出数据,然后存放到主控缓存内),再通过外部接口传送给主板上的硬盘控制器。这个接口传输率就叫做外部传输率,一般都是大大高于内部传输率的。


------------------------------------------------------------------------------------------------

硬盘的IOPS,也就是每秒能进行多少次IO,每次IO根据写入数据的大小,这个值也不是固定的。

如何才算一次IO呢?很多人没有弄清楚这个问题,表面来看定义也非常混乱,根本原因在于IO在每个层面上都有自己的定义。我们的整个系统是由一层一层的模块组合而成,每个模块之间都会有各自的接口来做交流,接口之间流动的数据我们就叫IO。那么如何才算一次IO呢?举例来说吧:

1.应用程序向操作系统请求:“读取C:\windows\explorer.exe到缓冲区”。操作系统读取后返回应用程序一个信号,这次IO就完成了。我们就说这是应用程序做了一次IO。

2.文件系统向硬盘控制器驱动程序请求:“读取从LBA2048开始的后1024个扇区”,然后“读取从LBA20480开始后的256个扇区”,这就是文件系统向下做的2次IO。这两次IO,假设正是前面第一步里的那个应用程序请求。

3.硬盘控制器驱动程序用信号来驱动硬盘控制器向硬盘主控发送ATA指令。对于ATA协议来说,完成一次连续的LBA地址扇区的读写算一次IO。

4.我们可以想象一下,如果在文件系统和硬盘之间再插入一层卷管理层,或者在硬盘控制器和硬盘之间插入一层RAID虚拟化层,那么上一层的一次IO就会演变成下层的多次IO。

5.而对于硬盘来说,每次IO就是指一次ATA或者SCSI指令交互回合。比如“读取从LBA2048开始的后1024个扇区”我们算一个IO。

综合上面的5点,假设我们写入100000个大小为1KB的文件到硬盘上,花费的时间会比直接写入一个100MB的大文件多的多,虽然数据总量都是100MB。因为写入100000个文件时,根据文件的大小和分布,整个系统模块之间可能要做几十万甚至几百万次IO才能完成。而写入一个100MB的大文件,如果文件是持续存放的,那么只需要很少的IO就完成了。

对于写入100000个小文件的情况,因为每秒需要的IO非常高,所以此时如果用具有较高IOPS的硬盘,速度会提高很多。而写入一个100MB的大文件,就算硬盘的IOPS再高,也不会有任何性能提升,只有换传输率大的硬盘才会有优势。同样的硬盘,读写小块数据的时候IOPS较高,读写大块数据时候IOPS较低,因为读写花费的时间变长了。

硬盘在传输数据时候的数据流速度我们叫传输率。如果写入100000个1KB文件需要100秒,那么此时的传输率只能达到1MB/s,而写入一个100MB的文件用1秒,那么此时的传输率就是100MB/s。所以,即使同一块硬盘在写入不同大小的数据时,表现出来的传输率也是不同的。具有高传输率规格的硬盘在传输大块连续数据时候快,具有高IOPS的硬盘在传输小块不连续的数据时快。



IO延迟与Queue Depth(队列深度)/Queue Length (队列长度)

IO延迟是指控制器将IO指令发出之后,直到IO完成的过程中总共花费的时间。早前业界不成文的规定为,只要IO延迟在20ms内,IO性能对于应用程序来说都是可以接受的,但是如果大于20ms,应用程序的性能将会受到较大影响。(JMF602的小文件随机写入IOPS是个位数,所以你们觉得卡)

这样算下来,存储设备应当满足最低的IOPS要求应该为1S/20ms=50IOPS,所以只要区区50IOPS就可以满足这个要求了。单块机械硬盘的IOPS一般在80附近(7200转),固态硬盘的话就比较夸张了,对于大型的存储设备,通过并行N个IO通道工作,达到几十万甚至几百万IOPS都不是问题。

然而不能总以最低标准来要求存储设备。当接收到的IO很少的时候,IO延迟也会很小。比如一块Intel X25-M Gen2 34nm 80G固态硬盘,即使延迟平均在0.1ms的话,每个IO通道的IOPS=1000/0.1=10000,但是这块固态硬盘被厂家标称35000的读取IOPS,这里就引出另一个概念:Queue Depth(队列深度,也可以叫队列长度)

控制器向存储设备发起的指令,不是一条条发送的,而是一批批的发送,存储目标设备批量执行IO,然后把数据和结果返回控制器。只要存储设备肚量和消化能力足够强,在IO比较少的时候,处理一条指令和同时处理多条指令将会消耗几乎相同的时间。控制器发出的批量指令的最大条数,由控制器上的Queue Depth(队列深度)决定。(一般好的固态硬盘主控,队列深度都支持到32了)

如果给出队列深度,IOPS,IO延迟三者中的任意两者,则可以推算出第三者,公式:IOPS=(队列深度)/ (IO延迟)。实际上,随着队列深度的增加,IO延迟也在增加,二者是互相促进的关系,所以,随着IO数目的增多,将很快达到存储设备提供的最大IOPS处理能力,此时IO延迟将会陡峭升高,而IOPS则增加缓慢。(消化不良)

枯燥的理论概念讲完了,这里要用实际来结合理论解释了。


先来几张ASSSD图吧。



Intel 320 160G 和 Intel 510 120G

从图中可以看出,即使有了160G颗粒容量的320,跑持续传输率也不是只有120G容量的510对手。(510是34nm 同步颗粒占了很大便宜)
本帖第一个关键点来了:在最上面的Intel 320数据手册的160G型号里,写了4KB随机读取最大39000IOPS,而120G的510却只有20000IOPS。
我们在ASSSD测试中,看到这里的QD 1 4KB随机下面,510反而强过了320。(这2张图是相同平台Z68技嘉)但是在QD64下面,320就强过510了,139MB/s :85MB/s。
鉴于ASSSD的评分标准以随机为重,因此510系列的跑分明显低能,难道510就那么不济,被弟弟320系列蹂躏吗?Intel脑子有问题,120G的510可是贵过160G的320啊。
实际使用起来是510快还是320快哪?这里我明确告诉你,510快,不但快在持续,而且快在延迟上。
34nm颗粒的延迟是25nm颗粒无法追上的,如果你有看那张表下面510的延迟和320的延迟的话。(很不引起人注意的数字,但是这个数字会影响IO延迟,你可以理解为机械硬盘的转速)
为什么跑分低的510反而快过跑分高的320哪?跑分低是因为ASSSD测试软件的评分漏洞,太注重随机性能。(应该说目前使用的绝大部分测试固态硬盘的软件都注重随机性能,任何东西太极端反而不好,如果用PCMARK 7的硬盘测试套装测试,510的分数绝对不低的。)
我们日常操作中的QD有多少?在Win7的性能监视器里可以查看,一般99%的时间都是低于1的,只有在硬盘有了任务后才会浮动,而QD的大小取决于任务的IO数量。



上图是我刚截的图,截取时我正在用QQ聊天,听音乐,开了几十个网页等等,可以看到C盘QD为0.01,基本等于闲置状态。

然后我把I盘(M4 256G里的Program files文件夹8G左右零碎文件)复制到H盘(OCZ Vertex 3 120G)里去,顺便截图。



可以看到I盘QD并不高,但是H盘的QD已经最高到了6附近了。由于固态硬盘的写入IOPS不如读取IOPS,造成消化不良。(M4给的多了,V3吃下去消化不掉,
增加QD并发来急着消化,延迟也随之大大增加,速度却没有增加多少。)

然后我把E盘(WD绿盘1TB机械盘的QQ文件夹20G的文件)复制到H盘(OCZ Vertex 3 120G)里去,顺便截图。



这次倒过来了,WD绿盘因为IOPS低的关系,根本喂不饱OCZ Vertex 3 120G,所以看QD的话,反而是WD绿盘高,而OCZ VERTEX 3 120G等着吃哪。

那么第一个结论是啥?那就是说,固态硬盘的QD取决于你的应用程序IOPS消耗度,QD32或者QD64测出来的数值只不过是这块固态硬盘最大能够消化的能力,不代表平日你的盘速度,厂商给出的都是最大值,你用不到。而盘的速度很大程度上取决于颗粒的延迟和算法,随着工艺更新,容量更大,延迟却会越来越高,所以很遗憾的告诉你,如今的25nm固态硬盘的颗粒延迟相比几年前72nm的SLC颗粒延迟增加了不是一点点,特别是写入上(编程),这是硬性限制,也是发展的必然需要,除非你不要容量和性价比,当然那时候的固态硬盘有别的限制。(固件算法,接口速率等等)


接下来说第二个问题,很多朋友觉得为什么开了节能固态硬盘的持续传输率没咋变化,但是随机传输率却可以低50%以上?

特别是笔记本用户,经常会有这种感觉,买的固态硬盘在自己的平台上发挥的非常难看。给你们先看看下面这张图:



这张图是从Vertex 3 240G里往M4 256G里复制当前系统的Program文件夹,由于2块固态硬盘速度都非常快,造成了我的2600K的CPU占用率。。。我的系统从复制开始就间歇性卡顿直到复制完成。
试想一下,如果把这个CPU换成你们的笔记本CPU,然后在BIOS里再开启所有的节能选项(节能限制了系统总线带宽),然后再用这类高速的固态硬盘跑IOPS测试,你认为你的固态硬盘能发挥多少性能?除非你的CPU能跑在满载状态,不然肯定会被限制。
之前章节说过,大文件一次传输算一个硬盘的IO的话,传输一个大文件,对上层设备造成的负担并不会很大,如果像你跑随机测试小文件,那么对硬盘系统上层的负担会明显加大。机械硬盘时代,笔记本标配的硬盘IOPS普遍在100之内,如今给你换成了IOPS几千甚至队列深度增加后可以消化几万IOPS的主控,那么给上层总线和设备带来的负担又找谁去解决哪?这就造成了新的瓶颈。低QD下的总线延迟问题(节能),高QD下的处理负担问题(处理能力)。既然如此笔记本应该如何配固态硬盘?选择性能稳定,可靠性强的即可,不用追求高IOPS,那个真的不是移动设备上用的。


8月14日更新------
本帖想说的观点总结:

1.固态硬盘的IOPS已经非常高,厂商们标的IOPS都是这块固态硬盘在最佳化或者最大并发下主控能跑出的性能。所以光看IOPS是没有任何意义的,实际在QD1随机4KB读取下大家都是比较接近的,范围在5000~8000附近。(误差取决于平台和盘里的数据分布情况)

2.为了便于理解,我这里假设把一块SATA的主流固态硬盘主控解释成一颗“32核的CPU”,平日我们的应用程序基本都没有为“多核心”优化,只能使用到单核的性能(5000~8000IOPS能力),现在某个程序需要吃掉4000IOPS的性能,那么我们说对于一块5000IOPS的固态硬盘来说,单核主控能力占用80%,另块8000IOPS能力的固态硬盘,单核主控能力占用50%,虽然“CPU”占用率不同,但是表现出来的速度却是相等的,在这种情况下,这两块固态硬盘性能没有区别。只有当我们的应用程序需求达到了需求5000IOPS以上的要求,例如变成8000IOPS请求,那块差的固态硬盘才会开始出现第二个核心去帮助第一个核心的情况(没NCQ的话就永远保持在单核5000IOPS了),我们说在这种情况下,这块8000IOPS的固态硬盘才有了他的用武之地(只要1个核心就能搞定,理论上延迟会比用到2个核心处理更低)。当然如果我们使用的应用程序是为“多核心”优化的,例如SQL数据库等,从一开始就会从32核里同时请求IOPS,这样的话厂家标注的最大IOPS理论上也就能全部用到了。

3.接着第2点的说法,同样5000IOPS和8000IOPS的2块固态硬盘,如果它们的持续传输率不同,假设510是5000IOPS,400MB/s持续传输率,320是8000IOPS,200MB/s持续传输率,那么当IOPS请求在4000的时候,510的速度绝对会比320更快。(这些IOPS中大数据出现的概率越多,510拉开的差距越大)。当IOPS请求达到15000的时候,510的速度就不见得比320来的快了,由于已经接近主控能力极限,因为510的指标是最大20000IOPS,当IOPS请求超过20000时,320的优势开始体现,510因为主控核心的能力都用完,只能眼看着320拉开差距。(官方指标显示320的IOPS在35000以上)

4.我们在机械硬盘时代经过了那么多年,IOPS的能力常年保持在单盘60~200附近(5400~15000转),我们的操作系统在日常应用下虽然表现出对IOPS的饥渴,但是绝对不会有几十倍甚至几百倍的需求,因此当我们使用了IOPS超过机械硬盘几十倍甚至几百倍的固态硬盘时,表现出来的速度差距却并没有像IOPS提升的那么夸张。(速度提升普遍在1.5~3倍之内,除了那些刻意拉差距的情况(比如用脚本的方式同时开启50~100个应用程序),我想平日没人那么做的吧)。那么这里我就说,平日我们的操作对IOPS的要求在200~500之间,给你5000IOPS的固态硬盘,和给你8000IOPS的固态硬盘,差距一点没有(如果有差距,那就是持续传输率不同的差距)。

5.所以厂商们,请不要再把IOPS给神话了,消费级的产品需要的不是几万几十万的IOPS(我们的操作是日常应用,我们的应用不需要那么多的IOPS),而是真正的速度(低延迟和高持续)。低延迟意味着QD1下的IOPS,高持续意味着大文件下的传输速度。我要说的话说完了,谢谢。

今天挺晚了,到此为止吧,下次有机会的话,我们来说说“文件系统”和带来的影响。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
无心飘落 发表于 2011-8-13 00:36 | 显示全部楼层
沙花,学习了~~
James007ss 发表于 2011-8-13 00:37 | 显示全部楼层
浴室新大作,顶完再睡,纠结党需要好好学习这个。
zwjohnny 发表于 2011-8-13 00:39 | 显示全部楼层
沙发先。。。。
lsndc 发表于 2011-8-13 08:47 | 显示全部楼层
mark~
mkhq 发表于 2011-8-13 09:29 | 显示全部楼层
mark。。。
世纪冰雷 发表于 2011-8-13 11:03 | 显示全部楼层
学习了。很讲解得很通俗易懂~
royalk 发表于 2011-8-13 11:56 | 显示全部楼层
举个例子,光速小东东正在嗑瓜子,他每秒可以嗑瓜子100个,此时唠叨小娟娟每隔0.1秒,和他说话打断他,每次时间0.5秒,意味着每0.6秒光速小东东只能嗑瓜子10个,可以计算出光速小东东每秒嗑瓜子实际是16个。
tonycy 发表于 2011-8-13 12:10 | 显示全部楼层
大作..需要时间消化消化
whajcf 发表于 2011-8-13 12:16 | 显示全部楼层
又一篇技术文 仔细阅读了一个中午
qyq_wjx 发表于 2011-8-13 12:38 | 显示全部楼层
写的相当不错啊,大作啊,慢慢学习!
windyes 发表于 2011-8-13 13:55 | 显示全部楼层
虽然CPU占用率高点 但全部工程完成时间大大减少 再加上玩固态硬盘的多少也会超频 ,SSD基础上 CPU上去了 整机性能那个快啊
tux2049 发表于 2011-8-13 15:11 | 显示全部楼层
我来好好学习啊
灵威谁仰 发表于 2011-8-13 18:11 | 显示全部楼层
看来给笔记本选择了Intel的G2还是很正确的⋯⋯
夜色迷离 发表于 2011-8-13 18:11 | 显示全部楼层
很有用的解释
35954514 发表于 2011-8-13 21:54 | 显示全部楼层
学习时间!
net2knight 发表于 2011-8-13 22:25 | 显示全部楼层
实际上就是测试软件里的QD项基本可以无视
ypysbzxyj 发表于 2011-8-13 23:32 | 显示全部楼层
真的很不错,很清楚,看完了比较明白不会一脑袋浆糊,谢谢
maoyanjiea 发表于 2011-8-14 00:52 | 显示全部楼层
好强大的技术文章,浴大V5
hyqb 发表于 2011-8-14 01:06 | 显示全部楼层
前排围观
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部