科技进步的背后有一条真理:发明者和工程师们首先理解并实现新技术的基础原理,接着才去考虑如何在性能和成本上做进一步优化。这个原则在 SSD 固态存储领域同样适用,也就是人们常说的从实验室到量产阶段。
接下来,我们将介绍一项近年来固态硬盘技术的重要进展——主机内存缓冲区 (Host Memory Buffer,HMB),它利用主机内存来提升存储设备性能,推动了固态硬盘技术的进一步发展。
SSD 缓存设计的权衡因素
在固态硬盘 (SSD) 设计中,增加 NAND Flash 存储单元(闪存颗粒)可以提升容量和性能。然而,正如所有产品设计一样,工程师需要在资源和成本之间找到平衡。
目前,有两种主要方式可以提升存储单元的现有性能:一是提升 NAND Flash 密度,二是增加额外的闪存颗粒,但这会占用更多物理空间。由于硬盘的 PCB 空间都有限,增加闪存颗粒通常意味着就要减少其他元件。
有缓方案(DRAM)
DRAM 代表动态随机存取存储器,该闪存模块安装在固态硬盘的印刷电路板 (PCB) 上,用于存储数据映射表,这些表记录了所有的逻辑块及其物理位置。简单来说,DRAM 让固态硬盘能够更快处理随机数据请求,还用于缓存写入数据,提高写入性能。但 DRAM 会显著提高 SSD 的成本,它的成本可能是普通 NAND Flash 的数倍。
无缓方案(没有 DRAM)
为了降低成本,目前,许多厂商选择移除快速但昂贵的 DRAM,也就是人们常说的「无缓方案」。然而,DRAM 是一种高速的易失性存储器,并不能被轻易取消。没有 DRAM 的设计在数据传输,尤其是处理高容量随机读取时,会面临性能下降和信号完整性的挑战。DRAM 的存在能让数据访问更快,缺少它可能会显著影响硬盘的整体性能。
什么是 HMB 主机内存缓冲区
那么,工程师要如何解决无缓 SSD 的性能问题呢?简单来说,就是使用 HMB(主机内存缓冲区)技术。HMB 允许 SSD 利用主机的内存资源,主动提升性能。
为 SSD 分配主机内存
NVMe 1.2 规范首次引入了 HMB 功能,规定了 HMB 如何将主机内存分配给 SSD 使用:
- NVMe (NVM Express) 是一个开放标准,用于定义如何访问非易失性存储设备,如 NAND Flash。
- NVMe 1.2 规范规定了 HMB 如何将主机内存分配给 SSD 使用。经过适当配置的 SSD 可以与主机通信,申请指定的最小缓冲区 (Buffer) 大小。
- NVMe 1.2 还设置了各种条件和限制,以确保在 SSD 意外断开连接时,数据不会丢失或损坏。
- 要使用 HMB,还需要 SSD 和操作系统都必须同时支持。比如,从 2017 年发布的 Windows 10 1703 版本开始,Windows 系统就已经支持 HMB 技术;Linux 内核从 4.14 版本开始也全面支持HMB。
HMB 通常用于存储 FTL(Flash Translation Layer)映射表,而不是直接存储用户数据。
为什么选择 HMB?从有缓到无缓 SSD
早期的 SSD 设计中,同时使用了非易失性闪存和易失性 RAM 来提高数据处理效率。具体来说,DRAM 设备被用作缓冲区,主要有两个原因:
- DRAM 是易失性的,断电后数据会丢失,因此不适合长期数据存储。
- RAM 设备的读写速度比闪存设备更快。这个特性让 RAM 能够作为「中继站」,在数据传输时提供临时存储,为持续处理任务的 NAND Flash 提供缓解。
缓存中最关键的信息是逻辑地址到物理存储位置的映射,即 L2P(逻辑到物理)表。该表会随着 SSD 的读写频繁更新:
- 关机时,L2P 表会存储在 NAND Flash 中,防止在断电时丢失。
- 开机后,这些表会被加载到 DRAM 中,由控制器继续实时更新。
DRAM 缓存空间越大,通常意味着更灵活的数据管理和更快的响应速度,特别是在处理「随机读取」任务时。
SSD 有 DRAM 缓存运行机制
然而,DRAM 是一种按密度计算的昂贵资源,价格通常是 NAND Flash 的数倍左右,而且短期内也不会改变。因此,尽管 DRAM 具备显著优势,但过去十来年,无 DRAM 的 SSD 也逐渐开始流行。这些 SSD 体积小、成本低,但因缓存空间受限,对 SSD 性能也会有所影响。
无缓 SSD 也将 L2P 表保存在 NAND Flash 中,当控制器需要访问 L2P 表时,会将表加载到控制器的内部 SRAM 中进行更新,然后再次存储在 NAND Flash 中。
无 DRAM 和无 HMB 的 SSD 缓存操作机制
然而,SRAM 的成本更高,容量也较小,典型的 Flash 控制器也只有几兆字节的 SRAM,因此无缓 SSD 的性能通常不如有缓设计。
无 DRAM 和有 HMB 的 SSD 缓存操作机制
这也正是 HMB 技术诞生的根本原因。HMB 允许 SSD 将 L2P 表从 NAND Flash 加载到主机内存中,并通过主机不断刷新缓存,这种「神操作」跟 DRAM 的方法十分相似。
启用了 HMB 的 SSD 在处理随机工作负载时,性能损失并不明显。接下来,我们将展示一些实际测试数据,看看 HMB 对 SSD 性能的影响。
有无 HMB 性能提升对比
在启用 HMB 后,SSD 在「随机读取」操作时的性能会得到显著提升。然而,HMB 的性能提升也会因为工作负载的不同而有所变化。这是因为:主机不总能提供足够的内存空间给 NAND Flash 控制器来使用。
「随机读取」指的是控制器根据主机请求,从 NAND Flash 中不规则的位置提取特定大小的数据。
以下图表展示了在不同工作负载下,使用 HMB 后,数据处理从 1 GB 到 32 GB 时的性能非线性提升:
1GB 数据随机读取
8GB 数据随机读取
32GB 数据随机读取
- 出现这种非线性是由于 HMB 的缓存容量有限,在处理 L2P 表和大量中间数据时,性能提升会逐渐减缓。
- 比如,在处理 32 GB 数据时,IOPS 的增幅相比 8 GB 数据并不太明显,这突显了 HMB 的性能提升存在一定的上限。
- 即便如此,在处理 32 GB 数据时,HMB 仍能带来超过 100000 IOPS 的额外提升,这个提升非常显著。要知道,即使是通过精细的固件优化,也很难实现如此大幅度的性能增长。
IOPS(每秒输入/输出操作)是衡量存储设备性能的关键指标,直接反映了设备处理数据请求的速度。
如何在 Windows 中使用 HMB
如前所述,要使用 HMB 功能,需要你使用的 SSD 和操作系统同时支持。通常情况下:
- 在 SSD 的固件中,通常会预设 HMB 的最小和最大内存占用值。
- 在 Windows 10 1703 及更高版本 Windows 系统中,默认支持 HMB 缓存功能。
如果你安装了 SSD 厂商的官方硬盘驱动或管理程序,通常可以看到是否支持并启用 HMB 功能,这个需要你自己去探索使用;如果你没有安装 SSD 厂商的应用,Windows 会使用系统自带的 StorNVMe 存储控制器驱动程序,该驱动的 HMB 容量上限默认为 64MB。
你可以通过更改注册表,来调整 HMB 容量:
1、使用Windows + R
快捷键打开「运行」对话框,执行regedit
打开注册表编辑器。
2、导航到以下路径:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlStorPort
3、新建一个名为HmbAllocationPolicy
的 DWORD (32 位) 值 ,并将其值设置为:
0
:禁用 HMB 功能。1
:启用 HMB,并尝试分配 SSD 固件允许的最小值。2
:启用 HMB,并尝试分配 SSD 固件的首选值。3
:基于设备使用情况,由 SSD 固件控制缓冲区大小。
设置 HmbAllocationPolicy 注册表值