Blog

SSD硬盘的预留空间

Content #

SSD 硬盘的容量是不是用不满的?因为我们总会遇到一些红色空洞?

没错,一块 SSD 的硬盘容量,是没办法完全用满的。不过,为了不得罪消费者,生产 SSD 硬盘的厂商,其实是预留了一部分空间,专门用来做这个“磁盘碎片整理”工作的。

一块标成 240G 的 SSD 硬盘,往往实际有 256G 的硬盘空间。SSD 硬盘通过我们的控制芯片电路,把多出来的硬盘空间,用来进行各种数据的闪转腾挪,让你能够写满那 240G 的空间。这个多出来的 16G 空间,叫作预留空间(Over Provisioning),一般 SSD 的硬盘的预留空间都在 7%-15% 左右。

Viewpoints #

From #

46 | SSD硬盘(上):如何完成性能优化的KPI?

SSD硬盘数据写入原理

Content #

下面我们来实际看一看,一块 SSD 硬盘在日常是怎么被用起来的。

用三种颜色分别来表示 SSD 硬盘里面的页的不同状态,白色代表这个页从来没有写入过数据,绿色代表里面写入的是有效的数据,红色代表有过数据,但从操作系统看来已经删除。

一开始,所有块的每一个页都是白色的。随着我们开始往里面写数据,里面的有些页就变成了绿色。

然后,因为我们删除了硬盘上的一些文件,所以有些页变成了红色。但是这些红色的页,并不能再次写入数据。因为 SSD 硬盘不能单独擦除一个页,必须一次性擦除整个块,所以新的数据,我们只能往后面的白色的页里面写。这些散落在各个绿色空间里面的红色空洞,就好像硬盘碎片。

如果有哪一个块的数据一次性全部被标红了,那我们就可以把整个块进行擦除。它就又会变成白色,可以重新一页一页往里面写数据。这种情况其实也会经常发生。毕竟一个块不大,也就在几百 KB 到几 MB。你删除一个几 MB 的文件,数据又是连续存储的,自然会导致整个块可以被擦除。

随着硬盘里面的数据越来越多,红色空洞占的地方也会越来越多。于是,你会发现,我们就要没有白色的空页去写入数据了。这个时候,我们要做一次类似于 Windows 里面“磁盘碎片整理”或者 Java 里面的“内存垃圾回收”工作。找一个红色空洞最多的块,把里面的绿色数据,挪到另一个块里面去,然后把整个块擦除,变成白色,可以重新写入数据。

不过,这个“磁盘碎片整理”或者“内存垃圾回收”的工作,我们不能太主动、太频繁地去做。因为 SSD 的擦除次数是有限的。如果动不动就搞个磁盘碎片整理,那么我们的 SSD 硬盘很快就会报废了。

Viewpoints #

From #

46 | SSD硬盘(上):如何完成性能优化的KPI?

SSD硬盘的结构

Content #

如果我们去看一看 SSD 硬盘的硬件构造,可以看到,它大概是自顶向下是这么构成的。

首先,自然和其他的 I/O 设备一样,它有对应的接口和控制电路。现在的 SSD 硬盘用的是 SATA 或者 PCI Express 接口。在控制电路里,有一个很重要的模块,叫作 FTL(Flash-Translation Layer),也就是闪存转换层。这个可以说是 SSD 硬盘的一个核心模块,SSD 硬盘性能的好坏,很大程度上也取决于 FTL 的算法好不好。

接下来是实际 I/O 设备,它其实和机械硬盘很像。现在新的大容量 SSD 硬盘都是 3D 封装的了,也就是说,是由很多个裸片(Die)叠在一起的,就好像我们的机械硬盘把很多个盘面(Platter)叠放再一起一样,这样可以在同样的空间下放下更多的容量。

接下来,一张裸片上可以放多个平面(Plane),一般一个平面上的存储容量大概在 GB 级别。一个平面上面,会划分成很多个块(Block),一般一个块(Block)的存储大小, 通常几百 KB 到几 MB 大小。一个块里面,还会区分很多个页(Page),就和我们内存里面的页一样,一个页的大小通常是 4KB。

在这一层一层的结构里面,处在最下面的两层块和页非常重要。

对于 SSD 硬盘来说,数据的写入叫作 Program。写入不能像机械硬盘一样,通过覆写(Overwrite)来进行的,而是要先去擦除(Erase),然后再写入。

SSD 的读取和写入的基本单位,不是一个比特(bit)或者一个字节(byte),而是一个页(Page)。SSD 的擦除单位就更夸张了,我们不仅不能按照比特或者字节来擦除,连按照页来擦除都不行,我们必须按照块来擦除。

而且,你必须记住的一点是,SSD 的使用寿命,其实是每一个块(Block)的擦除的次数。你可以把 SSD 硬盘的一个平面看成是一张白纸。我们在上面写入数据,就好像用铅笔在白纸上写字。如果想要把已经写过字的地方写入新的数据,我们先要用橡皮把已经写好的字擦掉。但是,如果频繁擦同一个地方,那这个地方就会破掉,之后就没有办法再写字了。

我们上面说的 SLC 的芯片,可以擦除的次数大概在 10 万次,MLC 就在 1 万次左右,而 TLC 和 QLC 就只在几千次了。这也是为什么,你去购买 SSD 硬盘,会看到同样的容量的价格差别很大,因为它们的芯片颗粒和寿命完全不一样。

Viewpoints #

From #

46 | SSD硬盘(上):如何完成性能优化的KPI?

...

SLC、MLC、TLC和QLC

Content #

要想知道为什么 SSD 的耐用性不太好,我们先要理解 SSD 硬盘的存储和读写原理。CPU Cache 用的 SRAM 是用一个电容来存放一个比特的数据。对于 SSD 硬盘,我们也可以先简单地认为,它是由一个电容加上一个电压计组合在一起,记录了一个或者多个比特。

能够记录一个比特很容易理解。给电容里面充上电有电压的时候就是 1,给电容放电里面没有电就是 0。采用这样方式存储数据的 SSD 硬盘,我们一般称之为使用了 SLC 的颗粒,全称是 Single-Level Cell,也就是一个存储单元中只有一位数据。

但是,这样的方式会遇到和 CPU Cache 类似的问题,那就是,同样的面积下,能够存放下的元器件是有限的。如果只用 SLC,我们就会遇到,存储容量上不去,并且价格下不来的问题。于是呢,硬件工程师们就陆续发明了 MLC(Multi-Level Cell)、TLC(Triple-Level Cell)以及 QLC(Quad-Level Cell),也就是能在一个电容里面存下 2 个、3 个乃至 4 个比特。

只有一个电容,我们怎么能够表示更多的比特呢?别忘了,这里我们还有一个电压计。4 个比特一共可以从 0000-1111 表示 16 个不同的数。那么,如果我们能往电容里面充电的时候,充上 15 个不同的电压,并且我们电压计能够区分出这 15 个不同的电压。加上电容被放空代表的 0,就能够代表从 0000-1111 这样 4 个比特了。

不过,要想表示 15 个不同的电压,充电和读取的时候,对于精度的要求就会更高。这会导致充电和读取的时候都更慢,所以 QLC 的 SSD 的读写速度,要比 SLC 的慢上好几倍。

Viewpoints #

From #

46 | SSD硬盘(上):如何完成性能优化的KPI?

...

SSD和机械硬盘的优缺点

Content #

SSD 和机械硬盘的优缺点。

不管是机械硬盘不擅长的随机读写,还是它本身已经表现不错的顺序写入,SSD 在这些方面都要比 HDD 强。不过,有一点,机械硬盘要远强于 SSD,那就是耐用性。如果我们需要频繁地重复写入删除数据,那么机械硬盘要比 SSD 性价比高很多。

Viewpoints #

From #

46 | SSD硬盘(上):如何完成性能优化的KPI?

换手率(Turnover Rate)

Content #

“换手率”也称“周转率”,指在一定时间内市场中股票转手买卖的频率,是反映股票流通性强弱的指标之一。

换手率=某一段时期内的成交量/发行总股数×100%

在中国:成交量/流通股本×100%

一般情况,大多股票每日换手率在1%——2.5%(不包括初上市的股票)。 70%的股票的换手率基本在3%以下,3%就成为一种分界。当一支股票的换手率在3%——7%之间时,该股进入相对活跃状态。 7%——10%之间时,则为强势股的出现,股价处于高度活跃当中。 10%——15%,大庄密切操作。超过15%换手率,持续多日的话,此股也许成为最大黑马。

From #

涨跌额(change)

涨跌额(change)

Content #

指股票现价与要比较的周期的收盘价的差额。

日K线的涨跌额为当日收盘价与上一交易日收盘价的差额。

涨跌幅则为当日收盘价相比于上一交易日收盘价的涨跌幅。

From #

Partial Stroking

Content #

Partial Stroking 或者 Short Stroking。

既然访问一次数据的时间,是“平均延时 + 寻道时间”,那么只要能缩短这两个之一,不就可以提升 IOPS 了吗?

一般情况下,硬盘的寻道时间都比平均延时要长。那么自然就可以想一下,有什么办法可以缩短平均的寻道时间。最极端的办法就是不需要寻道,也就是说,把所有数据都放在一个磁道上。比如,始终把磁头放在最外道的磁道上。这样,寻道时间就基本为 0,访问时间就只有平均延时了。那样, IOPS,就变成了

1s / 4ms = 250 IOPS

实践中,可以只用 1/2 或者 1/4 的磁道,也就是最外面 1/4 或者 1/2 的磁道。这样,硬盘可以使用的容量可能变成了 1/2 或者 1/4。但是,寻道时间,也变成了 1/4 或者 1/2,因为悬臂需要移动的“行程”也变成了原来的 1/2 或者 1/4, IOPS 就能够大幅度提升了。

比如说,一块 7200 转的硬盘,正常情况下,平均延时是 4.17ms,而寻道时间是 9ms。那么,它原本的 IOPS 就是

1s / (4.17ms + 9ms) = 75.9 IOPS

如果只用其中 1/4 的磁道,那么,它的 IOPS 就变成了

1s / (4.17ms + 9ms/4) = 155.8 IOPS

...

机械硬盘随机访问延时

Content #

读取数据,其实就是两个步骤。

  1. 把盘面旋转到某一个位置。在这个位置上,悬臂可以定位到整个盘面的某一个子区间。这个子区间的形状有点儿像一块披萨饼,一般把这个区间叫作几何扇区(Geometrical Sector),意思是,在“几何位置上”,所有这些扇区都可以被悬臂访问到。
  2. 把悬臂移动到特定磁道的特定扇区,也就在这个“几何扇区”里面,找到实际的扇区。找到之后,磁头会落下,就可以读取到正对着扇区的数据。

所以,进行一次硬盘上的随机访问,需要的时间由两个部分组成。

  1. 平均延时(Average Latency)。这个时间,其实就是把我们的盘面旋转,把几何扇区对准悬臂位置的时间。这个

时间很容易计算,它其实就和机械硬盘的转速相关。随机情况下,平均找到一个几何扇区,需要旋转半圈盘面。7200 转的硬盘,一秒里面,就可以旋转 240 个半圈。那么,这个平均延时就是

1s / 240 = 4.17ms

  1. 平均寻道时间(Average Seek Time)也就是在盘面选转之后,悬臂定位到扇区的的时间。现在用的 HDD 硬盘的平均

寻道时间一般在 4-10ms。这样,我们就能够算出来,如果随机在整个硬盘上找一个数据,需要 8-14 ms。我们的硬盘是机械结构的,只有一个电机转轴,也只有一个悬臂,所以没有办法并行地去定位或者读取数据。那一块 7200 转的硬盘,一秒钟随机的 IO 访问次数,也就是

1s / 8 ms = 125 IOPS 或者 1s / 14ms = 70 IOPS

一般来说,HDD 硬盘的 IOPS 每秒 100 次左右。

Viewpoints #

From #

45 | 机械硬盘:Google早期用过的“黑科技”