前言:
存储设备传统的有机械硬盘,新型的有各种闪存:U盘、CF卡、SM卡、SD/MMC卡、记忆棒、XD卡、MS卡、TF卡、PCIe闪存卡,还有ssd固态硬盘。由于物理结构上的差异,它们在可靠性上的差异都非常大。
(一)机械硬盘:
相比与闪存,机械硬盘在机械结构上要复杂很多,也正是因为它复杂的机械结构,导致它在性能和可靠性上有很大的缺陷。磁盘的物理结构可以查看博客《硬盘内部硬件结构和工作原理详解》
(1)磁盘损坏分类:
其实,硬盘的损坏可以大致分为两大类,一类是硬损坏,一类是软损坏。硬损坏主要是磁头组件损坏、控制电路损坏、综合性损坏和扇区物理性损坏四种。
磁头组件损坏:其主要指硬盘中磁头组件的某部分被损坏掉了,从而造成部分或者全部磁头无法正常读写的情况。磁头组件损坏的原因也有很多,主要还是磁头变脏、磨损、悬臂变形、磁线圈受损、移位等。
控制电路损坏:主要是指硬盘的电子线路板上,某一部分的线路断路或者短路,以及某些电气元件或者IC芯片损坏,从而导致了硬盘通电之后盘片不能正常起转以及起转之后磁头不能正确寻道。
综合性损坏:这一部分主要是一些微小的变化导致硬盘产生了种种的问题,比如在使用过程中因为发热导致部分芯片老化,或者是在受到震动后使得外壳或者盘面、马达主轴产生了微小的变化及位移,也有一些是硬盘本身就在设计上面有散热、摩擦、结构上的缺陷。这些种种原因导致了硬盘的不稳定,从而使得数据经常莫名其妙的丢失或者出现逻辑错误,不仅让电脑噪音变大,读写也开始变得缓慢。
扇区物理性损坏:扇区物理性损坏也被大家称为物理坏道。顾名思义,主要是因为碰撞、磁头摩擦等其他原因导致磁盘盘面出现物理性损坏,出现划伤、掉磁等现象。
软损坏则包括:磁道伺服信息出错、系统信息区出错以及扇区逻辑错误。
磁道伺服信息出错:因为某一个物理磁道的伺服信息受损或者失效导致物理磁道无法被访问。
系统信息区出错:硬盘的系统信息区在通电自检时读不出某些模块的信息或者校验不正常,从而导致硬盘无法进入准备状态。
扇区逻辑错误:因为校验错误(ECC错误和CRC错误)、扇区标志错误(IDNF错误)、地址信息错误(AMNF错误)、坏块标记错误(BBM)等原因导致此扇区失效。
(2)导致损坏的因数:
影响机械硬盘使用寿命主要有下面几个因数:
- 工作时间: 时间越长,概率越高
- 震动,和撞击:超标的振动会影响磁头定位,导致硬盘性能下降乃至寿命降低。
- 供电电源稳定性:电源不稳定容易导致电子元器件性能下降甚至损坏
- 频繁的读写操作,磁头的老化与它读写数据量的相关性很强
- 环境因数:温度,湿度,电磁干扰
- 非常规操作:突然断电,频繁分区格式化
- 硬盘文件的碎片和零碎文件的多少
(3)磁盘碎片:
在计算领域,文件系统碎片(英語:File system fragmentation,或称磁盘碎片、文件系统老化)是文件系统将文件内容非连续排列以允许就地修改其内容的后果,亦是碎片化的一个特例。磁盘碎片会增加磁盘磁头移动的频率,即增加了寻道时间,这会降低磁盘读写性能,进而影响操作系统及软件的性能。另外,文件系统不能承受无限制的碎片。对现有碎片的更正称为碎片整理,是将文件和可用空间重新组织为连续区域的过程。
现代计算机中的固态硬盘(SSD)不是真正的磁盘,也不是“旋转的”,所以没有磁盘碎片的问题。事实上,对这些驱动器进行碎片整理反而会缩短它们的使用寿命。同理flash也不存在磁盘碎片这个概念。
(4) 磁盘碎片化原理
磁盘主要由盘片,能够转动盘片的驱动马达,机械臂以及机械臂上的读取头组成,在读取数据时,马达会驱动盘片来让读取头在盘片上读取。盘片是主要记录数据的地方,扇区(sector)是硬盘的盘片上最小的物理存储单位,一般为 512 B;而块(block)是文件系统(FAT、NTFS、Ext2,Ext3 )中最小的操作单位,由一个或多个 sector 组成,类似于 FAT 文件系统中簇的概念,读写文件时是按照文件系统中定义的 block 的大小来进行的。一般最小的 block 为 4 KB,大文件读写时有 128 KB、256 KB。以 FAT 文件系统(Windows 98 以前的操作系统以及 U 盘常用的文件系统)为例,文件数据一般会存放在连续的block中,比较大的文件会占用多个block。但是当对同一文件进行频繁更新(删除、移动、新增等)时,文件体积发现变化后,文件系统会尝试放在原始文件开始的 block 紧邻的位置中,但是由于紧邻的 block 已经没有空间可放,此时会跳到其他 block 中存放。通常,一个文件占用的多个 block 都是不连续的,操作过于频繁时会使同一文件的block太过分散。
在FAT文件系统中,每一文件的 block 号码都是记录在前一个 block 当中,读取方式类似上图所示。上图中我们假设文件的数据依序写入 1->7->4->15 号这四个 block 号码中, 但这个文件系统没有办法一口气就知道四个 block 的号码,他得要一个一个的将 block 读出后,才会知道下一个 block 在何处。 如果同一个文件数据写入的 block 分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有的数据, 因此磁盘就会多转好几圈才能完整的读取到这个文件的内容!——引自《鸟哥的LINUX私房菜》磁盘碎片整理的目的就是将文件太过分散的 block 存到在磁盘开始的地方,使它们连续分布,进而弥补磁盘上形成的大量的空洞,提高文件读写时的速度。而 NTFS 文件系统后来进行了优化,会在文件周围分配一些“缓冲”的空间,在使用时间长后仍然需要进行碎片整理,而 Linux 中的 Ext 文件系统则是采用索引式式文件系统,有 inode 来记录文件所在的 block 号码,能够将文件的所有 block 一口气读出来,所以 Linux 系统一般不太需要碎片整理。
(5)磁盘可靠性
可靠性前提条件和NL硬盘的由来再来看看可靠性。当年的高转速企业级硬盘的MTBF(平均无故障时间)为120万小时左右,现在由于工艺进一步成熟,设计/制造标准普遍已达到200万小时。而桌面硬盘还停留在70万小时左右,没有动力也不需要为此而增加成本。
这里容易被忽视的还有MTBF的先决条件。高转速企业级硬盘是在45℃的环境温度下,7x24小时100%工作负载;而桌面硬盘则是25℃环境,5x8小时10-20%工作负载。
一方面SSD只是擦写次数有限而不限制读,硬盘则不分读写都要考虑;另一方面,SSD寿命源自每个闪存单元的特点,在其它条件同等情况下其可写入数据量与容量成正比;而硬盘却不是容量越大这方面就越好,因为磁头的老化与它读写数据量的相关性更强。
当然,10K/15K高转速硬盘在质保期内没有这些限制。
(6)文件预分配方案
从上面可以知道,在机械硬盘中中存在磁盘碎片导致性能下降的问题,对于有些录像设备而言,他们进行7*24小时的工作,磁盘空间满了之后,会将旧的文件进行删除操作,然后再新建新的文件继续写入文件。这样重复的操作就会不断的增加磁盘的碎片化,从而导致磁盘性能下降。
为解决这一问题,针对这一种场景,可以在磁盘分区格式化之后,将所有空间预创建好所有的文件,之后只往已经创建好的文件中写入数据,在另外的一个文件(索引文件)中记录写入数据的位置。但磁盘写满之后,不进行文件删除的操作,而是对原来问价中的数据直接进行覆盖。通过这种方式可以解决磁盘碎片化影响性能的问题。
需要特别注意:磁盘碎片化只在机械硬盘中存在,所以文件预分配方案也只是在机械硬盘中能够起到作用。
(二)闪存设备
常见的闪存设备有:U盘、CF卡、SM卡、SD/MMC卡、记忆棒、XD卡、MS卡、TF卡、PCIe闪存卡,还有ssd固态硬盘。这里只介绍SD卡。
(1)SD卡的构成
结构简图如下:
它包括自己的控制器,内存(有可能是控制器自带),和NAND Flash.
再看其中一款SD卡的内部架构图
它这里的处理器是ARM。尤其是在大多数Class10的SD卡上,ARM和DMA协调工作,才能保证传输速度。具体举个例子,Samsung的SD卡大多采用ARM7TDMI,它是基于ARMv4T架构的,T代表Thumb指令集,D是说支持JTAG调试(Debugging),M意指快速乘法器,I则对应一个嵌入式ICEBreaker模块。
从上图可以看出:SD卡虽小,五脏俱全。ARM控制器加上固件,它包括了冯诺依曼所有的元素,它实现了FTL层,从而实现了负载均衡。尽管SD卡的标准并没有明确要求实现负载均衡,但没有负载均衡的FTL层,某些特殊设计的写操作,在几分钟之内就可以写坏SD卡,这是不可以接受的。所以,几乎所有SD卡都实现了FTL层。
(2)磨损均衡
耗损平均技术(英语:Wear Leveling)是快闪记忆体(NAND flash)上的一种抹平技术。快闪记忆体的区块有抺写次数的限制,针对同一个单一区块,进行重複抺除、写入,将会造成读取速度变慢,甚至损坏而无法使用。耗损平均技术目的在于平均使用快闪记忆体中的每个储存区块,以避免某些“特定”储存区块因过度使用而形成坏区块。
磨损均衡算法通过将写入分配到闪存介质上的多个扇区,控制闪存介质扇区的不均匀“磨损”。磨损均衡算法集成在闪存盘控制器的韧体内,通过建立闪存介质的逻辑扇区和物理扇区之间的文件分区表,使文件系统一目了然。原则上,磨损均衡算法能使闪存介质上的所有扇区几乎同时达到其耐久限制,从而延长闪存介质的使用寿命。通过使用老化机制,可警告用户何时达到耐久限制,从而提前进行内容备份,防止数据丢失。
耗损平均技术的性能及寿命依赖演算法及控制器的优劣,性能常会在经常多次写入及剩馀容量很少时下降,有时可以藉由牺牲寿命来增加性能、或以掉速为代价来确保可靠度。
具体而言,它又分为:动态磨损均衡和静态磨损均衡,这里不再介绍,
(3)FTL(Flash Translation Layer)
几乎所有的应用NAND Flash的设备都必须配备FTL,包括我们经常碰到的SD, eMMC, UFS, SSD等等。
通常FTL由这些设备的固件提供实现。
FTL简单来说就是系统维护了一个逻辑Block地址(LBA,logical block addresses )和物理Block地址(PBA, physical block addresses)的对应关系,有了这层映射关系,我们需要修改时就不需要改动原来的物理块,只需要标记原块为废块,同时找一个没用的新物理块对应到原来的逻辑块上就好了。
flash固件也就是通过FTL层实现磨损均衡的一个技术
(4)结论
现在基本上所有的SD卡或是其它的闪存固件,都有带FTL层,也就是说不再需要用户自己去做磨损均衡的工作,也就不存在SD卡读写热点区域这个概念。在使用闪存固件的时候,需要考虑的是闪存的擦写次数,一般说的10万次这个说法并不准确。对于带有磨损均衡的存储设备,以SD卡为例,它的擦写次数一般是全部容量空间擦写500次左右。比如一个1G的SD卡,一般它的寿命是循环读写500G数据量的寿命。当然这个也跟SD卡的质量有非常大的关系。
(三)非拔插闪存(裸flash)
在开发板中,我们一般都是直接使用裸的flash,常见的nor flash 和nand flash 都是直接与设备一起连接的。那么,对于这类flash的使用,是由谁来做这个磨损平衡的工作能?还是它就直接不使用磨损平衡功能。
对于裸flash而言,除了FTL层可以对flash进行抽象之外,还可以使用特定的闪存文件系统来实现磨损平衡的工作。
闪存文件系统与FTL比较
上层应用需要借助于闪存文件系统或者 FTL 机制,来完成对闪存芯片的直接管理和控制。闪存存储管理的主要目的就是为上层应用提供硬件抽象,主要包括两种方式,即闪存文件系统和闪存转换层(FTL: Flash Translation Layer)。
闪存文件系统是直接针对闪存设计的文件系统,比如 JFFS2(Journalling Flash File System Version 2)和 YAFFS,闪存转换层则是通过一个中间层来隐藏闪存的底层硬件细节,把闪存设备模拟成一个块设备,上层应用可以和访问磁盘一样的方式来访问闪存设备。
- 闪存文件系统只能针对特殊厂商的闪存设备,无法广泛应用关于各种不同类型的闪存设备,通用性不强;
- 闪存转换层可以将现有的各种常用的磁盘管理技术移植到闪存设备上,可以把各个不同厂商的闪存产品模拟成类似磁盘的块设备,具有广泛的应用范围。
闪存文件系统比 FTL 具有更高的性能,一般用于固定的、非插拔的 NAND 闪存管理。
Reference
【科普】解密SD卡的种类、规格、速度、容量和寿命,附SD卡选购指南
《microSD卡会写坏吗?它里面有固件吗?它是如何构成的?》
这些硬盘参数你都懂吗?(下)-监控选型与系统设计
生活不易,转载请注明出处:https://caibiao-lee.blog.csdn.net/article/details/105272274