[PConline资讯]对于上班一族来说,每天离不开的估计是电脑跟手机,而电脑当中存储文档跟数据重要介质则是硬盘,随着固态硬盘普及,估计有不少上班一族的办公电脑换上固态硬盘,固态硬盘作为大家常接触“小伙伴”,大家真的了解吗?
自从2005年开始,三星作为第一个进入固态硬盘市场的巨头。直到现在短短的15年间,固态硬盘已经成为消费级的主流储存介质。相对于传统的机械硬盘,固态硬盘的性能能达到机械硬盘的十倍甚至更多。
不管是普通的SATA固态硬盘,还是NVMe固态硬盘,对于普通消费者来说,只是介质和性能上的变化,甚至有人会简单的认为,只要使用了固态硬盘,读写速度会有非常大的提升,但这真得是这样吗?
固态硬盘构成知多少?
对于固态硬盘来说,最主要的两个部分就是硬盘颗粒和主控部分,如今的主流固态硬盘使用的基本都是NAND颗粒来存储数据。每个颗粒可以存储1bit(SLC),2bit(MLC),3bit(TLC)和4bit(QLC)数据。存储颗粒的位数越多,就代表密度越高,制造成本更低。但相对而言,颗粒的使用寿命也会更低。硬盘的擦写次数就更少。
而固态硬盘读取和写入的最小单元并不是颗粒而是由一组颗粒组成的页(Page)。典型的页的大小是4KB。固态硬盘有一个重要特性,是颗粒一旦被写入,就无法类似于机械硬盘一样直接覆盖写入,所以为了能反复使用,固态硬盘就需要对已经写入过的颗粒进行发出操作。而擦除的最小单元既不是颗粒也不是页,而是由若干个页组成的块(块)。块的典型大小是512KB或者1MB,也就是128Page。所以固态硬盘的优化手段,都跟这些基本的特性有着密切的关系。
硬盘中数据操作和垃圾回收(GC)到底是什么?
任何硬盘数据操作包括读和写,其中读延时相对稳定,而写延时会发生一些变化,具体情况取决于磁盘的使用情况。正常情况下都是几十微秒。与传统的机械硬盘相比,固态硬多了一个擦除的操作。固态硬盘中的垃圾回收就是用于回收那些已经使用过的,但是数据不再有效的那些块。硬盘的主控中会设置一个可用块数量的阈值,当可用块低于这个阈值的时候就会启动垃圾回收。
损耗均衡(WearLeveling)和写放大(WriteAmplification)。固态硬盘block可执行有限次数的擦除操作,也称之为编程/擦写(P/E)周期,当写入非常频繁时,擦除操作发生得更频繁。一旦达到P/E最大数量,这个block就不再能写入了。
对于SLC,可擦除次数通常是10万次,MLC通常是1万多次,而对于TLC块,则是几千。为了确保容量可用和写延时性能,固态硬盘控制器需要平衡各个block的擦除次数,这是固态硬盘控制器的核心工作之一,也称为“损耗均衡”机制。
在损耗均衡期间,数据会在各个block之间移动,然后进行擦除。由于擦除的是不再有效的数据,而移动的是有效数据,因此固态硬盘中有效数据通常会大于实际写入的数据,这称之为写放大WA(WriteAmplification)。
以上这些操作基本上都是通过主控芯片来实现,主控芯片绝对不是很多人想象的找个颗粒把数据写入,需要的时候再读取那么简单。读写寻址、数据块的擦除、写放大的控制、损耗如何均衡等等,这些都是通过主控芯片实现的,这背后的具体原理都是通过很多逻辑电路实现的,具体原理就不做过多解释了。
固态硬盘对比机械硬盘有何差异?
固态硬盘这种存储介质和传统的机械硬盘有着典型差异,存储系统也要针对固态硬盘有针对性的优化,这些优化效果体现在很多仿麦呢,包括性能的提上、硬盘使用效率的提升、硬盘使用寿命的延长等方面都是通过主控实现的。
在机械硬盘时代,机械硬盘的延时在毫秒级别,几乎可以抹杀掉网络延时带来的影响,所以只要保证网络协议、网络交互的优化,应用程序大可以访问远端的机械硬盘,但是固态硬盘的延时已经到了微秒级别,除非使用极低延时的高性能网络,否则访问远端的固态硬盘数据的延时会明显收到影响。
对于分布式存储而言,必须一方面在数据分散放置的同时,尽可能地利用本地固态硬盘的能力,即在数据放置策略上做权衡。在这方面,我们结合元数据放置算法和策略,对YRCloudFile分布式文件系统的元数据采用了一部分的本地化固态硬盘访问,还将推出智能缓存技术,这将大量热数据缓存在指定的固态硬盘本地设备中,进一步降低访问延时。
控制硬盘存储使用量。再垃圾回收期间,需要擦除擦除存储块后创建空闲的存储块。擦除block需要保留在block内保存着有效数据的page,才能获得空闲block。创建一个空闲block可能需要压缩和挪动多个block内的page,具体数量取决于block的存储度。
假设固态硬盘容量已使用A%,为了擦除一个block,需要挪动和压缩1/1-A个block。显然,固态硬盘的使用率越高,将需要移动更多的block以释放一个block,这将占用更多资源并导致更长的IO等待时间。例如,如果A=50%,则仅压缩2个block以释放一个block。如果A=80%,则大约移动5个block数据以释放一个block。如果考虑上block的page,需要操作的数据则更加惊人,假设每个块都有P个page,并且所有page都包含有效数据,则每次GarbagedCollected都需要复制PA/1-A个page。如果每个block包含128个page,当A=50%时,每个blcok都需要复制128个page,而当A=80%时,则为512个page,当A=95%时,则达到2432page。
使用多线程进行小I/O访问。因为固态硬盘具有多个级别的内部并行处理机制。单个I/O线程是无法充分利用这些并行特性额,使用单个线程进行I/O访问,会导致整体访问时间延时更长。而使用多个线程并发访问,则可以利用固态硬盘内部这些并发特性。
固态硬盘上对本机命令队列的支持可以有效地再多个channel之间分配读写操作,从而提高内部I/O并发性。所以上层应用活存储系统尽可能并发访问小I/O是能提升读写性能的。如果针对单个应用很难进行多线程并发,则可以考虑多个应用对数据的并发访问,从而充分利用硬盘的并发特性。
总结
据悉,固态硬盘已经被存储系统大量使用通常采用固态硬盘的存储系统会比使用机械硬盘的存储系统具有更好的性能。但是在不经过针对性优化时,单纯地将固态硬盘视为一个普通的存储设备使用,不能充分发挥出固态硬盘,尤其是NVMe的极致性能。这是因为固态硬盘的工作原理与普通的机械硬盘有较大的差异,访问特性上也不同。为了充分利用固态硬盘带来的性能优势,现代的存储系统,尤其是分布式存储系统都需要对固态硬盘做针对性的优化。