过度加大SSD内部并发何尝不是一种伤害-part1

之前存储随笔有发布过一篇关于如何通过IO并发度提升性能相关的文章:

扩展阅读:SSD基础架构与NAND IO并发问题探讨

SSD整体优化策略就是要低延迟,高带宽,增加NAND的并发度。

图片

本文,我们从另外一个角度来做一些讨论。现代SSD通过并行使用多个通道和芯片来实现高吞吐量,但过度的内部并行性无意中加剧了由于空间回收单位增大而导致的垃圾回收(GC)开销

小编最近看到一篇来自于美国Syracuse大学与三星合作发布在HotStorage23的文章。结合小编自己的理解,节选部分核心内容分享给大家。希望阅读原文的同学,可以后台回复【SSD并发】获取原文。


文章开始,结合SSD并发与写放大的关联,抛出一个观点:SSD中的过度并发实际上是有害的。虽然大的超级块(SSD中每个芯片的一组块,这些块一起被写入)可以提高整体带宽,但这会导致高的GC开销,这种开销不仅影响SSD的寿命,还因其干扰而影响性能。问题的关键在于,固定大小的超级块无法同时实现高峰值性能和低GC开销。

文中的给出的例子是:同时运行四个FIO线程,将不同特性的数据写入具有不同内部并发的SSD,实验结果显示:

  • 随着并行性从1/8增加到全并行发,写放大因子(WAF)增加到230%

  • 反常的是,全并行并没有实现最高的吞吐量,因为高WAF导致半并发配置的吞吐量几乎比全并行高出40%。

图片

基于这一观察,作者设计了一种名为PLAN(Parallelism and Lifetime Aware Allocation)的新SSD并发管理和数据放置方案

PLAN的主要思想是根据不同工作负载的需求提供不同级别的并发度。传统的SSD设计通常在整个驱动器上使用单一级别的并发度,而PLAN则适配不同的并发度:对于带宽密集型的I/O操作使用更高的并发度,而对于其他类型的操作则使用较低的并发度。这样做的目的是在减少垃圾回收(GC)开销的同时,提高整体的吞吐量

图片


PLAN实现核心思路主要包括:

  1. 灵活的超级块:传统SSD将数据块block组织成超级块superblock,其中包含每个芯片的一个块,以确保所有可用通道和芯片上的数据条带化,从而提高并行性和减少DRAM使用。然而,大的超级块作为GC单位会导致更高的写放大因子(WAF)。因此,PLAN通过减少每个通道使用的芯片数量来减小超级块的大小,同时保持所有通道对所有超级块的使用。默认配置为每个通道使用2个芯片(1/4并发),因为进一步降低并发会降低性能,而不会显著减少与基线相比的WAF。

  2. 基于寿命的数据分类:根据预测的数据寿命,SSD选择最适合的目标超级块来写入相似寿命的数据。这样可以将具有相似寿命的数据写入同一个超级块,从而优化GC过程并减少WAF。

  3. 完全在SSD内部实现:与之前需要应用程序、文件系统、操作系统或SSD协议修改的方法不同,PLAN完全在SSD内部实现。这意味着对用户来说是透明的,不需要进行任何额外的修改或训练,只需要更换SSD本身即可。

通过这种方式,PLAN能够在满足大型、顺序请求需要高并行性和大超级块的同时,满足小型、随机请求需要小超级块和高效GC的需求,从而在减少GC开销和提高整体性能之间取得平衡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/265723.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL代码笔记

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻表的增删查改创建表格&…

TLC2543(12位A/D转换器)实现将输入的模拟电压显示到数码管上

代码&#xff1a; #include <reg51.h> #define uchar unsigned char #define uint unsigned int// 数码管0-9 unsigned char seg[] {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; sbit SDO P1^0; sbit SDI P1^1; sbit CS P1^2; sbit CLK P1^3; s…

Linux(一)Linux理论

文章目录 一、Linux概述1.1 体系结构1.1.1 Linux内核1.1.2 用户态与内核态1.1.3 交换空间1.1.4 CLI和GUI 1.2 开机启动过程1.3 系统运行级别1.4 Linux进程1.4.1 Linux进程通信的方法1.4.2 Linux进程状态 二、文件2.1 Linux文件系统2.2 目录结构2.3 绝对路径和相对路径2.4 日志文…

增量式旋转编码器在STM32平台上的应用

背景 旋钮是仪器仪表上一种常见的输入设备&#xff0c;它的内部是一个旋转编码器&#xff0c;知乎上的这篇科普文章对其工作原理做了深入浅出的介绍。 我们公司的功率分析仪的前面板也用到了该类设备&#xff0c;最近前面板的MCU从MSP430切换成了STM32&#xff0c;因此我要将…

HarmonyOS 多态样式

还记得我们css中有 按压 失去焦点 点击后 正常状态 的各种样式设置 那么作为前端开发 TS JS的改版 harmonyos自然也有 这里 我们编写代码如下 Entry Component struct Index {build() {Row() {Column() {TextInput()TextInput().stateStyles({//正常状态normal: {.background…

Pytorch项目,肺癌检测项目之四

# 安装图像处理 的两个包 simpleITK 和 ipyvolume # 安装缓存相关的两个包 diskcache 和 cassandra-driver import gzip from diskcache import FanoutCache, Disk from cassandra.cqltypes import BytesType from diskcache import FanoutCache,Disk,core from diskcache…

计算机组成原理第6章-(计算机的运算方法)【上】

机器数与真值 把符号“数字化”的数称为机器数,而把带“+”、“-”符号的数称为真值。 原码表示法 原码是机器数中最简单的一种表示形式,0表示整数,1表示负数。 约定整数的符号位和数值位之间用“逗号”隔开。 在原码中,0有两种表示形式:“+0”和“-0”是不一样的。 反…

C++内存管理和模板初阶

C/C内存分布 请看代码&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)mallo…

7.5组合总和②(LC40-M)

算法&#xff1a; 相比于上一题&#xff0c;数组candidates有重复元素&#xff0c;而要求不能有重复的组合&#xff0c;所以相对于39.组合总和 (opens new window)难度提升了不少。 如何去重&#xff1f; 先把candidates排序&#xff0c;让重复的元素都在一起 单层递归时&a…

二叉搜索树 --- C++实现

目录 1.二叉搜索树的概念 2.二叉搜索树的操作 3. 二叉树的实现 4.二叉搜索树的应用 5. 二叉树的性能分析 6. 二叉树进阶练习题 1.二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左…

LDO频率补偿

频率补偿 为了维持系统稳定的条件&#xff0c;一般的做法是建立一个低频几点&#xff0c;并把第二个极点放在单位增益频率 f0db 附近。在线性稳压器中&#xff0c;这两个极点是输出极点Po和误差放大器极点Pe。在确定了哪一个极点应该是主极点后&#xff0c;补偿的目的就是理解系…

(Mac上)使用Python进行matplotlib 画图时,中文显示不出来

【问题描述】 ①报错确缺失字体&#xff1a; ②使用matplotlib画图&#xff0c;中文字体显示不出来 【问题思考】 在网上搜了好多&#xff0c;关于使用python进行matplotlib画图字体显示不出来的&#xff0c;但是我试用了下&#xff0c;对我来说都没有。有些仅使用于windows系…

Laravel框架使用phpstudy本地安装的composer用Laravel 安装器进行安装搭建

一、首先需要安装Laravel 安装器 composer global require laravel/installer 二、安装器安装好后&#xff0c;可以使用如下命令创建项目 laravel new sys 三、本地运行 php artisan serve 四、 使用Composer快速安装Laravel5.8框架 安装指定版本的最新版本&#xff08;推荐&a…

2023 年第四季度 Chainlink 产品更新

在回顾 2023 年时&#xff0c;可以明显看到 Chainlink 生态系统所取得的进步是非常显著的。 我们以三个优先事项开始了这一年&#xff1a; 推出了 CCIP&#xff08;我们的跨链互操作协议&#xff09;&#xff0c;使得跨链交易和活动更加安全。推出数据流&#xff08;Data Str…

管理 Jenkins 详细指南

目录 系统配置 安全 状态信息 故障 排除 工具和操作 系统配置 系统&#xff0c;配置全局设置和路径&#xff0c;端口更改&#xff0c;下载地址等。 工具&#xff0c;配置工具、其位置和自动安装程序。 插件&#xff0c;添加、删除、禁用或启用可以扩展 Jenkins 功能的插…

<JavaEE> 网络编程 -- 网络编程和 Socket 套接字

目录 一、网络编程的概念 1&#xff09;什么是网络编程&#xff1f; 2&#xff09;网络编程中的基本概念 1> 收发端 2> 请求和响应 3> 客户端和服务端 二、Socket套接字 1&#xff09;什么是“套接字”&#xff1f; 2&#xff09;Socket套接字的概念 3&…

跨平台应用程序开发软件,携RAD Studio 12新版上线

RAD Studio 是一款专为程序员而准备的跨平台应用程序开发软件&#xff0c;内置Delphi和CBuilder这两种开发工具&#xff0c;另外还提供了新的C功能&#xff0c;扩展了对ExtJS的RAD服务器支持&#xff0c;增强了对vcL的高dpi支持&#xff0c;提高了firemonk (FMX)的质量等等&…

长知识,Session强制账号下线,限制账号登录!

在Web开发中&#xff0c;会话管理是确保用户连续、安全地访问应用程序的关键。PHP中的会话机制&#xff08;session&#xff09;为我们提供了这种功能。通过会话&#xff0c;我们可以跟踪用户的状态&#xff0c;存储和检索用户特定的数据。然而&#xff0c;有时候我们需要强制用…

Python学习路线 - Python语言基础入门 - Python异常、模块与包

Python学习路线 - Python语言基础入门 - Python异常、模块与包 了解异常什么是异常bug单词的诞生异常演示 异常的捕获方法为什么要捕获异常捕获常规异常捕获指定异常捕获多个异常捕获异常并输出描述信息捕获所有异常异常 else异常的finally 异常的传递Python模块什么是模块模块…

C++ Qt开发:Charts折线图绘制详解

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QCharts折线图的常用方法及灵活运用。 折线图…