概叙
科普文:软件架构Linux系列之【并发问题的根源:CPU缓存模型详解】-CSDN博客
科普文:软件架构Linux系列之【从硬件角度了解内存DRAM和DDR5】-CSDN博客
科普文:软件架构Linux系列之【读懂Linux内存管理:mmap(Memory-Mapped File)内存映射文件】-CSDN博客
科普文:软件架构Linux系列之【搞懂常见的 RAID(独立磁盘冗余阵列) 级别】_linux 软raid性能-CSDN博客
科普文:软件架构Linux系列之【独立磁盘冗余阵列RAID 5实验】-CSDN博客
科普文:软件架构Linux系列之【从硬件角度了解机械盘HDD】-CSDN博客
前面了解了机械盘,我们继续看看固态盘SSD。
SSD是Solid State Disk的首字母缩写,一般称为“固态硬盘”。SSD与机械硬盘HDD不同,它没有活动机构。而是使用NAND闪存技术存储。
固态硬盘SSD通过电子电路来读取写入数据。由于不需要机械机构完成读写,所以SSD的功耗要比HDD低。
固态盘SSD详解
什么是固态盘SSD?
固态硬盘(Solid State Drives),用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。
固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也完全与普通硬盘一致。
固态盘SSD的优缺点
优点:
- 1.速度快:SSD的读写速度远高于HDD,尤其是在随机读写性能方面更是显著领先。这使得系统启动、程序加载和文件传输等操作更加迅速。
- 2.功耗低:SSD没有机械部件,功耗相比HDD更低,尤其适用于笔记本和移动设备,有助于延长电池续航时间。
- 3.可靠性高:SSD没有活动部件,不容易受到震动和冲击的影响,数据丢失风险较低。此外,SSD的故障模式相对可预测,可以提前预警。
- 4.噪音低:由于没有机械部件,SSD在工作时几乎没有噪音,非常适合需要安静环境的应用场景。
缺点:
- 1.成本较高:尽管SSD的价格近年来有所下降,但与HDD相比,单位存储成本仍然较高,特别是对于大容量SSD而言。
- 2.寿命有限:闪存单元的写入次数有限,尽管现代SSD通过各种技术延长寿命,但长时间大量写入操作仍可能导致性能下降甚至损坏。
- 3.容量有限:目前市场上的SSD容量通常在几十GB到几TB之间,虽然已经能够满足大多数需求,但在极大容量存储方面仍不及HDD。
机械盘HDD和固态盘SSD对比
HDD和SSD各有优缺点,适合的才是最好的。下面从容量、速度、寿命、价格等4个方面进行对比。
-
容量
SSD受限于存储颗粒,目前普通消费者买到的SSD容量,一般不超过4TB。
HDD容量较大,市面主流销售的最高可到20TB之上。
-
速度
不管是顺序读写还是4K读写,SSD访问数据的速度远高于HDD速度。尤其是小文件读写。
而我们日常使用磁盘,更多的是小文件的读写。所以,硬盘升级为SSD确实可以极大地提高电脑的性能。
顺序读写
HDD:HDD的大文件读写速度普遍在 100-260M/s 之间,SMR 会低于这个值。
SSD:基于SATA协议的大概在500~700M/s之间,基于NVME的可以高达3000+M/s
随机读写(4K)
HDD:海量小文件读写速度很低,大概几M/s
SSD:基于SATA协议的大概在30+M/s之间,基于NVME的大概在100+M/s
-
寿命
机械硬盘HDD长期断电后,数据可以保存10年以上。
固态硬盘SSD在连续断电1年后,就会因为浮栅内的电子衰减而彻底丢失数据,并且该丢失的数据不可恢复。这一点大家要注意。
-
价格
参考电商平台JD最新的HDD和SSD的价格如下:
机械硬盘:1TB SATA CMR 7200转的西数价格是299。
固态硬盘:1TB NVME 7300MB/S的西数价格是750。
以上,同品牌同容量SSD比HDD价格上还是要贵一倍多。
常见硬盘协议
AHCI:Advanced Host Controller Interface的首字母缩写,即高级主机控制器接口。(HDD)
NVMe:Non Volatile Memory Host Controller Interface Specification的首字母缩写,即非易失性内存主机控制器接口规范。(SSD)
AHCI和NVMe协议都是上层协议,用来实现系统与存储硬件的沟通。
SATA:Serial ATA的缩写,即串行ATA。它是由“SATA工作组”在2000年11月提出的一种计算机总线。主要是用于主板与大容量存储设备进行数据传输。该总线具有结构简单和支持热插拔的特点。SATA接口有SATA1.0,SATA2.0,SATA3.0。所有的SATA向前兼容,接口一样,只是传输速度不同而已。
mSATA:miniSATA,通过名称就能看出来它是SATA的迷你版。尺寸更小。
M.2:有两种类型:NVMe(M key)和NGFF(B key)。
PCIe:Peripheral component interconnect express的首字母缩写,即高速串行计算机扩展总线标准。目前有PCIe1.0、PCIe2.0、PCIe3.0、PCIe4.0、PCIe5.0几个版本,不同版本传输速率不同。
固态盘SSD分类:存储介质
固态硬盘(SSD)的存储介质分为两种:一种是采用闪存(FLASH芯片)作为存储介质,另外一种是采用DRAM作为存储介质。
- 基于闪存类:基于闪存的固态硬盘(IDEFLASH DISK、Serial ATA Flash Disk),采用FLASH芯片作为存储介质,这也是通常所说的SSD。它的外观可以被制作成多种模样,例如:笔记本硬盘、微硬盘、存储卡、U盘等样式。这种SSD固态硬盘最大的优点就是可以移动,而且数据保护不受电源控制,能适应于各种环境,适合于个人用户使用。
- 基于DRAM类:基于DRAM的固态硬盘,采用DRAM作为存储介质,应用范围较窄。它仿效传统硬盘的设计,可被绝大部分操作系统的文件系统工具进行卷设置和管理,并提供工业标准的PCI和FC接口用于连接主机或者服务器。应用方式可分为SSD硬盘和SSD硬盘阵列两种。它是一种高性能的存储器,而且使用寿命很长,美中不足的是需要独立电源来保护数据安全。DRAM固态硬盘属于比较非主流的设备。
固态盘SSD分类:接口类型
根据接口和用途的不同,SSD可以分为以下4种类型:
- 1.SATA SSD:SATA是最常见的SSD接口,主要用于消费级市场。SATA SSD的传输速率一般为6Gbps,性能相比HDD有显著提升,但相对于其他接口的SSD(如PCIe SSD)则略显逊色。
- 2.PCIe SSD:PCIe接口的SSD具有更高的传输速率,通常用于高性能计算和数据中心等领域。PCIe SSD可以提供几GBps的传输速率,是SATA SSD的数倍。
- 3.3SSD:M.2是一个小型化的接口标准,广泛应用于超薄笔记本、台式机和服务器等设备。M.2接口可以支持SATA和PCIe两种模式,PCIe模式的M.2 SSD性能更为强劲。
- 4.NVMe SSD:NVMe(Non-Volatile Memory Express)是一种针对SSD优化的协议,专为PCIe接口设计。NVMe SSD的性能比传统的AHCI协议更为出色,延迟更低,读写速度更快。
其中,SATA接口的固态硬盘是最早出现的一种,目前市场上的绝大多数固态硬盘都是采用SATA接口,其读写速度在500MB/s左右。
而PCIe接口的固态硬盘具有更高的读写速度和更低的时延,能够提供更好的性能表现,适用于高性能计算、游戏等领域。
目前,固态硬盘在市场上的份额逐渐增加,与机械硬盘的竞争也日趋激烈。固态硬盘的出货量也在逐年增长,预计到2026年,固态硬盘出货量将达到1.72亿台。
同时,随着技术的不断发展,固态硬盘的容量将逐渐增大,价格也将逐渐降低,未来固态硬盘将成为主流存储设备之一。
固态盘SSD的构成和原理
SSD主要由主控制器,存储单元,缓存(可选),以及跟HOST接口(诸如SATA,SAS, PCIe等)组成。
固态硬盘(Solid State Drive,SSD)是一种由闪存芯片组成的存储设备,与传统的机械硬盘不同,它没有机械运动部件。固态硬盘由控制器、闪存芯片、DRAM缓存等部分组成。
控制器是固态硬盘的核心部件,它控制着读写操作、数据传输和垃圾回收等功能。控制器的性能直接影响固态硬盘的整体性能和寿命。
闪存芯片是固态硬盘的存储媒介,主要分为SLC、MLC、TLC、QLC四种类型。SLC是最早应用的闪存芯片,读写速度快,寿命长,但成本高。MLC、TLC和QLC则是随着技术的不断发展而逐渐出现的,它们的读写速度较SLC慢,但成本更低,容量更大。同时,MLC、TLC和QLC的寿命也相对较短。
DRAM缓存是固态硬盘中的一部分,主要用于存储操作系统和应用程序等常用数据,以提高读写性能。DRAM缓存的容量大小影响着固态硬盘的性能表现。
1.闪存(NAND Flash):这是SSD的核心部分,用于存储数据。根据制造工艺和存储单元的排列方式,闪存可以分为SLC(单层单元)、MLC(多层单元)、TLC(三层单元)和QLC(四层单元)等类型。SLC的速度最快、寿命最长,但成本也最高;QLC则存储密度最高、成本最低,但性能和寿命较差。
- SLC(Single Level Cell 单层单元),就是在每个存储单元里存储 1bit 的数据,存储的数据是0还是1是基于电压阀值的判定,对于 NAND Flash 的写入(编程),就是控制 Control Gate 去充电(对 Control Gate 加压),使得浮置栅极存储的电荷够多,超过4V,存储单元就表示 0(已编程),如果没有充电或者电压阀值低于4V,就表示 1(已擦除)。
- MLC(Multi-Level Cell 多层单元), 就是每个存储单元里存储 2bit 的数据,存储的数据是”00”,”01”,”10”,”11”也是基于电压阀值的判定,当充入的电荷不足3.5V时,就代表”11”,当充入的电荷在3.5V和4.0V之间,则代表”10”,当充入的电荷在4V和5.5V之间,则表示”01”,当充入的电荷在5.5V以上,则表示”00”。同时由前面的图可以看到,MLC 相比 SLC 虽然使用相同的电压值,但是电压之间的阀值被分成了4份,可以想象这样就直接影响了性能和稳定性。
- TLC(Triple Level Cell 三层单元), 就更加复杂,因为每个存储单元里存储 3bit 的数据,所以它的电压阈值的分界点就更细致,导致的结果也就每个存储单元的可靠性也更低。
- 内部结构:一个Flash Page由两个或者多个Die(又称chips组成),这些Dies可以共享I/0数据总线和一些控制信号线。一个Die又可以分为多个Plane,而每个Plane又包含多个多个Block,每个Block又分为多个Page。以Samsung 4GB Flash为例,一个4GB的Flash Page由两个2GB的Die组成,共享8位I/0数据总线和一些控制信号线。每个Die由4个Plane组成,每个Plane包含2048个Block,每个Block又包含64个4KB大小的Page。
2.控制器(Controller):控制器负责管理数据的读写操作、执行错误校正、优化性能和延长闪存寿命等任务。它相当于SSD的大脑,不同品牌和型号的SSD通常会使用不同的控制器,这也是影响SSD性能的重要因素之一。
3.缓存(Cache):为了提高数据读写速度,SSD通常会配备一定容量的缓存。缓存可以是DRAM(动态随机存取存储器),也可以是闪存本身的一部分。缓存的存在可以有效减少数据访问的延迟。
4.接口(Interface):SSD通过接口与计算机系统进行数据传输。常见的接口有SATA(串行ATA)、PCIe(Peripheral Component Interconnect Express)和M.2等。不同接口的传输速率和性能差异较大。
访问固态盘SSD的原理
- 1:Host是通过LBA(Logical BlockAddress,逻辑地址块)访问SSD的,Host访问SSD的基本单元叫用户页(Host Page)
- 2:SSD内部,SSD主控与Flash之间是Flash Page为基本单元访问Flash的,我们称Flash Page为物理页(Physical Page)
- 3:Host每写入一个Host Page, SSD主控会找一个Physical Page把Host数据写入,SSD内部同时记录了这样一条映射(Map)。有了这样一个映射关系后,下次Host需要读某个Host Page 时,SSD就知道从Flash的哪个位置把数据读取上来。 SSD内部维护了一张映射表(Map Table),Host每写入一个Host Page,就会产生一个新的映射关系,这个映射关系会加入(第一次写)或者更改(覆盖写)Map Table;当读取某个Host Page时, SSD首先查找Map Table中该Host Page对应的Physical Page,然后再访问Flash读取相应的Host数据。
- 4:大部分映射是存储在FLASH里面,还有一部分存储在片上RAM上。当Host需要读取一笔数据时,对有板载DRAM的SSD来说,只要查找DRAM当中的映射表,获取到物理地址后访问Flash从而得到Host数据.这期间只需要访问一次FlashH;而对Sandforce的SSD来说,它首先看看该Host Page对应的映射关系是否在RAM内,如果在,那好办,直接根据映射关系读取FLASH;如果该映射关系不在RAM内,那么它首先需要把映射关系从FLASH里面读取出来,然后再根据这个映射关系读取Host数据,这就意味着相比有DRAM的SSD,它需要读取两次FLASH才能把HOST数据读取出来,底层有效带宽减半。
固态盘SSD相关概念和技术
FTL:闪存转换层
位于文件系统和物理介质之间,把闪存的操作习惯虚拟成以传统硬盘的 512B 扇区进行操作。
这样,操作系统就可以按照传统的扇区方式操作,而不用担心之前说的擦除/读/写问题.
FTL 算法,本质上就是一种逻辑到物理的映射,因此,当文件系统发送指令说要写入或者更新一个特定的逻辑扇区时,FTL 实际上写入了另一个空闲物理页,并更新映射表,再把这个页上包含的旧数据标记为无效(更新后的数据已经写入新地址了,旧地址的数据自然就无效了)。
磨损平衡(Wear leveling)
磨损平衡是确保闪存的每个块被写入的次数相等的一种机制。
动态磨损算法是基本的磨损算法:只有用户在使用中更新的文件占用的物理页地址被磨损平衡了。
而静态磨损算法是更高级的磨损算法:在动态磨损算法的基础上,增加了对于那些不常更新的文件占用的物理地址进行磨损平衡,这才算是真正的全盘磨损平衡。
简单点说来,动态算法就是每次都挑最年轻的 NAND 块来用,老的 NAND 块尽量不用。静态算法就是把长期没有修改的老数据从一个年轻 NAND 块里面搬出来,重新找个最老的 NAND 块放着,这样年轻的 NAND 块就能再度进入经常使用区。
垃圾回收(Garbagecollection)
当整个SSD写满后,从用户角度来看,如果想写入新的数据,则必须删除一些数据,然后腾出空间再写。用户在删除和写入数据的过程中,会导致一些Block里面的数据变无效或者变老。
Block中的数据变老或者无效,是指没有任何映射关系指向它们,用户不会访问到这些FLASH空间,它们被新的映射关系所取代。比如有一个Host Page A,开始它存储在FLASH空间的X,映射关系为A->X。后来,HOST重写了该Host Page,由于FLASH不能覆盖写,SSD内部必须寻找一个没有写过的位置写入新的数据,假设为Y,这个时候新的映射关系建立:A->Y,之前的映射关系解除,位置X上的数据变老失效,我们把这些数据叫垃圾数据。
随着HOST的持续写入,FLASH存储空间慢慢变小,直到耗尽。如果不及时清除这些垃圾数据,HOST就无法写入。SSD内部都有垃圾回收机制,它的基本原理是把几个Block中的有效数据(非垃圾数据)集中搬到一个新的Block上面去,然后再把这几个Block擦除掉,这样就产生新的可用Block了.
垃圾回收策略
- a: 闲置垃圾回收:,SSD 主控制器可以设置在系统闲置时候做“预先”垃圾回收(提前做垃圾回收操作),保证一定数量的”备用空白块”,让 SSD 在运行时候能够保持较高的性能
- b:被动垃圾回收:每个 SSD 都支持的技术,在垃圾回收操作消耗带宽和处理能力的同时处理用户操作数据,如果没有足 够强劲的主控制器性能则会造成明显的速度下降。
- c:手动垃圾回收:用户自己手动选择合适的时机运行垃圾回收软件,执行垃圾回收操作。
Trim 指令
Trim 只是条 ATA 指令指令,让操作系统告诉 SSD 主控制器这个页已经“无效”了。Trim 会减少写入放大,因为主控制器不需要复制“无效”的页(没 Trim 就是“有效”的)到空白块里,这同时代表复制的“有效”页变少了,垃圾回收的效率和 SSD 性能也提升了。Trim 能大量减少伪有效页的数量,它能大大提升垃圾回收的效率。
预留空间(Over-provisioning)
预留空间是指用户不可操作的容量,为实际物理闪存容量减去用户可用容量。
这块区域一般被用来做优化,包括磨损均衡,GC和坏块映射。
- (1)垃圾回收:就是要把数据搬来搬去,那就需要始终有空的地方来放搬的数据。空的越多,搬的越快,多多益善,有些SSD为了更快,还会再拿走一些用户的容量。
- (2)映射表等内部数据保存:SSD里面有一个巨大的映射表,把用户地址转成物理Flash颗粒地址,需要保存,以防掉电丢失。这个大概是千分之三的容量。
- (3)坏块替换:写得多了,坏块会逐渐增加,需要用好的顶替。随着Flash的制程从32nm不断变小,变到现在的14nm,Flash质量越来越差,坏块越来越多,这部分可能会到3%甚至更多。
写入放大
因为闪存必须先擦除(也叫编程)才能写入,在执行这些操作的时候,移动或覆盖用户数据和元数据(metadata)不止一次。
这些额外的操作,不但增加了写入数据量,减少了SSD的使用寿命,而且还吃光了闪存的带宽,间接地影响了随机写入性能。这种效应就叫写入放大(Write amplification)。
一个主控的好坏主要体现在写入放大上。
影响因素:
- (1)垃圾回收虽然增加了写入放大(被动垃圾回收不影响,闲置垃圾回收影响),但是速度有提升。
- (2)预留空间可以减少写入放大,预留空间越大,写入放大越低。
- (3)开启 TRIM 指令后可以减少写入放大
- (4)用户使用中没有用到的空间越大,写入放大越低(需要有 Trim 支持)。
- (5)持续写入可以减少写入放大。理论上来说,持续写入的写入放大为1,但是某些因素还是会影响这个数值。
- (6)随机写入将会大大提升写入放大,因为会写入很多非连续的 LBA。
- (7)磨损平衡机制直接提高了写入放大
交叉操作
交错操作可以成倍提升NAND的传输率,因为NAND颗粒封装时候可能有多Die、多Plane(每个plane都有4KB寄存器),Plane操作时候可以交叉操作(第一个plane接到指令后,在操作的同时第二个指令已经发送给了第二个plane,以此类推),达到接近双倍甚至4倍的传输能力(看闪存颗粒支持度)。
ECC
为了检测数据的可靠性,在应用NAND Flash的系统中一般都会采用一定的坏区管理机制,而管理坏区的前提是能比较可靠的进行坏区检测。
如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page中只有一个或几个bit出错,这时候ECC就能发挥作用了。
不同颗粒有不同的基本ECC要求,不同主控制器支持的ECC能力也不同,理论上说主控越强ECC能力越强。