前言
- 为什么CPU与内存之间的速度差距如此大呢?
- 有什么方法可以解决这两者之间速度的差距么?
- 了解了计算机各存储原理对编程有什么帮助呢?
- 为什么传统的HDD难以提升其性能?
- 为什么SDD访问性能会比HDD好如此多?
- SDD性能比机械硬盘好那么多,价格算亲民,市面为何还是存在如些多的HDD?
一、存储器的层次结构
直观感受计算机的层次结构如下图所示:
![存储器的层次关系图](https://i-blog.csdnimg.cn/blog_migrate/e23750a95db4234464adf38a090cb6d1.png)
Register
寄存器可以说是CPU自带的一种存储器,只能存放极其有限的信息,但是速度非常快,和 CPU 同步。
CPU Cache
- 1. 用的是一种叫作 SRAM(Static Random-Access Memory,静态随机存取存储器)的芯片。
- 2. SRAM 之所以被称为“静态”存储器,是因为只要处在通电状态,里面的数据就可以保持存在。
- 3. 在 SRAM 里面,一个比特的数据,需要 6~8 个晶体管。所以 SRAM 的存储密度不高。
- 4. 同样的物理空间下,能够存储的数据有限。不过,因为 SRAM 的电路简单,所以访问速度非常快。
- 5. 在 CPU 里,通常会有 L1、L2、L3 这样三层高速缓存。每个 CPU 核心都有一块属于自己的 L1 高速缓存,通常分成指令缓存和数据缓存,分开存放 CPU 使用的指令和数据。
DRAM
- 1. 内存用的芯片和 Cache 有所不同,它用的是一种叫作 DRAM(Dynamic Random Access Memory,动态随机存取存储器)的芯片。
- 2. DRAM 被称为“动态”存储器,是因为 DRAM 需要靠不断地“刷新”,才能保持数据被存储起来。
- 3. DRAM 的一个比特,只需要一个晶体管和一个电容就能存储。数据是存储在电容里的,电容会不断漏电,所以需要定时刷新充电,才能保持数据不丢失。
- 4. DRAM 的数据访问电路和刷新电路都比 SRAM 更复杂,所以访问延时也就更长。
二、HDD
HDD(Hard Disk Drive)也就是机械硬盘。通常硬盘衡量其性能是用IOPS。
IOPS(Input/Output Operations Per Second)每秒的读写次数;通常硬盘的为100左右。
机械硬盘的组成
如上图,一块机械硬盘是由盘面、磁头和悬臂三个部件组成的。
- 盘面(Disk Platter)
其实就是我们实际存储数据的盘片。
通常我们电脑硬盘的转速,也就是指盘面中间电机控制的转轴的旋转速度,英文单位叫 RPM,也就是每分钟的旋转圈数(Rotations Per Minute)。
- 磁头(Drive Head)
数据并不能直接从盘面传输到总线上,而是通过磁头,从盘面上读取到,然后再通过电路信号传输给控制电路、接口,再到总线上的。
- 悬臂(Actutor Arm)
链接在磁头上,把磁头定位到盘面的某个特定的磁道(Track)上。
机械硬盘的读取
硬盘上随机读取的时间主要是由寻道时间、旋转延迟和数据传输时间三部分构成。
寻道时间
读写磁头移动至正确的磁道上所需要的时间。 HDD 硬盘的平均寻道时间一般在 4-10ms。
旋转延迟
盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间。
旋转延迟取决于磁盘转速,通常使用磁盘旋转一周所需时间的1/2表示。
比如,7200 rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000 rpm的磁盘其平均旋转延迟约为2ms。
数据传输时间
完成传输所请求的数据所需要的时间,它取决于数据传输率,其值等于数据大小除以数据传输率。
目前IDE/ATA能达到133MB/s,SATA II可达到300MB/s的接口数据传输率,数据传输时间通常远小于前两部分时间,因此计算IOPS时可以将其忽略。
一台转速7200的硬盘理论IOPS:1000/(4.17+4) = 125 或 1000/(4.17+10) = 70
那怕是20000转的最高IOPS其实也是很小的,1000/(60*1000/20000/2 + 4) = 181
这些还是理想状态上的值,事实可能比这个还要小。
那么有没有什么方法可以提升硬盘的IOPS呢?
其实通过上述的描述,我们知道IOPS由寻道时间+旋转延迟决定的。
那么要提升IOPS无非就是缩短这两个因素,而对于旋转延迟可以看到从7200转到20000转,IOPS的提升也没有那么明显。那么也就只能是提升寻道时间了。
而到底该如何提升呢?
思路是缩短寻道的距离,在不改变工艺的情况下,比较方便的是减少磁头转动的面,也就是只在盘面存储二分之一或更少的数据,也就是通常说的以空间换取效率的思想。
如7200转只存取1/4硬盘,IOPS: 1000/(4.17+4/4) = 193。发现其性能优过2W转的了。有一个很显的弊端就是存储的数据量变少了很多,但要知道2W转的硬盘可比7200转的贵不只四倍。
三、SSD
固态硬盘存储原理
记录一个比特很容易理解。给电容里面充上电有电压的时候就是 1,给电容放电里面没有电就是 0。采用这样方式存储数据的 SSD 硬盘,我们一般称之为使用了 SLC 的颗粒,全称是 Single-Level Cell,也就是一个存储单元中只有一位数据。逻辑结构如下图所示:
但如上图如里用SLC方式那么存储的容易会跟CPU那样存储空间上不去,因此硬件科学家利用上了电压,也就是利用工艺技术给电容中充入不同的电压,以便可以表示更多的数据,这么做读取数据或存储数据需要更加精细,因此速度会有所降低,逻辑结构如下图:
说明:只有一个电容,我们怎么能够表示更多的比特呢?
别忘了,这里还有一个电压计。4 个比特一共可以从 0000-1111 表示 16 个不同的数。
那么,如果能往电容里面充电的时候,充上 15 个不同的电压,并且电压计能够区分出这 15 个不同的电压。
加上电容被放空代表的 0,就能够代表从 0000-1111 这样 4 个比特了。
总的一句话: SSD 的物理原理,也就是“电容 + 电压计”的组合。
适用场景
SSD 硬盘的寿命取决于单个存储块的擦除次数。
总的来说SSD 硬盘,特别适合读多写少的应用。
在日常应用里面,我们的系统盘适合用 SSD。但是,如果用 SSD 做专门的下载盘,一直下载各种影音数据,然后刻盘备份就不太好了,特别是现在 QLC 颗粒的 SSD,它只有几千次可擦写的寿命啊。
在数据中心里面,SSD 的应用场景也是适合读多写少的场景。我们拿 SSD 硬盘用来做数据库,存放电商网站的商品信息很合适。但是,用来作为 Hadoop 这样的 Map-Reduce 应用的数据盘就不行了。因为 Map-Reduce 任务会大量在任务中间向硬盘写入中间数据再删除掉,这样用不了多久,SSD 硬盘的寿命就会到了。
SSD之IOPS
笔者测试自己电脑效率如下
- 说明:
- 2048K-ok代表4K已经对齐。
- Seq测试性能是顺序读写测试。
- 4K表示随机读写小文件的处理性能。通俗地说就是去随机读取磁盘上某一个 4KB 大小的数据,一秒之内可以读取到多少数据。笔者用的是SATA 3.0 的接口,理论带宽是 6Gb/s,相当于每秒可以传输 768MB 的数据。
- 如果要SSD硬盘更快就得换PCI Express 接口,这个的峰值基本可以上到1G以上。
拿这个 35MB/s 和一次读取 4KB 的数据算一下。
35MB / 4KB = 9000
如果是写入的话呢,会更多一些,
79MB /4KB = 20000
也就是说,一秒之内,这块 SSD 硬盘可以随机读取 9000次的 4KB 的数据,可以随机写入 20000 次的 4KB 的数据。也就是IOPS可以轻易达到万次的级别。
小结:
芯片造得越大,总有部分离 CPU 的距离会变远。电信号的传输速度又受物理原理的限制,没法超过光速。
这里有个很形象的表示上述几者的关系,如下图所示:
SSD与HDD的区别:
![](https://i-blog.csdnimg.cn/blog_migrate/c957c0fbd4daa013b41bf9dc17334d8e.jpeg)
SSD与HDD的对比 :
机械硬盘要远强于 SSD,那就是耐用性。
如果我们需要频繁地重复写入删除数据,那么机械硬盘要比 SSD 性价比高很多。
SSD 硬盘,特别适合读多写少的应用。