浅析nvme原子写的应用场景

news2024/11/16 2:41:01

1.NVMe原子写简介

NVME协议家族,当前发展的已经非常庞大,来张nvme家族大合影。从最开始的NVME Base Spec,又延伸了更加专业聚焦的模块Command Set Spec、Transport Spec,NVME MI Spec等等。

在Command Set Spec中,我们可以看到针对nvme设备相关的原子操作的定义相关参数。原子写的简单理解就是,一笔写操作,要不全部写入盘,要不全部未写入盘,不存在部分写入+部分未写入的情况,最大限度保证数据一致性。

从nvme协议中的定义来看,原子写参数主要分为三大类:控制器controller级别、namespace级别以及namespace原子写边界相关参数。

  • AWUN:Atomic Write Unit Normal,这个参数是定义了控制器级别的原子写参数,以block数量为单位,常见的盘的block的大小有512B、4K、16K等。单个block本身就有原子写属性。当写入IO=<AWUN,该IO可以完成原子写的操作。不过需要注意,当写入IO>=AWUN时,且namespace没有设定原子写操作参数,会失去原子写的能力,NVME盘是不会有相关错误返回,需要上层用户自己掌控原子写的约束条件。

      

下图示例,AWUN=2KB,每个LBA 512B。假设两笔原子写操作:A原子写命令填充LBA0-3数据,B原子写命令填充LBA1-4数据,且均小于等于AWUN的原子写单位。那么,有效的结果就是前2行,要么LBA0-3 A+ LBA4 B,要么LBA0 A+LBA1-4 B,每一笔写入都是原子操作,不能出现后两种部分写入的情况。

  • AWUPF:Atomic Write Unit Power Fail,这个比较好理解,当出现异常掉电的情况,当写入IO=<AWUPF时,可以保证原子写的能力,同时也要求AWUPF=<AWUN, 不能超过控制器本身的原子写的能力。企业级SSD中通常有PLP掉电保护的大电容,不会影响数据安全,消费级SSD如果使用原子写能力,可能需要重点关注这项。在linux系统中,可以通过nvme_id_ctrl相关的命令获取原子写参数的配置

struct nvme_id_ctrl {
   ...
   __u8 tnvmcap[16];
   __u8 unvmcap[16];
   ...
   __le16 awun;
   __le16 awupf;
   __le16 acwu;
   ...
};
  • NAWUN/NAWPF:这两个参数是Namespace级别的,定义与AWUN/AWUPF类似,控制器级别的参数也可以用于namespace级别原子写,需要注意的是,namespace级别原子写的参数>=控制器级别的原子写参数,比如NAWUN>=AWUN, NAWUPF>=AWUPF. 也就是说,namespace级别原子写支持更大的原子写能力。此外,Namespace级别原子写需要注意LBA边界的问题

  • ACWU/NACWU:这两个参数是控制器和namespace相关的比较&写两种操作原子能力参数。不过,这个在nvme协议里面也是optional的,没有特别具体的定义,nvme盘基本不支持这个特性。

  • NABSN/NABO/NABSPF:这三个参数定义的是Namespace级别的原子写操作边界,在nvme协议规范中也是Optional的。

如下图示例,黄色或者蓝色的4个格子是一个边界大小NABSN/NABSPF,原子写操作要符合规则的定义,不能夸边界原子写操作。NABSN/NABSPF要大于等于NAWUN/NAWPF,且NABO小于等于NABSN/NABSPF,用一个对比关系式:NABSN/NABSPF>=(NAWUN/NAWPF & NABO).

但也需要注意,如果控制器AWUN/AWUPF/ACWU限制为0,即使出现跨边界的写,在控制器级别也是可以完成原子写操作,可以不用管NABSN/NABSPF这些namespace的边界约束。

2.应用场景

在数据库应用场景中,对数据一致性有很高的要求。比如在MySQL InnoDB场景,page size是16KB,数据校验也是16KB。但是盘通常是block size是4KB,导致在某些场景(比如掉电场景)无法保证16KB原子写落盘,出现partial write问题。为了解决这个问题,MySQL会在脏数据下刷到文件时,会先复制到double write buffer。然后double write buffer分2次在写入共享表空间,最后通过fsync刷新到硬盘。

double write buffer带来的负面影响就是会有额外的开销,在MySQL官网也是推荐采用O_Direct的方式降低double write buffer的影响。在DirectIO模式下,可以把数据以DMA的形式写入SSD中,避免了buffering IO相关的脏数据问题,降低延迟抖动的影响。

支持Direct IO写入的数据库类型主要有:

  • Oracle

  • SAP HANA

  • MySQL (InnoDB storage engine)

  • RocksDB

  • PostgreSQL

  • Teradata

基于MySQL数据库Direct IO模式应用场景,如果要使用硬件的原子写能力,要经过文件系统、block层、驱动层,才能闯关成功。

闯关第一步:文件系统

此时,文件系统Direct IO模式可以绕过文件系统的缓存,直接写入,文件系统不会有太多的影响,会通过BIO提交IO到Block层。比如ext4文件系统中,通过ext4_direct_IO下发到块设备中。

闯关第二步:Block块设备层

在block块设备层,可能会出现IO merge合并和IO Split拆分的情况。如果要原子写的效果,在Block层就不能发生IO拆分或者合并的情况。

在linux内核中,可以查询merge是否已开启:

cat /sys/class/block/device-name/queue/nomerges

This enables the user to disable the lookup logic involved with IO merging requests in the block layer. By default (0) all merges are enabled. When set to 1 only simple one-hit merges will be tried. When set to 2 no merge algorithms will be tried (including one-hit or more complex tree/hash lookups).

闯关第三步:NVME驱动层

这部分对IO没有merge,主要是获取nvme盘硬件的原子写能力,然后通过块设备层接口对块设备相关的原子写能力进行设置。

精彩推荐:

  • YMTC X3 NAND 232L 终露真容,全球领先

  • 芯片级解密YMTC NAND Xtacking 3.0技术

  • Backblaze 2022 Q3 硬盘故障质量报告解读

  • 漫谈云数据中心的前世今生

  • 多维度深入剖析QLC SSD硬件延迟的来源

  • 漫谈固态硬盘SSD全生命周期的质量管理

  • 汽车存储SSD面临的挑战与机遇

  • 超大规模云数据中心对存储的诉求有哪些?

  • SSD写放大的优化策略要统一标准了吗?

  • “后Optane时代”的替代存储方案有哪些?

  • 浅析PCIe链路LTSSM状态机

  • 浅析Relaxed Ordering对PCIe系统稳定性的影响

  • 实战篇|浅析MPS对PCIe系统稳定性的影响

  • 浅析PCI配置空间

  • 浅析PCIe系统性能

  • PLC SSD虽来但远,QLC SSD火力全开

  • 最全电脑固态硬盘SSD入门级白皮书

  • 存储随笔《NVMe专题》大合集及PDF版正式发布!

  • 加权循环仲裁WRR特性对NVME SSD性能有什么影响?

  • Linux NVMe Driver学习笔记之9: nvme_reset_work压轴大戏

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习笔记】pytest接口自动化测试框架入门(pytest+yaml)

pytest接口自动化测试框架入门&#xff08;pytestyaml&#xff09; 文章目录自动化测试需要包含的内容pytest的安装使用pytest默认的测试用例的规则和基础使用:pytest测试用例的运行方式pytest执行测试用例的顺序分组执行pytest跳过测试用例pytest框架前后置处理解&#xff08;…

智能指针循环引用——你真的懂了吗?

相信不少同学都在面试中都被问到过c智能指针的问题&#xff0c;接踵而至的必定是循环引用了&#xff0c;而我每次的答案都是一招鲜&#xff1a;因为它们都在互相等待对方先释放&#xff0c;所以造成内存泄漏。面试官很满意&#xff0c;我也很满意。 但是为啥要等到对方先释放&…

STM8开发实例-ADC

ADC 1、ADC介绍 ADC 是任何现代微控制器中非常重要的外设。 它用于读取传感器的模拟输出、检测电压电平等。 例如,我们可以使用 ADC 读取 LM35 温度传感器。 传感器的电压输出与温度成正比,因此我们可以使用电压信息来反算温度。 下图是STM8s的ADC外设框图: 在使用 ADC 之…

猿如意|初识CSDN的开发者工具合集

前言&#xff1a; CSDN网站其实不仅仅有博客&#xff0c;虽然整个网站是基于博客开始的&#xff0c;但无疑博客是整个网站的魂。 那么&#xff0c;现在的CSDN还有第二个和第三个魂&#xff0c;就是云计算服务和猿如意了。 猿如意好像是CSDN5 6月份推出的&#xff0c;具体时间…

CSC7715 同步整流

CSC7715是一款用于开关电源的高效率同步整流控制IC。其具备较高的集成度&#xff0c;在有效的提升开关电源的转换效率的同时&#xff0c;减少了外围元器件的应用。CSC7715可用于DCM/QR开关电源系统。该电路内置45V的功率管&#xff0c;在系统中替代次级肖特基管,并提高整个系统…

Typora+PicGo+阿里云OSS

配置Typora 文章目录配置Typora阿里云1&#xff09;网页搜索阿里云OSS2&#xff09;注册账号3&#xff09;点击立刻开通a) 点击“产品价格”b) 初次付费c) 交钱以免造成后续无法访问d&#xff09;进入管理控制台e) 创建钥匙PicGo1&#xff09;下载安装2&#xff09;设置选择显示…

Pandas1.5.2 学习心得

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、pandas是什么&#xff1f; 二、安装 1.pip install pandas 2.Series(系列&#xff09; 可以通过索引标签获取和设置值 总结 前言 提示&#xff1a;以下是…

深度学习笔记

动手深度学习v2 引言 机器学习中的关键组件 无论什么类型的机器学习&#xff0c;都需要以下组件&#xff1a; 学习的数据转换数据的模型目标函数&#xff0c;量化模型的有效性调整模型参数以优化目标函数的算法 数据 大多时候遵循独立同分布&#xff08;指随机过程中&…

Java容器源码重点回顾——LinkedList

1. 概述 public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.SerializableLinkedList是实现了List和Deque接口的双端链表。LinkedList的底层数据结构是链表&#xff0c;不支持随机读取&a…

java TCP接收数据

查看本文 你需要先了解 TCP发送数据 如果没有了解过 可以查看我的文章 java TCP发送数据 然后 我们创建一个包 包下创建两个类 sendOut 客户端类 参考代码如下 import java.io.IOException; import java.io.OutputStream; import java.net.Socket;public class sendOut {publ…

13-Java方法

目录 1.方法的基本用法 1.1.什么是方法 1.2.方法定义语法 1.3.方法调用的执行过程 1.4.实参和形参的关系 1.5.方法的返回值 2.方法重载 2.1.方法重载定义 2.2.代码示例 3.方法递归 3.1.方法递归定义 3.2.方法递归使用条件 3.3.递归与非递归优劣比较 3.4.递归执行…

磷脂PEG衍生物Biotin-PEG-DSPE,生物素PEG磷脂,CAS:385437-57-0

英文名称&#xff1a;Biotin-PEG-DSPE、DSPE-PEG-Biotin 中文名称&#xff1a;生物素-聚乙二醇-磷脂 Item no&#xff1a;X-GF-0068-10k Classification&#xff1a;Biotin PEG DSPE PEG CAS&#xff1a;385437-57-0 MV&#xff1a;可定制&#xff0c;2000、1000、3400、1…

241. 楼兰图腾——树状数组

在完成了分配任务之后&#xff0c;西部 314 来到了楼兰古城的西部。 相传很久以前这片土地上(比楼兰古城还早)生活着两个部落&#xff0c;一个部落崇拜尖刀(V)&#xff0c;一个部落崇拜铁锹(∧)&#xff0c;他们分别用 V 和 ∧ 的形状来代表各自部落的图腾。 西部 314 在楼兰…

xv6 makefile详解

文章目录makefile语法格式生成qemu可执行文件生成kernel可执行文件生成kernel下的OBJSkernel.ldbuild OBJS_KCSANbuild initcode生成一个fs.img文件系统mkfs用户程序的编译配置工具makefile语法格式 makefile就是一个深搜的过程&#xff0c;最上面的语句是顶级目标&#xff0c…

python-函数、文件、异常、模块

目录 函数 返回值 函数传参 位置参数 关键字传参 缺省参数 不定长参数 匿名函数 文件操作 open 函数 异常 模块 导入模块 函数 返回值 return语句[表达式]退出函数&#xff0c;选择性地向调用方返回一个表达式。不带参数值的return语句返回None #定义函数 def a…

Ubuntu系统装机流程(显卡驱动、cuda、cudnn、搜狗输入法、anaconda、pycharm)

整体流程一、安装Ubuntu18.04系统二、安装显卡驱动三、安装Cuda四、安装Cudnn五、安装搜狗输入法六、安装Anaconda七、安装Pycharm社区版一、安装Ubuntu18.04系统 &#xff08;1&#xff09;实现用软碟通做好一个装有Ubuntu18.04的系统盘。 &#xff08;2&#xff09;打开电脑…

Jenkins自动发布到Docker部署服务器把Jar包打包成镜像并启动容器

《jenkins自动化发布到服务器并自动运行》 第1种方法&#xff1a;使用外部Jar包完成自动化部署&#xff08;简单方便&#xff09;&#xff0c;正式环境更新jar包时&#xff0c;备份一下旧的的jar包即可。 修改jenkins项目配置 Pre Steps 构建前清除旧的jar包&#xff0c;然后…

计算机网络原理第2章 物理层

目录 2.1 物理层的基本概念 2.2.1 数据通信系统的模型 2.2.2 有关信号的几个基本概念 1.通信 2.调制 3.编码 2.2.3 信道的极限容量 1.信道能够通过的频率范围&#xff08;奈氏准则&#xff09; 2. 信噪比&#xff08;香农公式&#xff09; 3.奈氏准则与香农公式的比…

Linux操作系统CentOS7安装mysql5.7.x

一、下载mysql5.7.x安装包 &#x1f308; MySQL官方下载&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html 注意&#xff0c;需要在Windows上解压之后&#xff0c;会有两个压缩包&#xff0c;将其中一个上传 二、将mysql5.7.x安装包上传到Linux服务器 使用 Xftp 上传…

NeurIPS 2022 Spotlight | SNAKE:首个同时进行隐式重建和三维特征点提取的方法

原文链接&#xff1a;https://www.techbeat.net/article-info?id4361 作者&#xff1a;钟程亮 3D特征点检测在物体识别、场景重建等任务中有着重要作用。然而由于点云数据采样的稀疏性&#xff0c;从中检测出3D特征点是一项很有挑战性的任务。虽然原始点云的获取方式有很多种&…