字节跳动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

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加