大话存储第三章-磁盘原理与技术详解
一些磁盘结构示意图:
1 硬盘结构
- 盘片:每个盘片有上下两个盘面,从上到下从0开始编号,盘面号又叫磁头号;
- 磁道:磁盘格式化划分多个同心圆,同心圆轨迹叫做磁道,从最外圈向内从0开始编号;外圈线速度快,读写速度要比内圈快;每段圆弧叫一个扇区,从1开始编号,每个扇区的数据作为读写最小单位被同时读出或写入;离主轴最远的0磁道存放着用于操作系统启动必须的程序代码,PC启动后BIOS程序在加载任何操作系统或其他程序时,默认从0磁道读取代码运行。
- 柱面:所有盘上的同一磁道,在竖直方向上构成一个圆柱,称为柱面;数据的读写按照柱面进行,因为选取磁头只需要电子切换,速度较快,而选取磁道需要机械切换,速度较慢;
- 扇区:扇区头标存放描述扇区的元数据,CHS编址方式转向LBA编址方式,磁盘对外提供的地址全是线性的LBA(logical block address)地址;磁盘初始化时,将磁盘控制电路的ROM芯片中的对应关系数据载入缓冲区,磁盘控制器可以通过LBA找到对应的物理地址。扇区按照交叉因子(Interleave)进行编号。MFM(Modified Frequency Modulation)改进型调频制编码进行编号,不同磁道之间的Interleave不同。
- 计算机与外设交换数据用统一的抽象接口SCSI(小型计算机系统接口),Skip Mask IO促进效率提升。
2 磁盘高层技术
- 磁盘中的队列技术:实现磁盘队列技术的控制代码放在磁盘控制电路芯片中,而不是主板的磁盘控制器上。控制器发命令给磁盘,磁盘自己的DSP固化电路或微处理器载入代码执行排队功能。但是在磁盘控制器(主板上的磁盘控制,不是磁盘控制电路本身的控制电路)电路中也要固化代码(或者在磁盘控制器驱动中加入处理排队的代码)处理排队,和磁盘配合使用,使得cpu得到自己想要的数据顺序。
- 无序传输技术:能读多少先读多少,可以先读扇区的尾部,立即发给控制器待磁盘旋转到头部时再发送剩余部分。把麻烦留给控制器,把简单留给磁盘,因为控制器的速度要快很多。
- 磁头扫描控制算法:
- FCFS(先来先服务):按照IO进入的先后顺序寻道,在随机的IO环境中严重影响IO效率;
- SSTF(Shortest Seek Time First):磁头跳到距离当前磁头位置最近的一个IO磁道去读写,存在饿死;
- SCAN(回旋扫描模式):来回到达终点折返,最传统,最经典,不会饿死任何IO;
- C-SCAN(单向扫描模式):磁头总是从内圈向外圈扫描,达到外圈之后迅速折返。返回途中不接受任何IO;
- LOOK(智能监察扫描)和C-LOOK(智能监察单向扫描):look模式只需要到达最两端的IO;
3 磁盘缓存表现为电路板上的一块RAM芯片,接受指令数据、预读
4 磁盘性能影响因素
磁盘每个时刻只允许一个磁头读写数据,不管盘片和磁头再多,也不可能提高硬盘的吞吐量和IO性能,只能提高容量。有人致力于磁头并发读写,将盘片与盘片形成RAID,但是目前没有可应用的产品。
- 转速、寻道速度、单碟容量、接口速度;
5 硬盘接口技术
硬盘向用户提供的物理、逻辑抽象出来的接口类型:
- IDE(Integrated Drive Electronics)硬盘接口:也叫PATA(Parallel ATA advanced technology attachment)
- SATA硬盘接口(Serial ATA 串行传输ATA):速度更快,可靠性更高,节省空间;
- SCSI硬盘接口(Small Computer System Interface):具备与多种类型外设通信能力,广泛应用于小型机上的高速数据传输技术;应用范围广、多任务、带宽大、CPU占用率低;
6 磁盘控制器、驱动器控制电路、磁盘控制器驱动程序
- 磁盘控制器:硬盘接口除了将硬盘接入到磁盘控制器上的物理接口外,还有定义了一套指令系统的逻辑接口。指令集“定义了怎样向磁盘发送数据和从磁盘读出数据和其他行为”,比如SCSI和ATA指令,逻辑接口就是SCSI和ATA指令集部分。指令实体内容是需要运行于操作系统内核的驱动程序来生成。物理接口的连接,由磁盘控制器芯片负责。磁盘控制器的作用是参与底层总线的初始化、仲裁、指令传输、指令传输状态机、重传、ACK确认等。
- 将复杂的底层机制过滤掉,向驱动程序提供简洁的接口。驱动器只需将指令描述块CDB(Command Description Block include 读写设备号,起始地址etc)传递给控制器,控制器将执行后的信号返回给驱动程序。
- 驱动器控制电路:我们要将磁盘控制器与磁盘驱动器控制电路区分开。驱动器控制电路位于磁盘驱动器上,专门负责直接驱动磁头臂做运动读写数据。主板上的磁盘控制器专门用来向磁盘驱动器发送指令。CPU通过主板上的导线发送ATA或者SCSI指令(CDB)给同样位于主板上的磁盘控制器,磁盘控制器继续通过线路将指令发送带磁盘驱动器并维护底层指令交互状态机,磁盘驱动器解析收到的指令控制磁头臂。
- SCSI或者ATA指令CDB由OS内核的磁盘控制器驱动程序生成并发送。
- 磁盘控制器驱动程序:机器刚启动,操作系统尚未启动并加载磁盘控制器驱动的时候,如何访问磁盘?BIOS中存放了系统初始化的必须的基本代码,在OS内核启动过程中,会用高性能的驱动程序来接管BIOS中驻留的驱动程序。
7 内部传输速率和外部传输速率
- 磁盘内部传输速率指的是理想化的磁头读写磁盘时的最高速率。实际使用时感觉远远没有达到这一速率,因为磁盘换道需要时间。
- 磁头从盘片上将数据读出,存放在硬盘驱动器电路板上的缓存芯片内,再将数据从缓存内取出,通过外部接口传送给主板上的硬盘控制器。通过外部接口传送给主板上的硬盘控制器的传输速率称为外部传输速率。
8 并行传输和串行传输
- 并行传输不适用于长距离信号传输。昂贵,信号衰减等;使用在短距离传输上;
- IO延迟与Queue Depth:业界认为只要IO延迟低于20 ms,那么对于应用程序来说就是可以接受的;
- 存储设备应当提供的IOPS :1000 ms / 20 ms = 每秒50次IO,但是可以做到几十万IOPS;
- 串行传输效率低但是传输速率非常高;
9 磁盘的IOPS和传输带宽(吞吐量)
- 每个层级对IO的定义不同,对于磁盘来说每次IO是指一次SCSI指令交互回合。写入1000个1 KB文件比写入一个1000 KB的文件用时多得多,因为前者可能进行更多的IO读写。
- 设备传输数据时数据流的速度,同一块硬盘在写入不同大小的数据时表现出来的带宽也是不同的。具有高带宽规格的硬盘在传输大块连续数据时具有优势,具有高IOPS的硬盘在传输小块不连续数据时具有优势。
10 固态存储介质和固态硬盘
- SSD(Solid State Drive)是一种利用Flash芯片或者DRAM芯片作为数据永久存储的硬盘。
- SSD 无机械寻道时间,任何地址的访问开销都一样,随机IO性能很好,但是也有致命缺点;
10.1 SSD的硬件组成
(1)所有的ROM和Flash芯片使用”浮动门场效应晶体管”的晶体管体来保存数据。
每个晶体管叫一个cell,有Single Level Cell(SLC)每个cell保存1 bit数据,Multi Level Cell(MLC)每个cell可以保存2 bit数据。MLC容量是SLC两倍,成本差不过,但是复杂容易出错。
FG上的控制门CG连接着字线,当需要此cell表示0,则在CG上加一个足够高的正电压,导通S和D产生的电流,电子冲到FG中。向FG充电cell表示0,将FG放电cell表示1。在MLC中通过控制不同的电势值cell表示不同的状态。
(2)实际使用中我们将cell有序排列起来成为二维矩阵:
- 我们用位线将一些cell的S极和D极串联,得到cell串,位线也是电源线。
- 我们用字线将位于cell串同一位置的cell的控制门CG连起来,实际上起到了并联cell串的作用。
- 每个cell串每次只能读写其中一个cell,多个cell串并联可以并行读写多位数据。一个page中所有位处于每个cell串相同位置上。
10.2 从Flash芯片读数据的过程
当我们要读取某个page的内容,Flash Controller控制芯片将选中的这个page的字线不加电压,电势置为0。将其他的字线施加一个电压,电势升高使得S和D导通,但是这个值又不至于把FG里的电子吸出来。这样,位线的通断状态完全取决于未加电压的字线选中的cell是否有电子。
对于NAND Flash,NOT”被选中cell的通(0)断(1)状态”=“位线的1/0值”。把整个page的1或0传输到芯片外部放在SSD的RAM buffer中,完成一个page内容的读出。SSD的IO最小单位是一个page。
10.3 向Flash芯片写数据的过程
Cell只能有带负电表示0,不带电表示1两种状态。而且感应电路只能表示出两种状态。Flash芯片在修改一个Cell前必须先Erase(即擦除掉)。这里的Erase是将一片连续的Cell即Block放电,将其中所有的Cell变成1状态,每次Erase必须是Block的倍数。Erase后Cell中全为1,遇到写1则不用操作,遇到写0则电路将对应的Cell的字线电压提高使得FG充电,充电之后Cell状态变为0。
要写入某个Cell,选中其所在的page,字线加高压,对应cell的位线加0电压。同一串的其他字线加一个稍低的高电压,不需要写入的Cell的位线也加相同的稍低的高电压。最终,不需写入的Cell的字线位线电压抵消,电子不动;需要写入的Cell由于电势差从位线汲取电子充电。
- 根本不能对同一个page中的cell既充电又放电,此乃Flash之痛。能否分两阶段写0和1?也不行。
- 原因1: Cell绝缘体击穿次数是有限的。我们可以让所有Cell循环写入,不写到原地。预先准备好大片写满全1的Cell,每次写入都写到这些预先准备好的地方,只写0,如果是覆盖写,则把之前的page地址做一个重定向,Flash控制芯片保存一张重定向表。
- 原因2:如果每次写入都要耗费2个周期,写性能会下降,IO一次就放电一次。这样设计者不得不一次擦除大片的Block,采用批发思想,然后写入只需1个周期。代价是后台需要不断放电“批发”。
- SSD会以Page为单位进行写操作,写完一个Page再写下一个Page。
10.4 Flash芯片的通病
- Erase Before Overwrite
- 要向某个Block写入数据,不管原来Block中是1还是0,新写入的数据是1还是0,必须先Erase整个Block为全1,然后才能写新数据。这样大大增加了覆盖写的开销。
- 如果只想更改某个Block中的某个page,则在Erase之前,需将全部Block中数据读入SSD的RAM Buffer,Erase整个Block,将新page写入RAM相应位置,最后再将RAM中更新的Block写入Flash芯片中。更大增加了写开销,形成大规模的写惩罚(Write Amplification),要求SSD缓存很大。小块随机写IO会产生大倍数的写惩罚。
- SSD向Flash的Free Space写数据没有写惩罚。刚被Erase后,SSD所有的Block对于文件系统或者SSD本身来说都是Free Space,随着数据不断写入,SSD将曾经被写入的Block记录下来,放在自己的Bitmap中,每一bit表示Flash中的一个Block。文件系统删除文件只是修改元数据,修改元数据对应的存储介质区域,没有为存储介质自身制造Free Space。所以对Flash来说Free Space会越来越少,最后没有Free Space每个写都有写惩罚。每个Block中的page必须按照同一个方向写入,SSD控制器记录每个Block内部大段连续空间,可以追加写入连续的page,一般来讲,控制器尽量一次写满整个Block。
- Wear Off
- 随着FG充放电次数变多,二氧化硅绝缘层将损耗,失去绝缘性无法保证FG中保有足够电荷,此时Cell损坏,称为Wear Off,所在的整个page标记为损坏。
- SSD寻址和IO的最小单位为page,损坏page的逻辑地址被重定向到其他完好的预留page,重定向表放在SSD的ROM中,每次加点被载入RAM供随时查询。
- 写惩罚增加了不必要的擦写,大大加速Wear Off,对于读来说,每个Cell可以承受更高数量级的操作。
10.5 NAND与NOR
- NOR Flash多了很多导线面积增大,优点是Cell独立寻址,可直接用地址线寻址,读效率比NAND高,所以可以直接当RAM用,但是擦除单位小,效率比NAND低,不利于写频繁的场景。
10.5 面对通病的五种方法
- 拆东墙补西墙:
- Wear Leveling:为避免同一个Cell被高频率擦写,每次针对某段逻辑LBA地址都写到SSD的Free Space中,无需再做Copy On Write操作。再次遇到针对这个LBA的写操作,SSD将待写入的数据重定向到Free Space中,将之前这个LBA占用的page标记为Garbage,可以回收利用。等到Block中一定比例的page被标记为Garbage,且存在大批满足条件的Block,SSD回批量回收这些Block,执行Copy On Write。将没被标记的page复制到RAM Buffer,汇聚,重写到新Erase的Block中。
- 又可以称为RoW,即Redirect On Write:遇到需要更新的页面Flash控制器将其缓存到RAM中,当缓存的待写入页面到达了一个Block的容量时,直接将其写入擦好的Block中。如果待写入的page没满一个Block,也会写入,不过要记录端点以供后边继续写入。
- 定期清除体内垃圾,轻装上阵:
- SSD自身认识到的Free Space永远少于文件系统认识到的Free Space。所有SSD厂商均提供一个Wiper工具,在OS中运行这个工具,其扫描文件系统内不用的逻辑地址并通知给SSD,SSD可以将对应的Block做擦除并回收到Free Space空间。如果用户向SSD中写满文件又删除这些文件,务必运行Wiper让SSD回收这些垃圾。
- 调节代谢持续清除体内垃圾:
- TRIM可以让文件系统删除某个文件后实时通知SSD回收对应空间。
- Delay/Combine Write:
- Delay Write:是一种存储系统常用的写优化措施。比如先后在统一地址进行两次IO——Write 1和Write 2,则可以直接Write 2。但是控制器在处理Delay Write时要小心针对同一个地址的两次写IO之间是否存在读IO,如果有读IO,先处理读再覆盖写。
- Combine Write:对于机械硬盘的存储系统,控制器收到多个写IO的地址在逻辑上是连续的,则可以合并为针对整体连续地址的大IO,节约SCSI周期。对于SSD来说,逻辑地址本来就是被杂乱映射到可能不连续的物理地址上,所以SSD控制器可以整合任何地址的小块写IO成一个大的写IO,整合之后的大写IO被直接写入一个Free的Block中,大大提升效率。
- 救命稻草,有备无患: SSD预留一部分空间用来重定向写,文件系统不知道。SSD自身对接受的写IO数据使用Write Back模式,接收到主机控制器的数据后立即返回成功,然后异步后台处理与刷盘。所以一旦掉电,必须有保护机制,一般使用一个超级电容维持掉电后的脏数据刷盘。
12 网中有网
Flash Aware FS: TrueFFS、ExtremeFFS。这些能够感知Flash存储方式的FS,可以将大部分SSD内部执行的逻辑拿到FS层来实现。
13 相关术语:
(1)FTL (Flash Translation Layer):NAND flash管理的核心,把Flash基于页面为最小IO单元映射成传统的块设备以512 B扇区为最小IO单位,把逻辑IO地址映射成物理IO地址。FTL同时掌管映射处理和对Flash磨损均衡、垃圾回收、纠错等。FTL层是SSD中一个重要组成部分的一种“设计方案”,类似于数学公式,可以在主控里面用软件实现。
杂谈闪存三:FTL - 老狼的文章 - 知乎 https://zhuanlan.zhihu.com/p/26944064
(2)SATA 与 PCIE 是传输接口:
SATA与PCIE都是总线标准,两者的区别在于SATA执行的AHCI协议标准,传输速度目前最高6Gbps;而PCIE传输速度最高可达32Gbps,兼容AHCI标准的SSD,也兼容NVMe标准的SSD。
- SATA是一种物理接口:目前最为廉价和常见的的HDD/SSD硬盘接口,主要优缺点如下:
- 优点:稳定成熟,且性价比高;
- 缺点:带宽最高仅6Gbps,不支持NVMe新技术,而且体积相对比较大。
- PCI-E硬盘接口:相较于SATA硬盘,PCI-E 硬盘通过PCI-E总线与CPU直连,省去了内存调用硬盘的过程,传输效率与速度都成倍提升。但由于闪存颗粒和主控品质问题,PCI-E 硬盘总体成本较高。
(3)NVMe,AHCI和IDE是传输协议(语言)
- 运行在诸如PCIE或SATA之类的传输接口之上。
- 现在市面上 SSD接入PC 的主要接口 是 SATA。其采用命令协议AHCI(它还支持IDE)是为寻道旋转磁盘设计的, 而不是闪存。
- NVMe是最新的高性能和优化协议,取代了AHCI,并支持PCIE技术。
(4)目前PCIE Flash的专用IO协议有NVMe和SCSIe两种