大纲

数字化的存储介质有很多。类似机械磁盘,固态盘,磁带,光盘,等都是不同的介质而已。整个世界都在数字化,而数据就存在这些介质中。
存储介质作为数字化的基石,它们的重要性可想而知,而近些年 SSD 的带来的革命则更为深刻,原本毫秒、秒级别的时延被优化到微秒级别,几百的 IOPS 优化到万,十万级别。这样带来的变化进一步影响软件的变革,并且还在继续。今天就简单聊聊 SSD 的一些原理。
先给自己预设一些问题:

  1. SSD 的存储单元是什么?
  2. SSD 有没有覆盖写?
  3. 顺序写和随机写的区别是啥?
  4. SSD 非 4K 对齐的 IO 性能这么差?

    还记得机械盘吗?

    机械盘主要是用磁性物质的极性来表示状态 0,1 ,读写过程是磁头来做的。磁头利用其变化的磁场改变磁盘磁粒的极性,这样就做到写入数据。磁头通过识别磁盘磁粒的极性来读取数据了。
    大家都瞧不起机械盘 ,觉得性能太慢是技术能力不行?
    其实机械盘是一种尖端技术,世界上只有那么两三家公司(比如希捷,西数等)有能力生产机械硬盘,国内还没这技术。也算是卡脖子的技术之一吧。不过好在 SSD 给了我们新的历史机遇,可以迎头赶上,甚至弯道超车也有可能。
    它对比 SSD 为什么慢?
    一个是机械运动,一个是电子的流动。这个速度差别可想而知。

    SSD 一般是什么介质?

    目前大部分的固态硬盘都是以闪存芯片为存储介质。所以本文简单默认 SSD 盘的介质就是闪存。
    闪存的基本存储单元是一种叫做浮栅晶体管的东西。于 1967年由华裔美国工程师施敏和韩裔美国工程师姜大元发明。浮栅管也属于半导体晶体管的一种,浮栅晶体管太学术的原理这就不讲。思考一个问题:它为什么可以作为存储设备的单元?
    因为浮栅晶体管很特殊,它捕捉到电子之后可以保存起来数十年之久,电子保存在绝缘材料包裹的浮栅层中。示意图如下:
    SSD 的基本原理 - 图1

    1、思考:为什么浮栅管可以作为是持久化的介质 ?

    因为电子一旦进入浮栅层,就逃不出去了。掉电之后浮栅层的电子也不会消散。相当于就把状态持久化下来。

    2、思考:闪存介质如何是标识 0,1 两种状态呢 ?

    是否可以通过测量浮栅层里面有多少电子来判断?
    理论上好像可以。比如假定电子数量超过一个阈值就认为是 0,否则就是 1。但现实是电子数量非常难测量,所以通过另一种等价的方式来体现了 0 和 1,就是电流是否导通,也就是开关性。
    浮栅层是否有足够的电子能够影响电路的开关,也等价标识了 0 和 1 的状态。浮栅管就是这样做的,具体来看一下。
    给控制极加一个低压,漏极加一个电压。如果电流是导通的,那么说明浮栅层里是空的(或者说没有足够的电子),状态为 1。如果电流不通,那么说明浮栅层里有足够的电子,状态为 0 。
    注意,电压数值都是为了具现化随手拍出来的,并不是真实厂家的数值。一般阈值电压都是厂家出厂前测出并设置好的的。
    其中导通的原理是什么?
    第一种情况:浮栅层是空的,没多余电子(初始状态)。
    这个时候给控制极加一个低压,漏极加一个电压。这个时候,电子会尽量被控制极吸引,但由于电压不够击穿绝缘层,所以就只是累积在N+源极和N+漏极之间,形成一条通路。
    电子被漏极电压吸引,进而流向源极形成通路。这个“电流导通”的状态就表示 1 。
    SSD 的基本原理 - 图2
    第二种情况:浮栅层有足够电子(电子跃迁进来被捕获的)。
    浮栅层中如果有很多电子,那么它们会抵消掉很大一部分控制极对衬底里电子的吸引力。从而导致中间是一条断开的路,无法形成电流。这种状态表示 0 。
    SSD 的基本原理 - 图3
    划重点:漏极和源极如果导通标识为 1 ,不通为 0 。影响这个的因素就是浮栅层是否有足够电子。

    3、思考:源极和漏极有啥区别?

    物理结构上没啥区别,它们就是对称的结构。源极和漏极是以电子流动的方向做的划分而已。电子从源极往漏极流动,电流方向相反。
    高中物理:电流的方向和电子移动方向相反,电子往高电压方向流动。

    4、思考:浮栅层的电子又是怎么来的呢 ?

    顶部控制极加高电压,就能把电子吸上来,往控制极流动。高压的吸引力会大到让部分电子因为量子隧穿效应穿过绝缘的二氧化硅进入浮栅。 请注意,进去之后就出不来了(完成持久化),除非衬底 P 加高电压,原路径把电子吸出来。
    ![[浮栅管写操作 1.png]]
    SSD 的基本原理 - 图4

    5、思考:浮栅层捕获电子是从 1 到 0 的过程,那从 0 到 1 的过程是怎样?

    从 0 到 1 的过程其实就是如何把浮栅层里的捕获的电子掏出来。之前是在控制极加高电压,让电子跃迁到浮栅层,掏出来的话,自然是在相反的方向(衬底P)加高电压喽,让电子重新吸出来。
    SSD 的基本原理 - 图5

    6、思考:为什么初始状态 SSD 是全 1 数据?

    因为浮栅层初始状态是没有电子在里面的,只有当电力驱动的时候,电子才能跃迁到浮栅层。所以初始化状态是全 1 的数据。

    SSD 的组织形式

    SSD 的闪存介质就是由成千上万个上面的浮栅晶体管组成的,由它们组成 0101010 这样的一系列数据,从而形成想要的存储数据。
    闪存本质上是用电路的开关来表示 0,1 的状态,所以本质上 SSD 怎么去组织这些存储单元(浮栅晶体管),换句话说,就就是一个电路设计的事情。
    SSD 盘内部按照 LUN,Plane,Block,Page,存储单元(浮栅管) 这样的层次。不同的层次共用了不同的资源。整体的闪存内部的组织:
    SSD 的基本原理 - 图6
    LUN 是接收和执行闪存的基本单元,换句话说,不同的 LUN 之间可以并发执行命令。一个 LUN 内,同一时间只能有一个命令在执行。
    每个 Plane 有自己独立的缓存,这个缓存是读写数据的时候用的。举个例子,写数据的时候,先把数据从主控传输到这个 Cache ,然后再把 Cache 写到闪存阵列,读的时候则是把 Page 的数据从闪存介质读取到 Cache ,然后传输主控。
    擦除的粒度是 Block , Block 里所有的存储单元共用衬底。
    SSD 盘 IO 的单元是 Page 。也就是说,无论是从闪存介质中读数据到 Cache ,还是把 Cache 的数据写到闪存介质,都是以 Page 为单位。
    其实这里还有两个概念,一个是 Wordline ,还有一个 Bitline 。这两个概念得去看一下 Block 的组织结构,很关键:
    SSD 的基本原理 - 图7
    一个 Wordline 对应一个或多个 Page 。如果是 1 个 Page 那就是 SLC,2 个的是 MLC,3 个就是 TLC 。SLC 可靠性最高。一个 Block 中所有的存储单元(浮栅管)共用一个衬底。
    下面为了简单,就只讨论 SLC 的场景。
    读一个 Page 的时候,其实就是监测 Bitline 的导通性即可。

    SSD 的读写擦的姿势

    SSD 以闪存为介质,闪存的存储单元是浮栅管,但是读写擦的单元肯定不能以浮栅管为粒度,因为代价太大了。它们的操作粒度肯定是权衡出一个批量操作的值来,一次性操作一批。

    1、闪存的读

    把每个存储单元的导通性监测一遍,导通的表示 1,不通的表示 0 。所以得到的数据就是 0101101001 这样的数据了。Bitline 是和 Wordline 相交的,通过每个 Bitline 来监测导通性即可。

    2、闪存的写

    按照数据 01010111 把对应位置的导通性重新设置,Page 对应的 Wordline 加高电压,并且根据 0,1 的标识来控制一条条 Bitline 的电压,对应位置为 0 的 Bitline 电压为 0,让电子吸到浮栅层。对应位置为 1 的 Bitline 加低电压阻碍隧道效应,这样就完成了闪存的写。

    3、闪存的擦除

    闪存的擦除就是把所有的存储单元都恢复到初始状态,也就是浮栅层里无电子,存储单元全 1 的状态。这个只需要在衬底加高电压,电子就会从浮栅层吸出来。闪存的擦除以 Block 为单元。

    思考

    1、闪存的擦除是以 Block 为单元的,为什么呢?

    因为在电路设计上, Block 的所有存储单元(浮栅晶体管)是共用一个衬底的(Substrate)。当对衬底施加高电压的时候,那么所有的存储单元浮栅层的电子都会被吸出来。电子吸出来,就是擦除的过程喽。

    2、SSD 没有覆盖写?

    是的。从上面的设计来看,浮栅管的开关标识了 0 和 1 的状态。数据的写入是改变这个开关导通性,数据的读取是监测这个导通性。SSD 盘的设计本质上是电路的设计,当前的电路设计上来讲,无法做到直接在原地修改每个存储单元的导通性。因为它的设计关联到给谁加高电压,给谁加低电压。
    所以最简单的方法,就是给一初始状态(全 1),然后把指定的位置加高电压即可。这样的设计应该是最简单,成本上最可控。

    3、SSD 随机写和顺序写还有区别吗?

    如果是对一个 SSD 新盘来讲,性能没啥区别。但是读写久而久之就会有区别了,顺序写会导致需要擦除的 Block 比较集中,比较好处理一些。也更容易做读写的均衡。随机的 IO 则会带来更复杂的 GC 。所以它可能进一步影响后续的寿命,并且久了还可能影响性能。因为找到一个新 Block 的时间可能不一样。

    4、非对齐的 IO 性能很差?

    是的。IO 大小不按照 Page 对齐,那么可能导致 IO 的次数变多,可能会严重影响性能。多一次 IO ,那么对整个盘跑满来讲,可能性能就降低一倍。IO 的放大还可能影响寿命。

    总结

  5. 闪存的持久化状态体现在浮栅层捕获的电子,通过这个影响浮栅管的导通性来表示标识 0 和 1 的状态;

  6. 浮栅层是否能关住电子就决定了 SSD 的寿命,如果它总是关不住电子,那说明它差不多到期了;
  7. 对浮栅晶体管的反复读写会影响它的寿命;
  8. SSD 盘内部擦除的单元是 Block ,因为 Block 内部的存储单元共用衬底;
  9. SSD 盘 IO 读写的单元是 Page ,如果 IO 大小不对齐,那么会导致 IO 的放大,影响性能;
  10. SSD 盘没有覆盖写,永远都是写新的位置。这些新的位置都会是初始状态(全 1 数据);
  11. SSD 内部的垃圾回收来保证持续有新的 Block 可写;
  12. SSD 的随机和顺序 IO 写影响更多的是 GC 的效率,从而影响寿命和性能;