在半年以前,很多NVMe固态硬盘用户都记得一条安装完系统之后必做的优化:打开设备管理器,在NVMe固态硬盘中勾选“关闭设备上的Windows写入高速缓存缓冲区刷新”。这句话特别拗口,缓存(Cache)是什么?缓冲(Buffer)又是什么?
除了上图中的疑惑,平时我们谈到固态硬盘的SLC缓存以及DRAM缓存,也有很多读者朋友疑惑不解。严格来说,有很多应该叫缓冲的地方被误称为缓存。这些概念的混淆就在今天解开吧!
什么是缓存?
缓存是为了弥补不同硬件设备之间的速度鸿沟而引入的中间层,它的目的主要是为了加快访问速度。比如CPU-Z软件中我们查看CPU有几层缓存,每一层缓存的容量有多大。一级缓存最小,但它的速度最快,三级缓存最大,但速度偏慢。在CPU缓存之下就是主内存DRAM了,速度比三级缓存更慢。
大家知道,无论是机械硬盘还是固态硬盘,它的速度跟DRAM内存相比又要慢出很多。所以Windows操作系统自带了一套缓存体系,将剩余内存空间用于缓存从硬盘读写的数据。。
在任务管理器-性能-内存中可以看到。已缓存的内容包含了预读的数据,也包括刚刚用过,未来有可能重复用到的数据。正是因为Windows已经自带了内存缓存体系,所以有些固态硬盘厂商推出的“内存加速程序”,譬如RAP*D Mode、Pl*xTurbo、Moment*m Cache,其实都是糊弄小白的障眼法,重复性的缓存并不能起到真正的提速效果。
为了解决内存和硬盘之间的速度差,所有硬盘都搭载了写入缓存,它是集成在硬盘上的一小块内存区域,用于在接收写入数据,硬盘可以直接回报写入完成,然后稍后完成数据实际写入到存储媒介(机械硬盘的盘片或固态硬盘的闪存单元)的过程。
在TLC固态硬盘内部,还存在一套应对SATA接口与闪存间速度差异的缓存——SLC Cahce。根据型号的不同,固态硬盘的SLC Cache容量不尽相同,但作用都是一样的:提升固态硬盘的爆发写入速度。东芝TR200 240G的SLC缓存容量约有3.5GB。
什么是缓冲?
现实中“缓冲”的出现频率要比“缓存”低很多。在设备管理器的网卡设置当中,可以看到接收缓冲与发送缓冲。缓冲的作用是平衡速度、流量整形,将大量零碎存取请求整合成平稳连续、较大规模的一次存取操作,从而提高处理效率。
接下来我们回归正题,硬盘上的缓存和缓冲到底是什么?
机械硬盘时代,由于盘片读取效能太差,需要有DRAM来承担缓存的作用,利用Read ahead将程序请求读取范围之外的一点点数据提前加载到DRAM芯片当中,希望靠“蒙对下一次读取请求”的方式来提高性能。所以机械硬盘时代更大的缓冲容量有机会带来更高的性能。
东芝在1987年发明了NAND闪存,并在多年之后带来了固态硬盘的问世。由于闪存的读取速度非常快,Read ahead已经不能提供收益,所以固态硬盘的DRAM芯片中存储的并不是预读的数据,而是用于管理闪存逻辑-物理地址映射表的元数据。此时DRAM芯片的容量已经不再跟性能直接挂勾。
下图是东芝TR200固态硬盘拆解图。TR200是东芝推出的DRAM less方案3D闪存固态硬盘,也就是说TR200是没有DRAM芯片的。它的闪存映射表结构经过了优化,能够直接存储在闪存以及主控内集成的小容量SRAM当中。
尽管没有DRAM芯片,但是TR200的Toshiba TC58NC1010GSB主控依然具备SRAM来完成缓冲的作用。发送到TR200的随机写入请求会在SRAM当中进行整合排队,比如将几个字节的写入合并成至少一个闪存Page页大小(通常为16KB)的数据,然后写入到闪存当中。由于有闪存映射表的存在,对于电脑主机而言,这些写在一处(互相临近位置)的数据在LBA逻辑地址上有可能还是天各一方的随机分散状态。
总结来说,固态硬盘当中既有缓存(SLC Cache)机制,也有缓冲(Buffer)机制,前者主要是为了提升爆发写入速度,后者则是为了降低随机写入的闪存写入放大率,提升随机写入的处理效率和响应速度,二者相辅相成,共同提升了固态硬盘的性能表现。