行情
HOME
行情
正文内容
nand 读写最小单位 「干货」如何搞懂Linux 文件系统与持久性内存?(上)
发布时间 : 2024-10-06
作者 : 小编
访问数量 : 23
扫码分享至微信

「干货」如何搞懂Linux 文件系统与持久性内存?(上)

Linux 虚拟文件系统介绍

在 Linux 系统中一切皆文件,除了通常所说的狭义的文件以外,目录、设备、套接字和管道等都是文件。

文件系统在不同的上下文中有不同的含义:

在存储设备上组织文件的方法,包括数据结构和访问方法,到存储设备。

按照某种文件系统类型格式化的一块存储介质。我们常说在某个目录下挂载或卸载文件系统, 这里的文件系统就是这种意思。

内核中负责管理和存储文件的模块,即文件系统模块。

Linux文件系统的架构如下图所示,分为用户空间、内核空间和硬件3个层面:

注意:上图中方块对齐关系,很多时候我们分不清内核文件系统中 "cache" 和 "buffer" 的区别,毕竟两者都可以翻译为 "缓存区",但是从图中,就可以很清晰的看出所谓的 "cache" 其实指的就是图中的 "页缓存" 它是针对文件来说的,除了 "DAX"(直接访问方式的设备)它不使用 "缓存",其他的闪存类,块设备类设备都会使用到 "页缓存" 也就是 "cache",而 "buffer" 其实指的就是图中的 "块缓存" 它是针对块设备的。

01硬件层面

外部存储设备分为块设备、闪存和 NVDIMM 设备 3 类,块设备主要有以下两种:

机械硬盘:机械硬盘的读写单位是扇区。访问机械硬盘的时候,需要首先沿着半径 方向移动磁头寻找磁道,然后转动盘片找到扇区。

闪存类块设备:使用闪存作为存储介质,里面的控制器运行固化的驱动程序,驱动 程序的功能之一是闪存转换层(Flash Translation Layer,FTL),把闪存转换为块设备, 外表现为块设备。常见的闪存类块设备是在个人计算机和笔记本电脑上使用的固态硬盘 splid State Drives,SSD),以及在手机和平板电脑上使用的嵌入式多媒体存储卡(embedded Multi Media Card,eMMc)和通用闪存存储(Universal Flash Storage,UFS)。闪存类块设备相对机械硬盘的优势是:访问速度快,因为没有机械操作:抗振性很高, 便于携带。

闪存(Flash Memory)的主要特点如下:

在写入数据之前需要擦除一个擦除块,因为向闪存写数据只能把一个位从 1 变成 0,不能从 0 变成 1,擦除的目的是把擦除块的所有位设置为 1

一个擦除块的最大擦除次数有限,NOR闪存的擦除块的最大擦除次数是 10^4~10^3, NAND 闪存的擦除块的最大擦除次数是 10^3~10^6。

闪存按存储结构分为 NAND 闪存和 NOR 闪存,两者的区别如下:

NOR闪存的容量小,NAND 闪存的容量大。

NOR 闪存支持按字节寻址,支持芯片内执行(eXecute In Place,XIP),可以直接 在闪存内执行程序,不需要把程序读到内存中; NAND 闪存的最小读写单位是页或子页, 一个擦除块分为多个页,有的 NAND 闪存把页划分为多个子页。

NOR 闪存读的速度比 NAND 闪存块,写的速度和擦除的速度都比 NAND 闪存慢

NOR 闪存没有坏块;NAND 闪存存在坏块,主要是因为消除坏块的成本太高 NOR 闪存适合存储程序,一般用来存储引导程序比如 uboot 程序;NAND 闪存适 合存储数据。

为什么要针对闪存专门设计文件系统?主要原因如下:

NAND 闪存存在坏块,软件需要识别并且跳过坏块。

需要实现损耗均衡( wear leveling),损耗均衡就是使所有擦除块的擦除次数均衡, 避免一部分擦除块先损坏。

机械硬盘和 NAND 闪存的主要区别如下:

机械硬盘的最小读写单位是扇区,扇区的大小一般是 512 字节:NAND 闪存的最 小读写单位是页或子页。

机械硬盘可以直接写入数据:NAND 闪存在写入数据之前需要擦除一个擦除块。

机械硬盘的使用寿命比 NAND 闪存长:机械硬盘的扇区的写入次数没有限制:NAND 闪存的擦除块的擦除次数有限。

机械硬盘隐藏坏的扇区,软件不需要处理坏的扇区:NAND 闪存的坏块对软件可 见,软件需要处理坏块。

NVDIMM(Nonn-Volatile DIMM,非易失性内存:DIMM 是 Dual-Inline-Memory-Modules 的缩写,表示双列直插式存储模块,是内存的一种规格)设备把 NAND 闪存、内存和超级电容集成到一起,访问速度和内存一样快,并且断电以后数据不会丢失。在断电的瞬间, 超级电容提供电力,把内存中的数据转移到 NAND 闪存。

02内核空间层面

在内核的目录 fs 下可以看到,内核支持多种文件系统类型。为了对用户程序提供统一的 文件操作接口,为了使不同的文件系统实现能够共存,内核实现了一个抽象层,称为虚拟文件系统(Virtual File System,VFS),也称为虚拟文件系统切换(Virtual Filesystem Switch,VFS) 文件系统分为以下几种。

块设备文件系统,存储设备是机械硬盘和固态硬盘等块设备,常用的块设备文件 系统是 EXT 和 btrfs。EXT 文件系统是 Linux 原创的文件系统,目前有 3 个 成版本:EXT[2-4]。

闪存文件系统,存储设备是 NAND 闪存和 NOR 闪存,常用的闪存文件系统是 JFFS2 ,(日志型闪存文件系统版本2, Journalling Flash File System version2)和 UBIFS(无序区块镜像文件系统, Unsorted Block Image File System)。内存文件系统的文件在内存中,断电以后文件丢失,常用的内存文件系统是 tmpfs, 用来创建临时文件。

伪文件系统,是假的文件系统,只是为了使用虚拟文件系统的编程接口,常用的 伪文件系统如下所示:

sockfs,这种文件系统使得套接字(socket)可以使用读文件的接口 read 接收报文, 使用写文件的接口 write 发送报文。

proc 文件系统,最初开发 proc 文件系统的目的是把内核中的进程信息导出到用户空间, 后来扩展到把内核中的任何信息导出到用户空间,通常把 proc 文件系统挂载在目录 "proc" 下。

sysfs,用来把内核的设备信息导出到用户空间,通常把 sysfs 文件系统挂载在目录 "/sys"下。

hugetlbfs,用来实现标准巨型页。

cgroup 文件系统,控制组(control group cgroup)用来控制一组进程的资源, cgroup 文件系统使管理员可以使用写文件的方式配置 cgroup。

cgroup2 文件系统, cgroup2 是 cgroup 的第二个版本, cgroup2 文件系统使管理员可 以使用写文件的方式配置 cgroup2。

这些文件系统又各自有着相关的特性:

页缓存:访问外部存储设备的速度很慢,为了避免每次读写文件时访问外部存储设备,文件系统模块为每个文件在内存中创建了一个缓存,因为缓存的单位是页,所以称为页缓存。

块设备层:块设备的访问单位是块,块大小是扇区大小的整数倍。内核为所有块设备实现了统一 的块设备层。

块缓存:为了避免每次读写都需要访问块设备,内核实现了块缓存,为每个块设备在内存中创 建一个块缓存。缓存的单位是块,块缓存是基于页缓存实现的。

IO 调度器:访问机械硬盘时,移动磁头寻找磁道和扇区很耗时,如果把读写请求按照扇区号排序, 可以减少磁头的移动,提高吞吐量。IO 调度器用来决定读写请求的提交顺序,针对不同的 使用场景提供了多种调度算法:NOOP(No Operation)、CFQ(完全公平排队, Complete Fair Queuing)和 deadline(限期)。NOOP 调度算法适合闪存类块设备,CFQ 和 deadline调度算 法适合机械硬盘。

块设备驱动程序:每种块设备需要实现自己的驱动程序。

内核把闪存称为存储技术设备( Memory Technology Device,MTD),为所有闪存实现 了统一的 MTD 层,每种闪存需要实现自己的驱动程序。针对 NVDIMM 设备,文件系统需要实现 DAX(Direct Access直接访问:X 代表 eXciting,没有意义,只是为了让名字看起来酷),绕过页缓存和块设备层,把 NVDIMM 设备里面的内存直接映射到进程或内核的虚拟地址空间。

libnvdimm 子系统提供对 3 种 NVDIMM 设备的支持:持久内存(persistent memory,PMEM) 模式的 NVDIMM 设备,块设备(block,BLK)模式的 NVDIMM 设备,以及同时支持PMEM 和 BLK 两种访问模式的 NVDIMM 设备。PMEM 访问模式是把 NVDIMM 设备当作内存,BLK 访问模式是把 NVDIMM 设备当作块设备。每种 NVDIMM 设备需要实现自己的驱动程序。

下一代存储技术NVIDMM

NVDIMM (Non-Volatile Dual In-line Memory Module) 是一种可以随机访问的, 非易失性内存。非易失性内存指的是即使在不通电的情况下, 数据也不会消失。因此可以在计算机掉电 (unexpected power loss), 系统崩溃和正常关机的情况下, 依然保持数据。NVDIMM 同时表明它使用的是 DIMM 封装, 与标准DIMM 插槽兼容, 并且通过标准的 DDR总线进行通信。考虑到它的非易失性, 并且兼容传统DRAM接口, 又被称作Persistent Memory。

01种类

目前, 根据 JEDEC 标准化组织的定义, 有三种NVDIMM 的实现。分别是:

NVDIMM-N 指在一个模块上同时放入传统 DRAM 和 flash 闪存,计算机可以直接访问传统 DRAM。支持按字节寻址,也支持块寻址。通过使用一个小的后备电源,为在掉电时数据从 DRAM 拷贝到闪存中提供足够的电能;当电力恢复时再重新加载到 DRAM 中。

NVDIMM-N示意图

NVDIMM-N 的主要工作方式其实和传统 DRAM是一样的。因此它的延迟也在10的1次方纳秒级。而且它的容量,受限于体积,相比传统的 DRAM 也不会有什么提升。

同时它的工作方式决定了它的 flash 部分是不可寻址的,而且同时使用两种介质的作法使成本急剧增加,但是 NVDIMM-N 为业界提供了持久性内存的新概念。目前市面上已经有很多基于NVIMM-N的产品。

NVDIMM-F 指使用了 DRAM 的DDR3或者 DDR4 总线的flash闪存。我们知道由 NAND flash 作为介质的 SSD,一般使用SATA,SAS 或者PCIe 总线。使用 DDR 总线可以提高最大带宽,一定程度上减少协议带来的延迟和开销,不过只支持块寻址。

NVDIMM-F 的主要工作方式本质上和SSD是一样的,因此它的延迟在 10的1次方微秒级。它的容量也可以轻松达到 TB 以上。

NVDIMM-P 这是一个目前还没有发布的标准 (Under Development),预计将与 DDR5 标准一同发布。按照计划,DDR5将比DDR4提供双倍的带宽,并提高信道效率。这些改进,以及服务器和客户端平台的用户友好界面,将在各种应用程序中支持高性能和改进的电源管理。

NVDIMM-P 实际上是真正 DRAM 和 flash 的混合。它既支持块寻址, 也支持类似传统 DRAM 的按字节寻址。它既可以在容量上达到类似 NAND flash 的TB以上, 又能把延迟保持在10的2次方纳秒级。

通过将数据介质直接连接至内存总线,CPU 可以直接访问数据,无需任何驱动程序或 PCIe 开销。而且由于内存访问是通过64 字节的 cache line,CPU 只需要访问它需要的数据,而不是像普通块设备那样每次要按块访问。

Intel 公司在2018年5月发布了基于3D XPoint™ 技术的Intel® Optane™ DC Persistent Memory。可以认为是NVDIMM-P 的一种实现。

Intel® Optane™ DC Persistent Memory

02硬件支持

应用程序可以直接访问NVDIMM-P, 就像对于传统 DRAM那样。这也消除了在传统块设备和内存之间页交换的需要。但是向持久性内存里写数据是和向普通DRAM里写数据共享计算机资源的。包括处理器缓冲区, L1/L2缓存等。

需要注意的是, 要使数据持久, 一定要保证数据写入了持久性内存设备, 或者写入了带有掉电保护的buffer。软件如果要充分利用持久性内存的特性, 指令集架构上至少需要以下支持:

写的原子性 表示对于持久性内存里任意大小的写都要保证是原子性的, 以防系统崩溃或者突然掉电。IA-32 和 IA-64 处理器保证了对缓存数据最大64位的数据访问 (对齐或者非对齐) 的写原子性。因此, 软件可以安全地在持久性内存上更新数据。这样也带来了性能上的提升, 因为消除了copy-on-write 或者 write-ahead-logging 这种保证写原子性的开销。

高效的缓存刷新(flushing) 出于性能的考虑, 持久性内存的数据也要先放入处理器的缓存(cache)才能被访问。经过优化的缓存刷新指令减少了由于刷新 (CLFLUSH) 造成的性能影响。

a. CLFLUSHOPT 提供了更加高效的缓存刷新指令

b. CLWB (Cache Line Write Back) 指令把cache line上改变的数据写回内存 (类似CLFLUSHOPT),但是无需让这条 cache line 转变成无效状态(invalid, MESI protocol),而是转换成未改变的独占状态(Exclusive)。CLWB 指令实际上是在试图减少由于某条cache line刷新所造成的下次访问必然的cache miss。

提交至持久性内存(Committing to Persistence)

在现代计算机架构下,缓存刷新的完成表明修改的数据已经被回写至内存子系统的写缓冲区。但是此时数据并不具有持久性。为了确保数据写入持久性内存,软件需要刷新易失性的写缓冲区或者在内存子系统的其他缓存。新的用于持久性写的提交指令 PCOMMIT 可以把内存子系统写队列中的数据提交至持久性内存。

非暂时store操作的优化(Non-temporal Store Optimization)

当软件需要拷贝大量数据从普通内存到持久性内存中时(或在持久性内存之间拷贝), 可以使用弱顺序, 非暂时的store操作 (比如使用MOVNTI 指令)。因为Non-temporal store指令可以隐式地使要回写的那条cache line 失效, 软件就不需要明确地flush cache line了(see Section 10.4.6.2. of Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 1)。

小结

上面介绍了NVDIMM 的几种实现方式,以及为了发挥NVDIMM-P 的性能所做的硬件上的优化和支持。下面会继续介绍软件方面的支持,包括编程模型、编程库、SPDK方面的支持等。

如果想了解更多关于Linux的技术干货,请关注公众号【Linux架构师训练营】

SSD学习笔记-NOR, NAND, FTL, GC基本概念

NOR v.s. NAND

两者都是非易失存储介质。即掉电都不会丢失内容, 在写入前都需要擦除。

NOR有点像内存,支持随机访问,这使它也具有支持XIP(eXecute In Place)的特性,可以像普通ROM一样执行程序。现在几乎所有的BIOS和一些机顶盒上都是使用NOR Flash,它的大小一般在1MB到32MB之间,价格昂贵。

NAND Flash广泛应用在各种存储卡,U盘,SSD,eMMC等等大容量设备中。

NOR VS NAND - 场景

如果以镁光(Micron)自己的NAND和NOR对比的话,详细速度数据如下:

NOR VS NAND - 性能

NAND Flash

NAND Flash目前的用途更为广泛,它的颗粒根据每个存储单元内存储比特个数的不同,可以分为 SLC(Single-Level Cell)、MLC(Multi-Level Cell) 和 TLC(Triple-Level Cell) 三类。其中,在一个存储单元中,SLC 可以存储 1 个比特,MLC 可以存储 2 个比特,TLC 则可以存储 3 个比特。NAND Flash 的单个存储单元存储的比特位越多,读写性能会越差,寿命也越短,但是成本会更低。现在高端SSD会选取MLC甚至SLC,低端SSD则选取TLC。SD卡一般选取TLC。

SLC,MLC,TLC

NAND Flash的组成

一个典型的Flash芯片由Package, Die, Plane, Block和Page组成,其中die内部可以通过3D 堆叠技术扩展容量,譬如三星的V-NAND每层容量都有128Gb(16GB),通过3D堆叠技术可以实现最多24层堆叠,这意味着24层堆叠的总容量将达到384GB!

NAND Flash组成

写放大

Block是擦除操作的最小单位,Page是写入动作的最小单位,一个Block包含若干个Pages。当我们有了块干净的Flash,我们第一个想干的事就是写些东西上去,无论我们是写一个byte还是很多东西,必须以page为单位,即写一个byte上去也要写一个page。要修改一个字节,必须要擦除,擦除的最小单元是Block。

Flash Translation Layer (FTL)

NAND flash的寿命是由其擦写次数决定的(P/E数 (Program/Erase Count)来衡量的),频繁的擦除慢慢的会产生坏块。那么我们如何才能平衡整块Flash的整体擦写次数呢?这就要我们的FTL登场了。

Flash Translation Layer原理

FTL简单来说就是系统维护了一个逻辑Block地址(LBA,logical block addresses )和物理Block地址(PBA, physical block addresses)的对应关系。 有了这层映射关系,我们需要修改时就不需要改动原来的物理块,只需要标记原块为废块,同时找一个没用的新物理块对应到原来的逻辑块上就好了。

垃圾回收(GC,Garbage Collection)机制定期回收这些废块, 和Java,GO等语言的GC机制类似,应用不需要像C/C++那样关注内存释放,GC定期扫描,回收释放内存。目标是让Flash最小化擦除次数,最大化使用寿命。

相关问答

用C语言编程,求两个数m和n的最大公约数!_作业帮

[回答]//用到可辗转相除法#includeintmain(){intm,n;//定义俩个变量inttemp;//中间变量scanf("%d%d",&m,&n)...

计算机 最小 的执行 单位 ?

在计算机中最小的数据单位是bit(位)。bit是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量称为一比特,是表示信息的最小单位,只有两种状态:0...

nand flash可以同时 读写 吗?

答:不可以虽然NAND不能同时执行读写操作,它可以采用称为"映射(shadowing)"的方法,在系统级实现这一点。NAND闪存阵列分为一系列128kB的区块(block),...

bit是谁的 单位 ?

bit是英文binarydigit的缩写,中文的意思就是比特。比特是表示信息的最小单位,是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量。一般来说,n...

分配单元大小是什么意思?

分配单元大小的意思是1.分配单元大小,即是系统对磁盘以及移动存储设备进行读写的最小单位。通常默认就行,修改了可能不识别u盘。大值传输速度快一丁点但占用...

u盘内单元大小是啥?

1、分配单元大小,即是系统对磁盘以及移动存储设备进行读写的最小单位。通常默认就行,修改了可能不识别u盘。大值传输速度快一丁点但占用空间多,小值占用少传输...

U盘分配单元大小设多少?

在对u盘进行格式化时,系统都会针对文件系统格式自动调整分配单元的大小。NTFS格式分配4096字节,无需改动,但如果有特别的需要,就可以手动来设定自己需要的分...

电脑 读写 速度取决于什么? - 懂得

1.cpu的速度=内频*外频2.硬盘的接口,转速,读写的最小值~最大值3.内存条的频率,存储量以上3个条件是直接影响电脑读写速度的关键条件瓶颈由细到粗,...

u盘格式化的分配单元大小是什么?

即是系统对磁盘以及移动存储设备进行读写的最小单位。通常默认就行,修改了可能不识别u盘。大值传输速度快一丁点但占用空间多,小值占用少传输稍微慢一丁点。...

这个读法是如何参照的?读取过程中药利用 最小 公倍数,上课时...

[最佳回答]这个读法实际上就是按照原子个数比读的.对于无变价的金属,读法都是某化某,某酸某等.但是对于有变价的金属,按照价态的高低分别加上:高,亚,次等表示...

 外交公寓  f100 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部