首页 / 资讯中心 / 文章详情

企业级SSD为何离不开DRAM:L2P映射表与缓存机制解析

企业级SSD为何离不开DRAM:L2P映射表与缓存机制解析 ★ FEATURED ARTICLE
1. 为什么企业级SSD里总绕不开DRAM但凡拆过一块像样的企业级固态硬盘你大概率会在PCB上看到一颗或几颗独立的DRAM颗粒紧挨着主控。消费级盘上这东西经常被砍掉或者只留个焊盘位置而企业级盘几乎把它当成标配。这个现象背后不是厂商想堆料而是由企业级场景的负载特性决定的。DRAM在SSD里的角色说白了就是一张映射表的缓存。SSD内部用的是NAND闪存闪存有个硬伤不能像内存那样按字节随意改写只能按页读写、按块擦除。为了让操作系统看到一个可以随意读写的逻辑盘主控必须维护一张逻辑地址到物理地址的翻译表也就是L2P映射表Logical-to-Physical Mapping Table。这张表有多大我们算一笔账。假设一块企业级SSD容量是3.84TB映射粒度按4KB算那么逻辑页数量就是3.84TB除以4KB约等于10亿个条目。每个条目如果占4字节整张表就是4GB左右。如果每个条目占8字节那就是8GB。这张表必须能被主控快速访问否则每次读写都要先去NAND里翻表延迟直接爆炸。所以DRAM的第一个作用就出来了把整张或大部分L2P表放进DRAM让主控以内存级速度完成地址翻译。第二个作用是写缓存和读缓存。企业级负载里混合读写很常见主控收到写请求后先把数据写进DRAM缓存攒够一批再一起写进NAND这样可以减少NAND的编程次数提升寿命和性能。读请求也一样热点数据缓存在DRAM里命中后直接返回不用碰NAND。第三个作用是存放FTLFlash Translation Layer运行时的各种元数据比如块擦除计数、坏块表、垃圾回收的中间状态、掉电恢复日志等。这些东西如果每次都写回NAND性能没法看所以必须常驻DRAM。理解了这三个作用就能明白为什么企业级SSD对DRAM的依赖这么深。它不是可选项而是性能、寿命、可靠性的基础设施。接下来我会把DRAM在SSD里的具体用法、容量怎么算、有哪些挑战、实际调试中会遇到什么问题一层层拆开讲。2. DRAM在SSD内部到底承担了哪些活2.1 L2P映射表的存放与访问路径L2P表是SSD最核心的数据结构。主机发来一个读请求地址是LBA逻辑块地址主控拿到LBA后必须查表找到对应的PBA物理块地址然后去NAND里读。这个查表动作如果走NAND一次就是几十微秒起步而走DRAM一次就是几十纳秒级别差了三个数量级。企业级SSD的映射粒度通常是4KB也有用8KB或16KB的。粒度越小表越大但空间利用率高粒度越大表越小但小文件读写会浪费空间。这是一个典型的权衡。实际产品里4KB是主流因为大多数企业级负载的块大小就是4KB或以上。映射表的组织方式也有讲究。常见的有页级映射和块级映射混合的方案。纯页级映射表太大纯块级映射又不够灵活。所以很多主控采用混合映射大部分数据用块级映射热点数据用页级映射这样可以在表大小和性能之间取平衡。DRAM里存放的通常是映射表的缓存而不是全量。因为全量放不下的时候就需要把一部分表项换出到NAND用的时候再换进来。这个换入换出的过程叫映射表换页它本身也会消耗带宽和延迟。所以DRAM容量越大能缓存的表项越多换页越少性能越稳。2.2 写缓存与读缓存的分工写缓存在企业级SSD里通常有两种模式写回Write Back和写穿Write Through。写回模式下数据先写DRAM主控返回完成信号给主机然后再慢慢刷进NAND。这样主机看到的写延迟很低但掉电时DRAM里的数据会丢所以必须配掉电保护。写穿模式下数据同时写DRAM和NAND掉电不丢但写延迟高。企业级SSD几乎都用写回加掉电保护。掉电保护通常靠钽电容或超级电容在主控检测到掉电后用电容里的余电把DRAM里的数据和元数据紧急写进NAND的SLC区域。这个区域叫掉电保护区通常是预留的一块SLC空间写入速度快能保证在电容放电完毕前完成保存。读缓存则是把经常读的数据留在DRAM里。企业级负载里数据库的索引、虚拟机的镜像元数据、日志文件的热点部分都是反复读的。读缓存命中率上去之后NAND的读次数下降延迟和寿命都受益。2.3 元数据与后台任务的运行空间SSD后台一直在跑各种任务垃圾回收GC、磨损均衡Wear Leveling、坏块管理、数据巡检Read Scrub等。这些任务需要维护大量中间状态比如哪些块是有效的、哪些块正在被回收、每个块的擦除次数是多少、温度历史如何。这些状态如果放在NAND里每次更新都要写NANDNAND的寿命很快就被元数据写完了。所以DRAM还承担了元数据运行区的角色。主控在DRAM里维护这些表的副本定期或按需刷回NAND。刷回的频率和策略直接影响SSD的寿命和掉电恢复时间。刷得太勤NAND写放大高刷得太懒掉电后恢复时间长甚至可能丢元数据。2.4 掉电保护与数据恢复的关联掉电保护不是简单加个电容就完事。它涉及一套完整的流程检测掉电、切换供电、冻结主机接口、把DRAM里的脏数据和元数据写入SLC区、记录恢复日志、安全下电。下次上电时主控先读恢复日志把SLC区里的数据回写到DRAM重建映射表然后才对外提供服务。这个过程里DRAM的容量和掉电保护区的容量要匹配。如果DRAM里脏数据太多电容撑不到写完就会丢数据。所以企业级SSD的掉电保护设计本质上是在电容容量、DRAM脏数据上限、SLC写入速度三者之间做平衡。3. DRAM容量怎么算选型看哪些参数3.1 映射表容量的估算方法前面提到映射表大小等于逻辑页数量乘以每个表项的字节数。逻辑页数量等于盘容量除以映射粒度。表项字节数取决于映射表的组织方式常见的是4字节或8字节。举个例子一块7.68TB的企业级SSD映射粒度4KB表项4字节逻辑页数量 7.68TB / 4KB 7.68 × 10^12 / 4096 ≈ 1.875 × 10^9 个映射表大小 1.875 × 10^9 × 4B ≈ 7.5GB如果表项是8字节那就是15GB。这还没算读缓存、写缓存、元数据运行区的开销。所以一块7.68TB的盘如果要把全量映射表放进DRAM至少需要8GB到16GB的DRAM。实际产品里为了成本考虑通常不会放全量而是放一部分剩下的靠换页。换页比例怎么定这取决于负载的局部性。如果负载的访问集中在20%的地址空间那么缓存20%到30%的映射表就能覆盖大部分请求。企业级SSD的DRAM容量通常是盘容量的0.1%到0.3%。比如7.68TB的盘DRAM在8GB到24GB之间。这个比例不是随便定的是厂商根据典型负载的局部性统计出来的。3.2 DRAM类型与接口选择企业级SSD里用的DRAM主要是DDR4或DDR5也有用LPDDR4/5的。DDR4/DDR5带宽高但功耗也高LPDDR功耗低适合对功耗敏感的场景比如数据中心里高密度部署的盘。接口位宽常见的是16位或32位。位宽越大带宽越高但引脚越多PCB布线越复杂。企业级主控通常支持多通道DRAM比如双通道或四通道这样可以并行访问提升带宽。容量方面单颗DRAM颗粒常见的是1GB、2GB、4GB、8GB。企业级盘通常用多颗颗粒组成总容量。比如需要8GB可以用4颗2GB的或者2颗4GB的。用多颗小容量颗粒的好处是布线灵活坏一颗影响小用少颗大容量颗粒的好处是PCB面积小功耗低。3.3 带宽与延迟的平衡DRAM带宽决定了映射表查询和缓存读写的速度。如果带宽不够主控就会在DRAM访问上排队成为瓶颈。企业级SSD的主控通常有多个DRAM通道每个通道的带宽在几GB/s到十几GB/s。总带宽要能支撑起NAND的读写速度否则DRAM就成了短板。延迟方面DRAM的访问延迟在几十纳秒比NAND的几十微秒低三个数量级。但DRAM延迟也不是固定的行缓冲命中时快未命中时慢。主控的映射表访问模式如果随机性太强行缓冲命中率低延迟就会上去。所以有些主控会在DRAM里做映射表的预取和缓存优化把经常一起访问的表项放在相邻的行里提升命中率。3.4 成本与功耗的取舍DRAM不便宜尤其是企业级DRAM带ECC、宽温、高可靠性价格比消费级高不少。一块盘里DRAM的成本占比可能到10%到20%。所以厂商在容量上会精打细算既要保证性能又不能堆太多。功耗也是大问题。数据中心里一块盘功耗多1瓦一万块盘就是10千瓦电费和散热都是钱。所以企业级SSD的DRAM选型会优先考虑低功耗型号比如LPDDR或者在固件里做动态功耗管理空闲时把DRAM降到低功耗状态。4. 实际调试中遇到的挑战与应对4.1 映射表换页导致的性能抖动映射表换页是DRAM容量不足时的必然结果。当主控需要查一个不在DRAM里的表项时必须先从NAND里把对应的表页读进来替换掉一个现有的表页。这个过程中主机的读写请求会被阻塞延迟从几十微秒跳到几毫秒。实测中这种抖动在随机写负载下特别明显。因为随机写的地址分散映射表访问也分散换页频繁。应对方法有几个一是增大DRAM容量减少换页二是优化换页算法用LRU或LFU策略把最不可能再用的表页换出去三是用SLC区做映射表的二级缓存因为SLC读延迟比TLC低不少。我在一次调试中遇到过换页导致的IOPS波动从稳定的20万IOPS掉到5万周期性地抖。后来抓trace发现是换页线程和主机IO抢NAND带宽。把换页线程的优先级调低并且限制换页速率波动就小了很多。这个经验说明换页不是不能有而是要控制节奏不能让它和主机IO硬抢。4.2 掉电保护电容的老化与容量衰减掉电保护电容不是永久的。钽电容和超级电容都有寿命容量会随时间和温度衰减。如果电容容量衰减到不足以支撑一次完整的掉电保存掉电时就会丢数据。企业级SSD的固件通常会监控电容的健康状态比如通过测量充电时间和放电曲线来估算剩余容量。如果容量低于阈值固件会报警提示更换或退役。但在实际部署中这个报警经常被忽略因为运维人员看不到或者看到了也不知道怎么处理。我的建议是在采购企业级SSD时把掉电保护电容的健康监控纳入运维指标。如果盘支持SMART属性读取定期读一下电容相关的属性比如充电时间、放电时间、电容电压等。发现异常就提前迁移数据别等掉电了才后悔。4.3 高温环境下DRAM的刷新率与数据保持DRAM是靠电容存储电荷来表示数据的电容会漏电所以需要定期刷新。温度越高漏电越快刷新率就要越高。企业级SSD在高温环境下比如数据中心的热通道温度可能到50度以上DRAM的刷新开销会显著增加带宽被刷新占用性能下降。更严重的是如果温度超过DRAM的规格上限数据保持时间可能短于刷新周期导致位翻转。虽然企业级DRAM有ECC能纠正单比特错误但多比特错误就纠不过来了。应对方法一是选宽温DRAM规格到85度甚至105度二是在固件里做温度监控高温时降频或增加刷新率三是机箱散热要做好别让SSD长期在高温下跑。我见过一个案例某数据中心为了省风扇功耗把机箱温度调到45度结果一批SSD的DRAM错误率飙升后来把温度降回35度问题就消失了。4.4 元数据刷回与写放大的矛盾元数据刷回NAND会带来写放大。因为元数据通常是小块随机写NAND最怕这个。刷得越勤写放大越高NAND寿命消耗越快。刷得太懒掉电恢复时间变长甚至可能丢元数据。平衡点在哪里这取决于掉电保护的设计。如果掉电保护电容足够大能撑住较长时间的元数据刷回那么可以降低刷回频率减少写放大。如果电容小就必须勤刷保证掉电时DRAM里的脏元数据不多。实际产品里厂商通常会用日志结构的方式刷元数据不是每次更新都写回而是把更新追加到日志里日志满了再整理。这样写放大低恢复时重放日志即可。但日志本身也要占DRAM空间而且日志的整理也会消耗资源。4.5 常见问题速查表问题现象可能原因排查方法应对措施IOPS周期性抖动映射表换页与主机IO抢带宽抓trace看换页线程活动限制换页速率增大DRAM掉电后数据丢失电容老化或容量不足读SMART电容属性更换电容或退役盘高温下错误率上升DRAM刷新不足或超温监控温度与ECC计数改善散热选宽温DRAM写放大偏高元数据刷回太频繁统计NAND写入量与主机写入量比值优化刷回策略用日志结构掉电恢复时间长DRAM脏数据太多测量掉电到恢复完成的时间增大电容降低脏数据上限5. 企业级SSD DRAM方案的演进与替代思路5.1 无DRAM方案为什么在企业级不吃香消费级SSD里无DRAM方案很常见靠HMBHost Memory Buffer借用主机内存来放映射表。但企业级场景里HMB有几个硬伤一是主机内存的访问延迟比本地DRAM高因为要走PCIe总线二是主机内存的可靠性不如SSD本地DRAM主机一重启或崩溃映射表就没了三是企业级负载的映射表太大主机内存借不起。所以企业级SSD几乎不用HMB而是坚持本地DRAM。这不是技术保守而是场景决定的。企业级要的是稳定、可预测、不掉链子本地DRAM是满足这些要求的最直接方案。5.2 更大容量DRAM与更智能的缓存算法随着SSD容量往30TB、60TB走映射表越来越大DRAM容量也得跟着涨。但DRAM成本高不能无限堆。所以厂商在算法上做文章用更智能的缓存替换策略比如基于访问频率和最近性的混合策略用压缩技术把映射表压缩后存DRAM用的时候解压用分级缓存把最热的表项放DRAM次热的放SLC冷的放TLC。这些算法能降低对DRAM容量的需求但也会增加主控的计算开销。所以主控里通常有专门的硬件加速器来做映射表查询和压缩解压减轻CPU负担。5.3 SLC缓存与DRAM的协同SLC缓存通常用来加速写入但它也可以用来放映射表。因为SLC的读延迟比TLC低把一部分映射表放SLC可以缓解DRAM容量不足的问题。但SLC空间有限而且SLC写入会消耗寿命所以这个方案要权衡。实际产品里SLC通常优先用于写缓存和掉电保护映射表的二级缓存是次要用途。如果DRAM实在不够才会考虑把映射表放SLC。这个决策取决于负载特性和成本目标。5.4 未来趋势CXL与近存计算CXLCompute Express Link是一种新的互联协议可以让SSD通过CXL接口访问主机内存或者让主机访问SSD里的DRAM。如果CXL普及企业级SSD的DRAM方案可能会有变化映射表可以放在CXL内存里既享受内存级延迟又不用在SSD本地堆DRAM。近存计算是另一个方向把一部分计算任务放到SSD主控里做减少数据搬运。比如在SSD里做数据过滤、聚合、压缩这样主机不用读全量数据DRAM的压力也小了。这些技术还在演进中但方向是明确的让存储更智能减少对本地DRAM的依赖同时保证性能和可靠性。6. 个人实操中的几点体会我在实际调试企业级SSD时最深的体会是DRAM不是越大越好而是越匹配越好。匹配负载的局部性、匹配掉电保护的能力、匹配散热条件。盲目堆DRAM成本上去了功耗上去了但性能可能没提升多少因为瓶颈可能在别的地方比如NAND本身或者主控的调度。另一个体会是掉电保护是DRAM方案里最容易被忽视的环节。很多人关注性能和容量但掉电保护设计不好一次掉电就可能丢数据后果比性能差严重得多。所以选盘时一定要看掉电保护的设计电容类型、容量、健康监控支持这些都要问清楚。最后分享一个小技巧如果你在调试中遇到映射表相关的性能问题可以先抓一份主控的trace看映射表查询的命中率和换页频率。如果命中率低于90%说明DRAM容量不够或者缓存算法有问题如果换页频率高但命中率还行说明换页策略太激进可以调保守一点。这个思路帮我定位过好几次问题比盲目调参数有效得多。
阅读完成 · 觉得有帮助?
咨询建站