1. 项目概述当GC遇上I/OSSD的长尾延迟困局如果你在数据中心或者高性能计算领域工作一定对固态硬盘SSD的性能波动深有体会。明明标称性能强劲但在某些时刻I/O延迟会毫无征兆地飙升到毫秒甚至秒级这种“长尾延迟”就像系统性能的幽灵难以预测却影响深远。问题的根源往往就藏在SSD内部一个看似不起眼的后台任务里——垃圾回收Garbage Collection GC。简单来说SSD的存储介质NAND闪存有个物理特性数据不能直接覆盖写入必须先擦除整个块Block才能写入新数据。因此当文件系统更新一个已有数据时SSD会把新数据写到一个新的、空闲的物理页Page上并将旧数据标记为无效。久而久之无效数据遍布各个块占据了宝贵的存储空间。垃圾回收GC就是SSD的“清洁工”它的任务是找到这些包含大量无效数据的块称为“受害者块”把里面还有用的数据“有效页”搬到一个新的空闲块里然后把旧的受害者块整个擦除腾出空间。这个“搬家”过程就是一切麻烦的开始。想象一下你正在一条繁忙的高速公路上开车用户I/O请求突然前方出现多辆大型搬家卡车GC操作也要占用车道。它们不仅开得慢闪存写入和擦除操作本身耗时还会因为车身庞大而长时间占据车道导致你的车被堵在后面。在SSD内部这条“高速公路”就是连接控制器和众多闪存芯片的物理通道Channel。传统的SSD架构中多个闪存芯片共享一条通道当GC的“搬家卡车”有效页迁移请求和你的“私家车”用户I/O请求要去往同一个闪存芯片时它们必须在通道入口处排队串行通过。GC操作一旦开始往往会连续迁移多个有效页这就相当于一列车队堵住了路口后面的I/O请求只能干等延迟就这样产生了。更棘手的是在持续写入或硬盘空间接近满载时GC会被频繁触发。这种间歇性的、密集的后台活动使得I/O延迟不再稳定而是出现剧烈的、难以预测的抖动形成所谓的“长尾延迟”。对于数据库、实时分析、高频交易等对延迟极其敏感的应用来说这种毫秒级的延迟尖峰足以导致服务超时、事务失败严重影响业务连续性。业界并非没有努力。从软件层面的GC调度算法优化比如尝试在I/O空闲期执行GC到硬件层面的通道架构革新方案不少。其中Venice方案是一个重要的硬件思路创新。它通过在SSD控制器和闪存芯片之间引入一个低成本的互连网络类似一个微型路由器网络让每个I/O请求在发送数据前能像侦察兵一样先发一个“侦察包”scout packet去预留一条从控制器到目标芯片的专属、无冲突的路径。这极大地增加了路径多样性缓解了多个I/O请求之间的路径冲突。但是Venice有一个关键缺陷它对所有请求一视同仁。在它的“公平调度”策略下GC请求和用户I/O请求拥有相同的路径竞争权利。当GC密集进行时大量GC请求会涌入网络抢占并预留大量路径。尽管网络提供了多条路但关键路径资源被低优先级的后台任务占据高优先级的实时I/O请求反而可能找不到路或者需要等待GC请求释放路径长尾延迟问题依然存在。这就引出了我们这次要深入探讨的核心方案GC Bypass。它的核心思想非常直接“区别对待”。既然GC是必要的后台维护而用户I/O是关乎服务质量的前台任务那就应该给它们划分优先级。GC Bypass在Venice的互连网络基础上做了两件关键事第一为GC请求设立一个专用的“入口”——独立的GC控制器实现物理入口的隔离第二对GC请求本身进行“分诊”将其中对实时性要求不高的“有效页写入”操作标记为低优先级允许高优先级的用户I/O、有效页读取和块擦除操作去“插队”抢占其预留的路径。被“挤掉”的低优先级写入请求则暂时存入一个缓冲区稍后重试。这套组合拳的目标很明确在保证GC任务最终能完成空间得以回收的前提下最大限度地减少它对用户I/O的干扰从而削平那令人头疼的长尾延迟。接下来我们就拆开揉碎了看看这套方案具体是怎么设计、如何工作以及在实际中能带来多大提升。2. 核心设计思路优先级隔离与路径抢占要理解GC Bypass的精髓我们需要先跳出单纯的软件调度思维从硬件资源竞争的根源上看问题。在传统或Venice架构中GC与I/O的冲突发生在共享的路径资源上。GC Bypass的解决思路是分层递进的入口隔离、请求分级、动态抢占。2.1 架构基石专用GC控制器与互连网络GC Bypass的硬件基础继承并扩展了Venice的互连网络架构。在Venice中每个闪存芯片旁边附着一个简单的路由器芯片共同构成一个“闪存节点”Flash Node。这些节点通过双向链路连接成一个网格Mesh网络。SSD的多个闪存控制器Flash Controller连接在这个网格网络的边缘。任何请求在传输数据前都必须先通过其连接的控制器发送侦察包在网络中预留一条无冲突的路径。GC Bypass在此基础上增加了一个独立的GC控制器。这是一个关键的设计决策。所有由FTL闪存转换层发起的GC相关请求——包括读取受害者块中的有效页、将有效页写入新位置、擦除受害者块——不再通过普通的闪存控制器进入网络而是统一经由这个专用的GC控制器。注意这里的“专用”是逻辑和入口层面的并非指物理上完全独立的硬件模块。在现代SSD控制器设计中可以通过逻辑划分或利用如JESD230G标准中的SCA独立命令/地址协议在不显著增加引脚和面积开销的前提下实现一个专用于GC请求调度的控制模块。这样做的好处显而易见入口隔离用户I/O请求和GC请求从物理入口上就分开了。这避免了它们在控制器入口队列中混合排队相互阻塞。GC请求的集中调度也减少了其在网络入口处的随机分布降低了与I/O请求路径冲突的概率。集中管理GC控制器成为所有GC相关状态和缓冲的中心。它可以更高效地管理GC过程例如批量处理缓冲的有效页优化路径选择策略。2.2 优先级机制精细化拆分GC子操作仅仅隔离入口还不够因为GC请求进入网络后还是会和从其他入口进入的I/O请求在网络内部交叉、竞争链路资源。GC Bypass的第二个核心创新在于它没有把GC请求当作一个不可分割的整体而是将其精细地分解为不同的子操作并赋予不同的优先级高优先级Priority1用户I/O请求所有来自主机的读/写请求这是必须优先保障的服务。有效页读取GC_R从受害者块中读取有效数据。这个操作必须尽快完成以便尽快释放受害者块并且其延迟会直接影响后续擦除操作的开始时间。块擦除GC_E擦除已搬空的受害者块。这是回收空闲空间的关键步骤也必须高效完成。低优先级Priority0有效页写入GC_W将读取出来的有效页数据写入新的目标块。这个操作虽然必要但其时效性要求相对较低。数据经被安全地读取并可能缓存在缓冲区中稍晚一些写入并不会阻塞空间回收因为擦除可以在读取完成后立即进行也不会影响主机读取新数据位置更新前读请求可通过FTL映射或缓冲区获取数据。这种优先级划分的智慧在于它抓住了GC过程中影响I/O延迟的主要矛盾有效页迁移的“写”阶段。通过将其降为低优先级我们相当于给高优先级的I/O请求发放了“通行证”允许它们在网络资源紧张时抢占那些被低优先级GC写入请求预留的路径。2.3 路径预留与抢占协议优先级信息被编码在Venice原有的侦察包中。侦察包很小仅16位包含头微片Header Flit和尾微片Tail Flit。GC Bypass复用了尾微片中的一个保留位作为优先级标志位0低1高。网络中的每个路由器都维护一张路径预留表。这张表不仅记录哪个包预留了哪条链路还通过一个2位的“链路状态”字段记录该预留的优先级以及链路是否正在传输数据。状态编码如下00空闲未预留。01被低优先级请求预留可被抢占。10被高优先级请求预留不可被抢占。11链路正在传输数据无论优先级不可被抢占。当一个高优先级的侦察包在路由过程中发现它想使用的下一跳链路状态是01被低优先级预留它会触发抢占机制路由器向该链路的原预留方发送一个“取消包”。原低优先级请求的侦察包路径被释放该请求的路径预留失败。路由器更新预留表将该链路状态改为10并关联新的高优先级包ID。高优先级包成功预留该链路继续前进。而被抢占的低优先级GC写入请求其侦察包会返回GC控制器。GC控制器不会让它无限重试浪费资源而是将其对应的有效页数据暂时存入一个专用的有效页缓冲区并记录在缓冲区映射表中。稍后GC控制器会重新尝试为这些缓冲的页面发起路径预留请求。为了防止低优先级请求完全“饿死”始终无法获得路径GC Bypass引入了一个动态优先级提升机制。每个侦察包都有一个回溯计数器。如果一个低优先级包因多次被抢占或找不到路径而失败返回计数器会增加。当失败次数超过一个阈值这个阈值可以根据SSD剩余空间动态调整空间紧张时阈值变小以加速GC该请求的优先级会被临时提升为高优先级从而更容易获得路径。这套基于优先级的抢占式路径预留协议是GC Bypass能够实现低延迟保障的核心。它确保了在网络拥塞时关键的I/O流量总能找到“快车道”。3. 工作流程详解从GC触发到I/O响应理解了核心设计我们来看GC Bypass在SSD实际运行中如何协调GC和I/O这两个并发的流程。整个过程体现了硬件协同调度的精妙。3.1 垃圾回收GC流程假设SSD的空闲空间低于阈值FTL触发垃圾回收。选择受害者块FTL根据既定算法如Greedy、Cost-Benefit等选出一个包含无效页最多的块作为受害者块并将该块信息芯片号、页地址列表发送给GC控制器而非普通闪存控制器。高优先级读取有效页GC控制器向受害者块所在的闪存芯片发送高优先级的侦察包预留路径。由于是高优先级它可以抢占路径。成功后发起读取操作将有效页数据读入GC控制器内部的有效页缓冲区。同时FTL映射表中这些页的旧条目被标记为无效。高优先级擦除块一旦所有有效页读取完毕数据已在缓冲区GC控制器立即向受害者块发送另一个高优先级侦察包执行擦除操作。这一步不需要等待有效页写入完成。这是关键优化空间回收可以立即进行极大缓解了写压力下的空间紧张问题。低优先级写入有效页对于缓冲区里的有效页GC控制器准备将它们写入新的目标块。目标块的选择结合了磨损均衡算法和实时的芯片状态向量标记芯片是否空闲。GC控制器向选定的目标芯片发送低优先级侦察包尝试预留路径。如果成功则将缓冲区的数据写入新位置并更新FTL映射表清除缓冲区对应条目。如果失败被抢占该写入请求被记录GC控制器稍后重试。同时由于数据已在缓冲区主机对该逻辑页的读请求可以直接从缓冲区服务无需等待闪存写入这进一步降低了读延迟。缓冲区管理缓冲区映射表记录每个缓冲页的逻辑页号LPN、缓冲区页号BPN、所属GC进程标识Type和脏位Dirty。如果主机在页面缓冲期间发起了对该逻辑页的写操作则直接更新缓冲区中的数据并设置脏位。后续回写时脏页必须写入全新的物理位置。3.2 主机I/O请求流程主机I/O请求的处理与现有流程类似但增加了对缓冲区的查询。读请求缓冲区命中首先查询GC控制器的缓冲区映射表。如果请求的LPN在缓冲区中则直接从DRAM缓冲区中读取数据返回。这是极大的延迟优势避免了访问慢速的闪存。缓冲区未命中走正常流程。由FTL进行地址转换选择最近的可用闪存控制器发送高优先级侦察包预留路径然后从闪存芯片读取数据。写请求缓冲区命中如果写入的LPN正有数据缓存在GC缓冲区等待写入闪存则直接更新缓冲区中的数据并设置该缓冲区条目的脏位Dirty1。这避免了无效的闪存写入。缓冲区未命中走正常流程。FTL分配新的物理页通过闪存控制器发送高优先级侦察包写入数据并更新映射表。3.3 网络路由算法非最小完全自适应路由GC Bypass沿用了Venice的非最小完全自适应路由算法并增强了优先级处理逻辑。算法工作分为两个阶段最小路径阶段侦察包首先尝试走最短路径曼哈顿距离。路由器检查所有可能朝向目标方向端口的链路状态。如果端口空闲00或被低优先级预留01且当前请求为高优先级则可以选择。如果选择了一个被低优先级预留的端口则触发抢占流程。如果所有最短路径端口都被高优先级占用10或正在传输数据11则进入下一阶段。非最小路径阶段尝试绕行路径。路由器尝试其他非最短路径方向上的端口排除来时的输入端口。逻辑与第一阶段相同。回溯如果当前路由器所有可用端口都尝试失败侦察包将沿原路返回上一个路由器回溯并尝试在该路由器选择其他输出端口。为了避免活锁Live Lock算法限制一个侦察包访问同一个路由器的次数在2D网格中最多3次。这套算法确保了高优先级请求总能找到路径必要时通过抢占和绕行同时通过回溯和重试机制保证了低优先级请求最终也能完成实现了灵活高效的网络资源调度4. 方案优势与性能收益分析GC Bypass并非凭空想象其设计权衡和预期收益都有扎实的逻辑支撑。我们主要从性能增益和开销控制两个维度来分析。4.1 性能提升的理论基础削减长尾延迟的核心长尾延迟的本质是概率、高延迟的事件。在SSD中这常常是GC期间大量有效页迁移请求集中爆发与突发用户I/O流在有限资源上碰撞所致。GC Bypass通过优先级机制确保了这种碰撞发生时受损的永远是低优先级的GC写入请求而用户I/O和GC的关键步骤读、擦除得以畅通。被抢占的GC写入请求只是暂存缓冲稍后重试其延迟不会被用户感知。这就从概率上极大降低了用户I/O遭遇极端延迟的可能性。提升带宽利用率在Venice中一个被低优先级GC请求预留但尚未开始传输数据的路径实际上处于“闲置预留”状态其他请求无法使用。GC Bypass的抢占机制释放了这些闲置资源让高优先级请求可以立即使用提高了关键路径的利用率和整体有效带宽。改善芯片利用率通过隔离GC入口和优先级调度GC Bypass使得I/O请求和GC请求在网络中的分布更可控减少了随机冲突导致的芯片空闲等待时间。高优先级请求能更快地到达目标芯片并启动操作使得闪存芯片保持更忙碌的状态提升了整体吞吐量。4.2 开销与可行性评估任何硬件优化方案都必须考虑其引入的额外成本。GC Bypass的开销控制得相当克制逻辑开销极小优先级位仅复用了侦察包中1个保留位无额外带宽开销。路由器表项扩展每个预留表项仅增加2位链路状态信息存储开销可忽略不计。路由逻辑优先级比较和抢占逻辑是简单的数字比较和状态机控制在现代路由器设计中增加的面积和功耗微乎其微。GC控制器开销这是主要的硬件增加部分。但需要明确它并非一个从零构建的全新复杂控制器。它本质上是将现有闪存控制器中负责GC请求处理的相关逻辑单元独立出来并赋予其独立的网络入口。在支持SCA等新接口协议的架构下命令通道可以复用进一步降低了引脚和布线开销。论文中引用FPGA原型数据其逻辑资源消耗约占整体的10%这在追求高性能的SSD控制器设计中是可接受的权衡。缓冲区开销有效页缓冲区大小设计为1个闪存块例如1MB容纳256个4KB页。对于动辄配备数GB DRAM的现代企业级SSD而言这1MB的专用缓冲区开销几乎可以忽略。但它带来的收益是巨大的它解耦了GC读和写使得空间回收擦除不必等待数据写入完成并且充当了被抢占请求的“避风港”避免了重复发起路径预留的开销。路径预留延迟有人可能担心复杂的路由和抢占会增加路径建立时间。但需要认识到侦察包极小8字节其传输和路由延迟纳秒级与闪存芯片自身的操作延迟读数十微秒写数百微秒擦除数毫秒相比完全是九牛一毛。优先级处理和抢占所增加的逻辑延迟在整体I/O延迟中占比极低。4.3 与现有方案的对比为了更直观地理解GC Bypass的定位我们可以将其与主流优化方案进行对比方案类别代表方案核心思路优点缺点/GC Bypass的改进点软件调度优化半抢占式GC、空闲期GC在FTL层面调整GC执行时机或允许GC被I/O中断。无需硬件改动实现灵活。受限于硬件架构无法解决物理路径冲突的根本问题GC中断可能带来碎片化等副作用。硬件通道增强pSSD采用分组通信接口提升通道有效带宽。提升了理论带宽。成本较高且单纯增加带宽并未改变GC与I/O对路径的竞争关系。硬件路径多样性Venice, pnSSD, NoSSD改变控制器与芯片的连接拓扑提供更多可选路径。Venice以低成本提供了丰富的路径有效减少冲突。缺乏优先级区分。GC请求仍会与I/O平等竞争在GC密集期可能阻塞关键路径。硬件协同调度GC Bypass在Venice路径多样性基础上引入专用控制器入口隔离 GC子请求优先级划分 路径抢占。从入口和调度两个层面隔离干扰。保障I/O和GC关键步骤延迟允许非关键步骤被抢占缓冲区平滑请求。引入了额外的控制逻辑和少量硬件资源GC控制器、缓冲区。GC Bypass可以看作是Venice方案的“增强版”或“专业版”。它承认了路径多样性是基础但进一步指出在资源有限的情况下公平不一定是最高效的。通过对请求进行智能分类和优先级调度它让宝贵的路径资源流向了最需要的地方。5. 实验验证与结果解读理论再完美也需要实验数据的支撑。原论文使用业界广泛认可的SSD模拟器MQSim在真实的MSR和阿里云追踪负载下将GC Bypass与基线方案传统SSD和Venice方案进行了对比。我们来看看关键指标的表现。5.1 端到端延迟与读写事务延迟这是最直接的性能指标。在所有测试负载下GC Bypass的平均端到端延迟都是最低的。相比于基线方案降低幅度最高达62%相比于Venice也有最高26%的提升。这意味着从主机发出请求到收到响应的整体时间显著缩短。更细致的读写事务延迟分析显示GC Bypass在写延迟上的优化尤为突出相比Venice最高降低39%。这是因为写操作本身耗时较长且更容易触发GC因此从优先级调度中获益最大。读延迟也有稳定提升最高18%部分得益于缓冲区命中带来的直接DRAM访问。5.2 带宽与长尾延迟Tail Latency带宽结果印证了资源利用率提升的理论。GC Bypass的带宽最高可达基线方案的3.1倍Venice的1.3倍。这表明抢占机制有效减少了路径资源的闲置让数据管道更饱满。长尾延迟如99.99%分位延迟是衡量系统稳定性的黄金指标。实验结果显示在RSRCH等负载下GC Bypass将99.99%分位延迟相比Venice进一步降低了25.2%。这个数字非常关键它意味着最慢的那0.01%的请求其延迟得到了显著改善。对于追求服务等级协议SLA的数据中心应用来说优化长尾延迟比提升平均延迟往往更重要。GC Bypass通过优先级保障有效地“削平”了延迟分布的尾部。5.3 长期运行稳定性与芯片利用率观察各方案在长时间运行下的请求响应时间曲线可以发现基线方案的曲线抖动剧烈峰值很高Venice有所改善但在GC触发时仍会出现明显的延迟尖峰而GC Bypass的曲线最为平缓抖动和峰值都控制得最好。这证明了其调度机制能有效平滑由GC引起的性能波动提供更可预测的I/O性能。芯片利用率图则从另一个角度说明了效率。GC Bypass在各负载下都保持了更高、更稳定的芯片利用率。这意味着闪存芯片更多时间在处理有效工作而不是在空闲或等待路径。高且稳的利用率是高性能和高性价比的基础。5.4 GC开销对比在与pSSD、SmartNetSSD等更先进的网络化SSD方案的对比中GC Bypass在多种负载下的GC开销可以理解为GC操作本身所占用的时间和资源比例都是最低的。这有点反直觉一个为GC引入了专用控制器和缓冲区的方案GC开销反而更低其实这正体现了**“磨刀不误砍柴工”**。通过优先级调度GC的关键步骤读、擦除能更快完成空间得以迅速回收而非关键的写入操作则可以通过缓冲和重试来灵活安排避免了在路径拥堵时“硬闯”造成的长时间等待和资源空转。从系统整体视角看GC任务完成得更高效对前台业务的干扰更小总体的“开销”自然就降低了。6. 实现考量与潜在挑战尽管GC Bypass在模拟实验中表现优异但要将其投入实际芯片设计还需要考虑一些工程实现上的细节和挑战。6.1 硬件实现复杂度最大的挑战在于GC控制器的集成。它需要独立的命令队列与调度器处理来自FTL的GC子请求并按照优先级策略进行排序和分发。缓冲区管理单元管理有效页缓冲区及其映射表处理缓冲区命中查询和脏位更新。与互连网络的接口需要实现与Venice路由器相同的侦察包生成、发送和接收逻辑并集成优先级位。与FTL的紧密耦合GC控制器需要与FTL模块进行高效通信接收受害者块信息反馈GC状态并协同更新映射表。虽然逻辑上独立但在物理布局上GC控制器很可能与现有的闪存控制器共享许多模块如ECC编解码器、数据加扰器、NAND接口PHY等通过内部总线或网络接口NoC与主控核心及互连网络连接。如何划分功能、共享资源以平衡性能和面积是芯片架构师需要仔细权衡的。6.2 缓冲区大小与管理策略论文中设定缓冲区大小为1个闪存块。这是一个合理的起点但最优大小可能因工作负载和SSD容量而异。更大的缓冲区可以容纳更多被延迟的写入请求减少重试压力但会占用更多宝贵的DRAM空间。更精细的管理策略例如根据SSD空闲空间比例动态调整缓冲区大小或GC写入请求的重试阈值可能带来进一步的收益。缓冲区映射表的设计也需高效。它虽然比FTL的主映射表小得多但查询速度必须快以免成为I/O路径上的新瓶颈。可以考虑使用小型、高速的SRAM或集成在GC控制器内的专用缓存来存储活跃的缓冲区映射条目。6.3 对FTL算法的要求GC Bypass与FTL算法是协同工作的关系。它并不强制要求特定的GC触发策略或受害者块选择算法任何现有算法如Greedy, Cost-Benefit, CAT等都可以使用。但是一个能更精准预测GC负载、更平滑调度GC过程的FTL能与GC Bypass的硬件调度产生更好的“化学反应”。例如FTL可以尝试将来自不同通道、不同芯片的GC请求进行“错峰”调度避免它们同时涌向GC控制器造成局部拥堵。或者在感知到系统I/O压力大时FTL可以适度推迟启动非紧急的GC优先利用GC Bypass的缓冲区来缓冲写入请求。6.4 适用场景与局限性GC Bypass的优势在写密集、对延迟敏感、且GC频繁的场景下最为明显。例如数据库事务日志持续的小块写入对延迟极其敏感。实时流处理要求稳定的低延迟I/O。虚拟化/容器环境多个租户共享存储需要稳定的性能隔离。它的主要开销在于额外的控制逻辑和缓冲区。对于极端成本敏感、以顺序大块读写为主如视频监控归档的应用传统架构或简单的Venice可能性价比更高。此外该方案主要优化了由路径冲突引起的长尾延迟对于其他原因如芯片内部Die/Plane争用、FTL映射表查询延迟等导致的延迟优化效果有限。7. 总结与展望回过头看GC Bypass解决长尾延迟的思路清晰而有力它没有试图消灭GC而是选择与之“智慧共存”。通过专用入口隔离实现流量分类通过子操作优先级划分抓住主要矛盾通过路径抢占与缓冲实现资源调度这套组合拳在Venice提供的硬件基础上实现了从“公平竞争”到“保障关键”的调度理念升级。从实验结果来看它的收益是实实在在的更低的平均和尾延迟更高的带宽和芯片利用率更平滑的性能曲线。它告诉我们在存储系统的深水区优化软硬件协同设计不再是可选项而是必选项。FTL的软件智能需要硬件提供更精细的调控“把手”如优先级、专用队列而硬件的灵活性需要软件传递更明确的意图如请求分类、紧急程度。未来这个方向还有不少值得探索的空间。例如优先级是否可以不止两级能否根据I/O请求的类型读/写或来自的虚拟机/容器ID进一步细分GC Bypass的缓冲区能否与主机端的缓存或新式ZNS SSD的Zone管理进行联动在存算一体或计算存储分离的架构下这种基于网络的优先级调度思想如何进一步扩展对于我们这些在一线折腾存储系统的人来说GC Bypass这样的方案提供了一个很好的范本。它提醒我们面对复杂的系统级问题有时最好的办法不是增加更多的资源而是更聪明地管理现有的资源。给不同的任务贴上不同的优先级标签在拥堵时让关键任务先走这个在生活中通行的道理在SSD内部的微观世界里同样行之有效。