字节跳动ZNS SSD应用案例解析

2023-12-09 10:12

本文主要是介绍字节跳动ZNS SSD应用案例解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、ZNS SSD基本原理

图片

ZNS SSD的原理是把namespace空间划分多个zone空间,zone空间内部执行顺序写。这样做的优势:

  • 降低SSD内部的写放大,提升SSD的寿命

  • 降低OP空间,host可以获得更大的使用空间

  • 降低SSD内部DRAM的容量,降低整体的SSD成本

  • 降低SSD写延迟

  • ZNS写入了标准NVME协议,更易于打造软件生态,利于普及

图片

与SMR架构类似,ZNS SSD的zone空间内部,也是追加写。每次顺序写完成后,有一个标记位“Write Pointer”来记录已经写过数据所在的LBA位置。

图片

Zone的状态有以下几个:

  • Full:zone写满的状态

  • Empty:zone数据空的状态

  • Explicitly Opened:对zone执行open zone命令成功后的状态

  • Implicitly Opened:对处于Empty或者Closed状态的zone完成写数据后的状态

  • Closed:还未写满的zone,在close zone命令成功后的状态

  • Read Only:处于只读状态的zone

  • Offline:zone处于异常状态,可能是介质异常或者其他的问题

图片

在Linux内核适配方面,针对zoned设备,之前针对SMR已经有ZAC/ZBC命令规范,并在4.10内核已经支持。针对ZNS SSD,在内核5.10以后也支持了ZNS SSD,软件生态已经基本完善。

图片

在传统的SSD中,SSD控制器会搭配10-100个NAND Die存储介质,管理这些NAND介质就需要一个强大的算法,这里就有一个FTL管理层。

在这个过程中,ZNS SSD最大的优势是取消了块接口税(Block Inteface Tax)

图片

图片

与传统Block SSD相比,性能更加稳定,不受OP的影响。

图片

如果在文件系统层删除一个文件,比如下图文件C,在没有GC搬迁的情况下,会在无效数据C会占用大量的存储空间。

图片

GC搬迁有效数据到空的block后,之前无效文件C所在数据块block就可以被整个block擦除了。

图片

整个GC的过程最终导致写放大WAF的增加。写放大的增加相应对SSD带来的负面效应就是写带宽下降、读延迟升高、使用寿命下降等问题

在ZNS的场景下,不同应用按照Zone配置信息,相应存放业务数据。主要集中在顺序读写的workload场景。由于是Host管理数据的摆放和存取位置,会最大程度减少GC垃圾回收。

图片

减少SSD的DRAM空间和去掉OP冗余空间,提升用户可用的容量。

图片

二者具体的优劣对比:

图片

扩展阅读:NVMe SSD:ZNS与FDP对决,你选谁?

二、字节跳动ZNS SSD应用案例分析

图片

字节给出未来数据中心的发展趋势,包括计算、网络、存储三大组件。

图片

字节目前遇到云存储的痛点主要包括:性能、成本、稳定性、定制化。性能方面,SSD的垃圾回收在传统SSD并不可控。成本方面,传统SSD需要预留一定的OP预留空间。稳定性方面,出现异常后,传统SSD的定位周期很大程度依赖SSD厂商。定制化方面,目前主要有SGL、CMB、PMR、ZNS等。

图片

在使用ZNS SSD的场景中,字节采用了软硬结合的方式整体优化。软件方面,负责GC,WL,NAND数据存放位置优化以及QoS优化。硬件方面,主要负责是底层NAND异常和NAND管理,以及CMB、PMR特性

图片

软件架构如下:NAND相关等盘体异常可以通过AER进行错误上报。

图片

软件针对数据管理的架构:

图片

利用分布式存储chunk管理,与Zone SSD映射关系如下:

图片

通过分布式存储完成Host侧的垃圾回收GC:

图片

Host在对ZNS SSD写数据过程中,有一个很重要的特性就是要支持写入数据最后一个LBA overwrite覆盖写,优化NAND存储空间,最终降低写放大。LBA覆盖写在ZNS标准协议是不支持的,需要定制化设计。

图片

同时,对于有硬件,有两个重要的定制功能,是需要支持CMB和PMR

图片

CMB(Controller Memory Buffer),即控制器内存缓冲区,是SSD控制器内部用于缓存数据的动态随机访问存储器(DRAM)。它的主要目的是加速数据处理,减少读写操作的延迟。通过使用CMB,SSD可以预先将一部分数据缓存在高速的DRAM中,然后根据需要快速地从CMB中提供数据给主机系统,或者临时存储等待写入闪存的数据。

CMB的工作原理包括:

  • 预取(Prefetching):当控制器预测到即将需要的数据时,会提前将其加载到CMB中,从而减少了实际从闪存读取数据的时间。

  • 写回(Write-back):如果主机发出一个写入请求,而目标地址已经存在于CMB中,那么控制器可以选择先更新CMB中的数据,稍后再将修改后的数据写入闪存。这允许更快地响应写入操作,并且有助于提高整体性能。

图片

在 NVME 1.4 SPEC引入了类似CMB的PMR(Persistent Memory Region),PMR的作用是提供一种内存级读写速度、断电后数据不会丢失的存储区域。它使用此功能创建并控制一个称为持久性内存区域(PMR)的存储区域,该存储区可以映射到PCI Express总线上的地址空间上面,并且可被主机和其他设备访问。PMR的主要特点是,在电源断电(power cycle),控制器复位以及PMR启用/禁用切换之后,写入PMR的数据也会保留。此功能使SSD除了提供通过逻辑块地址(LBA)访问的存储区域外,还提供了另一个非易失性存储区域,并且这块存储区域假定的访问方法是内存访问而不是块访问。

图片

Zero Copy通过消除这些不必要的数据复制来提高效率它允许数据直接从源缓冲区传输到目标设备,而不需要经过中间缓冲区。这样可以减少CPU的参与,释放更多的计算资源,并加快数据传输的速度。

SGL(Scatter-Gather List)是实现Zero Copy的一种方法。在这种机制下,应用将一系列分散的数据块(称为scatter-gather list)提交给设备驱动程序,而不是一个连续的内存区域。驱动程序则可以直接将这些分散的数据块传输到目标设备上,从而避免了在传输过程中对数据进行复制。

结合Zero Copy技术和SGL,可以显著提升存储系统的性能,尤其是对于需要处理大量小规模I/O操作的应用场景,如数据库、虚拟化环境和大数据分析等。

针对云数据中心对ZNS SSD的特别定制需求,字节跳动总结如下:

图片

基于字节跳动公布的ZNS SSD的应用效果显示:可用容量提升30%,带宽提升3倍,成本下降20%。

图片

这篇关于字节跳动ZNS SSD应用案例解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/473409

相关文章

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现