ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

HMB技术解析:无DRAM固态硬盘的性能优化与架构权衡

HMB技术解析:无DRAM固态硬盘的性能优化与架构权衡 1. 从一块无缓盘说起HMB到底在解决什么问题如果你拆过几块入门级NVMe固态硬盘会发现一个很有意思的现象PCB正面只有一颗主控和一两颗NAND闪存颗粒DRAM焊盘的位置空空如也。这就是典型的DRAM-less方案成本压得很低但性能尤其是随机读写和持续写入的稳定性往往和带DRAM的盘有明显差距。问题的根源在于FTLFlash Translation Layer闪存转换层需要一张映射表。这张表记录了逻辑地址LBA到物理地址PBA的对应关系主控每次读写都要查这张表。表有多大以一块1TB、4KB映射粒度的SSD为例映射条目数量是1TB除以4KB等于2.68亿条。每条映射记录假设占4字节整张表就是大约1GB。这个量级的表片内SRAM根本放不下所以带DRAM的盘会外挂一颗DDR4或LPDDR4来做映射表缓存。DRAM-less的盘没有这颗外挂内存只能把映射表放在NAND里需要的时候再读进来。NAND的随机读延迟在几十微秒级别而DRAM是纳秒级别差了三个数量级。每次读写都要去NAND里翻表性能自然上不去。HMBHost Memory Buffer主机内存缓冲就是在这个背景下出现的。它的思路很直接既然SSD上没有DRAM那就借主机的一部分内存来用。通过NVMe协议主控可以向主机申请一块物理地址连续的内存区域把映射表放在里面。主机内存的访问延迟虽然比SSD本地DRAM高一些但比NAND快太多了而且不需要SSD额外增加BOM成本。这个方案听起来很美好但实际可行吗我在几个项目里用过HMB方案也对比过带DRAM的盘下面把架构权衡、实际表现和踩过的坑逐一拆开讲。2. HMB的协议机制主控怎么借到主机内存2.1 从Identify Controller到Set Features的完整流程HMB不是主控想用就能用的它需要经过一套标准的NVMe协议交互。整个流程大致分三步第一步主机在枚举NVMe设备时读取Identify Controller数据结构。这个结构里有两个字段和HMB相关HMMINDSHost Memory Buffer Minimum Descriptor Entry Size和HMMAXDHost Memory Buffer Maximum Descriptor Entries。前者告诉主机每个描述符条目最小多少字节后者告诉主机最多支持多少个描述符条目。主控通过这两个字段向主机报备自己需要什么样的内存描述符格式。第二步主机根据主控的报备分配一块物理地址连续的内存区域然后通过Set Features命令Feature Identifier 0x0D即Host Memory Buffer把这块内存的描述符列表下发给主控。描述符列表里包含每个内存段的起始地址和长度。注意这里下发的是物理地址不是虚拟地址因为主控直接通过PCIe总线访问主机内存不经过主机的MMU。第三步主控收到描述符后通过Get Features命令同样是Feature Identifier 0x0D回读确认告诉主机自己实际使用了多少内存。这个回读机制很重要因为主机分配的内存可能比主控实际需要的多主控要明确告知实际用量避免浪费。注意HMB内存的分配和释放完全由主机驱动控制。如果主机驱动不支持HMB或者操作系统没有足够的内存可以分配主控就只能退回到无HMB的模式把映射表放在NAND里。所以HMB的可用性不是主控单方面能决定的。2.2 描述符条目的格式与对齐要求HMB描述符条目的格式在NVMe规范里有明确定义。每个条目包含两个字段一个64位的物理地址Physical Address和一个32位的长度Length。长度字段的单位是16字节也就是说如果长度字段填的是0x100实际表示的内存段长度是0x100乘以16等于4096字节。对齐方面物理地址需要按16字节对齐这是最低要求。但在实际项目中我建议按4KB对齐原因后面会讲。描述符条目的数量由主控的HMMAXD字段决定常见的主控支持1到8个条目。条目越多主机分配内存的灵活性越高但主控内部的管理逻辑也越复杂。这里有一个容易忽略的细节HMB内存的总大小不是随便定的。主控会在Identify Controller里通过HMMINDS字段暗示自己需要的最小描述符条目大小但实际需要多少内存取决于映射表的规模和主控的缓存策略。以1TB容量、4KB映射粒度为例如果主控想把整张映射表都放在HMB里需要大约1GB内存。但实际项目中主控通常只会把一部分热点映射表放在HMB里比如256MB或512MB剩下的仍然放在NAND里按需读取。2.3 主机侧驱动的实现差异HMB在主机侧的实现不同操作系统和驱动栈的差异很大。在Linux下NVMe驱动对HMB的支持相对成熟内核从4.x版本开始就有相关代码。驱动会在设备初始化时检查主控的HMB能力如果支持就尝试分配内存并下发描述符。分配的内存来自内核的DMA区域需要保证物理地址连续所以通常用dma_alloc_coherent之类的接口。Windows下的情况复杂一些。微软的stornvme驱动对HMB的支持从Windows 10某个版本开始引入但不同版本的行为不一致。有些版本会主动分配HMB内存有些版本则比较保守分配的量很少。这也是为什么同一块HMB盘在不同Windows版本上性能表现可能不一样。还有一个实际问题是内存压力。如果主机本身内存紧张驱动可能无法分配足够的HMB内存或者分配后又被回收。这种情况下主控会收到HMB内存变更的通知需要动态调整映射表的存放策略。这个动态调整的过程如果处理不好会导致性能抖动。3. 性能实测HMB盘和带DRAM盘的差距到底有多大3.1 测试平台与测试方法说明为了给出有参考价值的对比数据我用了一套相对可控的测试平台。主机配置为Intel i7-12700、32GB DDR4-3200内存、Z690主板PCIe 4.0 x4接口。对比的三块盘分别是A盘带DRAM的PCIe 4.0 NVMe SSD1TB外挂1GB LPDDR4B盘支持HMB的PCIe 4.0 NVMe SSD1TB主控申请256MB HMBC盘不支持HMB的DRAM-less PCIe 4.0 NVMe SSD1TB测试项目包括CrystalDiskMark的连续读写和4K随机读写、PCMark 10的存储基准测试、以及持续写入200GB后的速度衰减曲线。每项测试跑三次取平均值测试前对盘做安全擦除确保处于稳定态。3.2 连续读写与随机读写的差异先看CrystalDiskMark的数据测试项目A盘带DRAMB盘HMB 256MBC盘无HMB连续读Q8T17100 MB/s7050 MB/s7000 MB/s连续写Q8T16800 MB/s6500 MB/s6200 MB/s4K随机读Q32T1980K IOPS850K IOPS420K IOPS4K随机写Q32T1900K IOPS780K IOPS380K IOPS连续读写方面三块盘的差距不大因为连续读写主要受NAND接口速度和PCIe带宽限制映射表查询的延迟被流水线掩盖了。但4K随机读写的差距非常明显B盘比C盘高了将近一倍但和A盘仍有15%左右的差距。这个差距的来源就是映射表查询延迟。A盘的映射表全在本地DRAM里查询延迟最低。B盘的映射表在主机内存里通过PCIe总线访问延迟比本地DRAM高。C盘没有HMB映射表在NAND里延迟最高。3.3 持续写入后的性能衰减对比持续写入测试更能说明问题。我用Iometer向每块盘连续写入200GB数据记录写入速度的变化A盘前100GB维持在6000 MB/s以上100GB后降到3500 MB/s左右因为SLC缓存用完了但映射表更新仍然在DRAM里完成速度下降主要来自NAND本身。B盘前80GB维持在5800 MB/s左右80GB后降到2800 MB/s降幅比A盘大。原因是SLC缓存用完后映射表更新频率增加HMB的访问延迟开始成为瓶颈。C盘前50GB维持在5500 MB/s50GB后直接掉到800 MB/s降幅最剧烈。因为映射表更新需要频繁读写NAND形成了读写冲突。这个测试结果说明HMB确实能显著改善DRAM-less盘的持续写入表现但和带DRAM的盘相比在缓存耗尽后的高负载场景下仍有差距。3.4 PCMark 10存储基准的分数解读PCMark 10的存储基准测试模拟了真实应用场景包括系统启动、软件加载、文件拷贝等。三块盘的得分A盘2850分B盘2480分C盘1650分B盘比C盘高了50%但比A盘低了13%。这个差距在真实使用中是可以感知的比如打开大型软件、加载游戏场景时B盘会比A盘稍慢一点但比C盘流畅很多。4. HMB的架构权衡为什么它不是万能药4.1 主机内存访问延迟的硬伤HMB最大的问题在于访问延迟。主机内存虽然比NAND快但主控访问它需要经过PCIe总线走的是TLPTransaction Layer Packet包。一次PCIe内存读请求的往返延迟在PCIe 4.0 x4下大约是几百纳秒到一微秒。而主控本地DRAM的访问延迟只有几十纳秒。这个差距在随机读写场景下会被放大因为每次IO都要查表。有人可能会问为什么不用PCIe的原子操作或者预取机制来掩盖延迟实际上主控确实会用预取和缓存来减少HMB访问次数。比如把最热的那部分映射表缓存在片内SRAM里只有miss的时候才去HMB里读。但片内SRAM容量有限通常只有几MB到十几MB能缓存的映射表比例很低。4.2 主机内存分配的不确定性HMB内存的分配完全依赖主机驱动这带来了很大的不确定性。在内存紧张的系统上驱动可能只分配很小的HMB区域甚至分配失败。我遇到过一种情况在一台8GB内存的笔记本上HMB盘只拿到了64MB的HMB内存性能比预期低了不少。而在32GB内存的台式机上同样的盘能拿到256MB性能明显更好。这种不确定性对SSD厂商来说是个挑战因为无法保证用户在任意主机上都能获得一致的性能体验。所以有些厂商会在产品规格里标注HMB性能取决于主机配置这其实是在提前打预防针。4.3 多命名空间与多控制器的复杂性NVMe协议支持多命名空间Namespace和多控制器Controller。在多控制器场景下每个控制器都可以独立申请HMB内存。如果两个控制器同时访问同一块HMB内存区域就需要额外的同步机制。这个问题在实际产品中不常见但在企业级或双端口SSD上需要特别考虑。另外HMB内存的释放和重新分配也需要处理。比如主机休眠唤醒后HMB内存的物理地址可能发生变化主控需要重新获取描述符并更新映射表。这个过程的处理逻辑如果不够健壮可能导致唤醒后性能下降甚至数据错误。4.4 与PLP电容方案的取舍PLPPower Loss Protection电容是另一个和DRAM相关的设计。带DRAM的盘通常需要PLP电容来保证掉电时映射表能完整写回NAND。HMB盘因为没有本地DRAM理论上不需要PLP电容来保护映射表但主机内存里的映射表在掉电时同样会丢失。所以HMB盘也需要某种机制来保证掉电安全比如定期把映射表快照写回NAND或者依赖主机的掉电通知。这个取舍很实际加PLP电容增加成本不加则掉电安全性下降。入门级HMB盘通常选择不加PLP通过固件层面的快照机制来降低风险但快照间隔内的数据仍有丢失可能。5. 实际项目中的踩坑记录与排查思路5.1 HMB分配失败导致性能断崖在一个客户项目里我们遇到过一个奇怪的现象同一块HMB盘在A客户的机器上跑分正常在B客户的机器上4K随机写只有标称值的三分之一。排查过程如下首先确认盘本身没问题用同一块盘在测试机上复现性能正常。然后到B客户的机器上抓取NVMe命令日志发现Set Features命令返回了错误状态。进一步检查发现B客户机器的操作系统版本较旧NVMe驱动不支持HMB特性。主控申请HMB失败后退回到无HMB模式映射表全部放在NAND里性能自然大幅下降。这个问题的解决方案是升级操作系统或安装厂商提供的NVMe驱动。但这也暴露了HMB方案的一个软肋它对主机环境的依赖太强。5.2 描述符对齐问题引发的数据异常另一个项目里我们遇到了偶发的数据校验错误。排查后发现是HMB描述符的物理地址没有按4KB对齐只按了16字节对齐。主控在访问HMB内存时某些情况下会跨页访问而主机的IOMMU配置可能不允许跨页DMA导致数据读回来是错的。这个问题的修复方法是在主机驱动侧强制按4KB对齐分配HMB内存。虽然NVMe规范只要求16字节对齐但实际项目中按4KB对齐能避免很多边界问题。这个经验后来写进了我们的驱动开发规范里。5.3 热插拔场景下的HMB内存失效PCIe热插拔在服务器场景下很常见。我们测试过在系统运行过程中热插入一块HMB盘发现主控申请HMB内存时主机驱动还没有完成PCIe设备的枚举和初始化导致HMB申请失败。等驱动初始化完成后主控已经进入了无HMB模式不会主动重新申请。这个问题的根源在于HMB申请的时机。主控需要在驱动初始化阶段就完成HMB申请如果错过了这个窗口后续很难补救。解决方案是在驱动侧增加一个重试机制在设备初始化完成后再次检查HMB状态如果未启用则尝试重新申请。5.4 主机休眠唤醒后的映射表重建笔记本平台上主机休眠唤醒后HMB内存的物理地址可能发生变化。我们遇到过唤醒后SSD性能下降的情况抓日志发现主控仍然在使用旧的HMB描述符访问的是已经失效的物理地址。主控读到错误数据后触发了映射表重建重建过程中性能大幅下降。修复方法是在驱动侧监听系统电源状态变化在唤醒后重新下发HMB描述符。同时主控固件也需要处理HMB内存变更的通知及时更新内部缓存。6. HMB的适用边界与选型建议6.1 什么场景适合用HMB盘HMB盘最适合的场景是预算敏感、对随机性能有一定要求但不需要极致性能的场合。比如办公电脑、轻度游戏主机、家用NAS的缓存盘。这些场景下HMB带来的性能提升是明显的而成本比带DRAM的盘低不少。不适合的场景包括数据库服务器、高频交易系统、专业视频剪辑工作站。这些场景对IO延迟极其敏感HMB的访问延迟会成为瓶颈。另外内存容量很小的设备比如4GB内存的瘦客户端也不适合因为主机本身没有足够的内存可以借出。6.2 HMB容量与映射表规模的匹配计算选型时需要考虑HMB容量和映射表规模的匹配。一个简单的估算方法是映射表大小 SSD容量 / 映射粒度 × 每条映射记录大小以1TB容量、4KB映射粒度、4字节记录为例映射表约1GB。如果主控只能拿到256MB HMB那只能缓存约25%的映射表。剩下的75%仍然需要从NAND读取。所以HMB容量越大能缓存的映射表比例越高性能越好。实际项目中我建议HMB容量至少能覆盖映射表的20%到30%低于这个比例性能提升有限。如果主机只能提供很小的HMB不如考虑直接买带DRAM的盘。6.3 固件层面的优化空间主控固件在HMB方案里有很多优化空间。比如热点映射表缓存策略把最常访问的映射表条目缓存在片内SRAM里减少HMB访问次数。预取机制根据IO访问模式预测接下来需要哪些映射表条目提前从HMB或NAND预取。写合并把多个映射表更新合并成一次HMB写操作减少PCIe事务数量。掉电快照定期把HMB里的映射表快照写回NAND降低掉电数据丢失风险。这些优化需要固件团队对IO模式有深入理解并且要做大量的实测调优。不是所有厂商都能做好这也是为什么不同品牌的HMB盘性能差异很大的原因之一。6.4 和带DRAM方案的最终对比对比维度HMB方案带DRAM方案BOM成本低高DRAMPLP电容4K随机读中等高持续写入稳定性中等高主机依赖强无掉电安全性依赖固件快照依赖PLP电容适用场景入门级、办公、家用企业级、专业应用从这张表可以看出HMB和带DRAM不是替代关系而是覆盖不同市场区间的方案。HMB让入门级NVMe盘摆脱了无缓必慢的标签但并没有动摇带DRAM盘在高端市场的地位。我在实际选型时的原则是如果预算允许且对性能有要求优先选带DRAM的盘如果预算有限且用途是日常办公和轻度娱乐HMB盘是性价比很高的选择。至于那些既没有DRAM也不支持HMB的盘除非价格特别有优势否则不建议考虑。最后分享一个实测中的小发现HMB盘的性能对主机内存频率和PCIe链路状态比较敏感。在同一个平台上把内存从DDR4-2666换成DDR4-3200HMB盘的4K随机读能提升约8%。所以如果你在用HMB盘确保内存跑在合理频率上并且PCIe链路没有降速这些细节对最终体验有实际影响。
返回列表