首页 > 系统相关 >科普文:软件架构Linux系列之【从硬件角度了解固态盘SSD】

科普文:软件架构Linux系列之【从硬件角度了解固态盘SSD】

时间:2024-11-07 13:45:32浏览次数:6  
标签:闪存 写入 固态 Host 软件架构 Linux SSD 硬盘

概叙

科普文:软件架构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作为存储介质。

  1. 基于闪存类:基于闪存的固态硬盘(IDEFLASH DISK、Serial ATA Flash Disk),采用FLASH芯片作为存储介质,这也是通常所说的SSD。它的外观可以被制作成多种模样,例如:笔记本硬盘、微硬盘、存储卡、U盘等样式。这种SSD固态硬盘最大的优点就是可以移动,而且数据保护不受电源控制,能适应于各种环境,适合于个人用户使用。
  2. 基于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了.


垃圾回收策略

  1. a: 闲置垃圾回收:,SSD 主控制器可以设置在系统闲置时候做“预先”垃圾回收(提前做垃圾回收操作),保证一定数量的”备用空白块”,让 SSD 在运行时候能够保持较高的性能
  2. b:被动垃圾回收:每个 SSD 都支持的技术,在垃圾回收操作消耗带宽和处理能力的同时处理用户操作数据,如果没有足 够强劲的主控制器性能则会造成明显的速度下降。
  3. 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能力越强。
 

标签:闪存,写入,固态,Host,软件架构,Linux,SSD,硬盘
From: https://blog.csdn.net/Rookie_CEO/article/details/143591320

相关文章

  • 【Linux内核设计思想】三、Linux内核的启动过程
    欢迎关注博主Mindtechnist或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关注公粽号《机器和智能》回复关键词“python项目实战......
  • Linux 服务器开启秘钥登陆方式,现在root直接登陆
    1.重新加载sshd服务,使其配置更改生效本地制作公钥与私钥,将公钥上传到/root/.ssh/authorized_keys文件,如果文件夹和文件没有就创建出来vi/root/.ssh/authorized_keys保存就可以只能用私钥登陆服务器了,不需要使用root账号密码,而且私钥也没有密码2配置sshd服务支持密钥认证......
  • Linux:认识文件系统
    一、认识硬件——磁盘1.1物理构成   磁盘是唯一的一个机械设备,也是一个外设!   以前的老式电脑上装的就是机械磁盘,现在由于用户对使用计算机的速度要求越来越高,现在我们普通人使用的电脑基本上都是用的SSD固态硬盘,SSD固态硬盘并没有像机械磁盘那样的机械运动,读写......
  • Linux 下搭建 Spark3 + Jupyter 环境
    最近想着来玩一玩大数据,前段时间集中过了一遍java,最近又看了一些基础的scala,我感觉吧,我都不想学.还是觉得用sql,javascript,python这种脚本语言操作起来顺手,但这并不影响对这个大数据生态的理解和学习.这里主要是来记录一下spark+jupyter环境的搭建,说实......
  • rocky linux详细安装过程
     Centos已经停止维护,我们这里安装一个rockylinux,其也是基于redhat的开源linux系统,也算是与Centos同宗同源了,个人使用可以作为Centos的替代品。1.rockylinux镜像下载rockeylinux下载地址: 下载–RockyLinux,不过这个地址下载特别慢我们这里直接去阿里的镜像站下载......
  • Ubuntu Linux中安装MySQL教程
    在UbuntuLinux中安装MySQL步骤步骤一:更新软件包列表首先,更新你的软件包列表:sudoaptupdate步骤二:安装MySQL服务器使用以下命令安装MySQL服务器:sudoaptinstallmysql-server步骤三:启动MySQL服务安装完成后,启动MySQL服务:sudosystemctlstartmysql......
  • Linux 外设驱动 应用 6 摄像头采集实验
    摄像头采集实验1摄像头基础介绍1.1驱动介绍-V4L2简介1.2硬件介绍2代码编写2.1打开设备文件2.2取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等2.3选择视频输入,一个视频设备可以有多个视频输入。VIDIOC_S_INPUT,structv4l2......
  • 别再被多线程搞晕了!一篇文章轻松搞懂 Linux 多线程同步!
    前言大家有没有遇到过,代码跑着跑着,线程突然抢资源抢疯了?其实,这都是“多线程同步”在作怪。多线程同步是个老生常谈的话题,可每次真正要处理时还是让人头疼。这篇文章,带你从头到尾掌握Linux的多线程同步,把概念讲成大白话,让你看了不再迷糊,还能拿出来装一装逼!不管是“锁”、“信号......
  • Linux 基础知识总结
    简介Linux是一个开源的类Unix操作系统内核,由LinusTorvalds在1991年首次发布。如今,Linux已经发展成为一个庞大的操作系统家族,广泛应用于服务器、桌面、移动设备和嵌入式系统等多个领域。本文将为你提供一个关于Linux的基础知识总结,帮助你快速了解和掌握Linux的核心......
  • SELinux
      SELinux安全增强式Linux(Security-EnhancedLinux)安全增强式Linux是一个Linux内核的安全模块,其提供了访问控制安全策略机制,包括了强制访问控制。SELinux是一组内核修改和用户空间工具,已经被添加到各种Linux发行版中。其软件架构力图将安全决策的执行与安全策略分离,并......