SMR描述

SMR(Shingled Magnetic Recording)叠瓦式磁记录盘是一种采用新型磁存储技术的高容量磁盘。SMR盘将盘片上的数据磁道部分重叠,就像屋顶上的瓦片一样,这种技术被称为叠瓦式磁记录技术。该技术在制造工艺方面的变动非常微小,但却可以大幅提高磁盘存储密度。

在数据量飞速增长的当今世界,SMR技术可以有效降低单位容量的磁盘存储成本,是未来高密度磁盘存储技术的发展潮流。

尽管SMR盘的读行为和普通磁盘相同,但它的写行为有了巨大的变化:不再支持随机写和原地更新写。这是由于SMR盘上新写入的磁道会覆盖与之重叠的所有磁道,从而摧毁其上的数据。换言之,相较传统磁盘而言,SMR盘不再支持随机写,只能进行顺序追加写。写入方式的限制给欲使用SMR盘的存储系统带来了巨大的挑战。

SMR盘的技术原理

大数据时代的数据量呈指数级增长,预计每两年就会翻一番。硬盘作为一种经济高效的存储介质,在当今的存储数字世界中依然起着中流砥柱的作用。

硬盘驱动器的存储面密度(每单位面积存储的位数)受到物理定律的限制,目前硬盘使用的PMR垂直磁记录(Perpendicular Magnetic Recording)技术即将达到其存储密度极限。业界迫切希望引入新的技术来克服限制,继续稳步提升容量。

SMR盘是领先的下一代磁盘技术。 SMR盘在制造工艺方面的变动非常微小,因为它保持现有磁头和介质技术不变,它通过将磁道像屋顶上的瓦片那样重叠在一起来实现其存储面密度的增长。

具体来说,硬盘盘片被划分为同心圆状的磁道,磁道与磁道之间具有一定间隔,起到保护作用。硬盘的磁头位于盘片记录介质的上方,包含用于写入的写磁头和用于读取的读磁头,二者是独立的部件。在磁盘上想要写入数据,需要写磁头施加较强的磁场来改变盘片上的记录,这就进一步要求写磁头足够大以产生所需的写入磁场强度。因此,如果磁道没有任何重叠,磁盘上每英寸能容纳的磁道数量由写磁头的宽度所决定。

传统硬盘与SMR盘磁记录方式的对比示意图

叠瓦式写入则利用了磁盘读取所需要的磁场强度低于写入所需要的磁场强度的事实。换言之,磁盘读取所需的磁道宽度可以小于写入所需的轨道宽度,读磁头的宽度可以小于写磁头宽度。SMR盘上数据的写入是通过部分重叠前一条磁道写入的,同时留出了足够的空间给较窄的读磁头读取前一条磁道的数据。叠瓦式写入的结果就是留给读用的窄磁道,以及最后用于写入的较宽的写磁道,写入将会覆盖若干个读磁道的宽度。

和传统磁盘相比,SMR盘通过叠瓦式写入在相同的面积内容纳了更多的磁道,从而提高了存储面密度,进而降低了磁盘单位存储容量的成本。

SMR磁盘将磁道划分为若干个带(Band),即由连续磁道所构成的可连续写入区域,每个区域构成一个需要顺序写入的基本单元。Band是SMR盘上的物理概念,其对应的逻辑概念是“区域”(zone),是上层软件所能看到的SMR盘的顺序写区域。一个zone的大小通常在256 MB量级。由于SMR盘仍然确保可以从磁道的未重叠部分读取数据,zone内的数据读取依旧可以随机进行。

SMR盘在生产制造时就划分好了分区,通过在zone之间出留出较大的间隔来标识zone的起始位置。此外,硬盘厂商在SMR盘上一小块区域内,通过采用传统硬盘非重叠的磁道组织方式,牺牲了部分存储密度以换取在这些zone内随机写入的能力。这部分zone被称为“传统区”(Conventional Zone),为上层应用的随机写提供了一个落脚点。

在传统硬盘上,存储在磁盘上的用户数据由文件系统来管理,文件系统假定磁盘提供的块接口中,块是独立可更新的单元。但是,由于叠瓦式写入导致随机写和原地更新写不再受支持,SMR盘需要全新的数据管理解决方案。寻找一种方法来高效地存储、检索和管理SMR盘中这些大块顺序写区域中的数据,而不会导致太多空间浪费是非常具有挑战性的。

SMR盘的分类

SMR盘采用叠瓦式记录通过将一个zone内的磁道按序部分重叠,获得了更高的存储面密度、更大的磁盘容量、更低的单位容量价格。在获得这一好处的同时,SMR盘也对上层应用提出了一些限制,包括SMR盘在zone内只能顺序写,不支持随机写,SMR盘的空间回收以一个Zone的大小(例如256MB)为粒度。

SMR盘对写入的约束可在硬件侧由硬盘本身来管理,亦可在主机侧由软件来进行。前者被称为“驱动器自管理的SMR盘”(Drive Managed SMR disk),以下简称DM SMR盘。后者则将SMR内部的组织结构通过新增接口向上层软件暴露。

制定SCSI协议的T10国际组织和制定ATA协议的T13国际组织都针对SMR盘对SCSI和ATA协议进行了相应的拓展。

  • T10组织引入了ZBC(Zoned Block Commands),定义了SMR盘相关的术语和行为,成为SAS接口SMR盘所必须遵守的规范。

  • T13组织引入了ZAC(Zoned-device ATA Commands),与ZBC类似,是SATA接口SMR盘所必须遵守的标准。

ZBC和ZAC标准将SMR盘抽象成为一组Zone的集合,其中的Zone由一段连续的LBA构成。ZBC与ZAC标准中均定义了SMR盘中可以存在的三种类型的Zone:

  • 传统Zone(Conventional Zone简写为C-Zone)

  • 首选顺序写入Zone(Sequential-Preferred Zone简写为SP-Zone)

  • 强制顺序写入Zone(Sequential-Required Zone简写为SR-Zone)

对C-Zone而言,和传统硬盘一样,它具有完全的随机写能力,对其中写入IO的逻辑块地址(LBA)的顺序不做任何限制。C-Zone所占的大小一般不超过SMR盘容量的1%。

SP-Zone也不对写入顺序做强制性限制,但是,和C-Zone不同的是,SP-Zone位于SMR盘的顺序写入区域,最适合顺序写。SP-Zone引入了写指针(Write Pointer,以下简称WP)的概念,该指针等于该Zone内的最大LBA,应用程序应该首选在SP-Zone内的写指针处写入数据。尽管该硬盘本身在也能够处理非写指针处的写入(随机写),但这是有代价的,会引起后续的数据迁移、垃圾回收等。

对于每个Zone,SR-Zone也暴露了写指针WP的位置,但硬盘设备将拒绝写入除写指针指向的LBA以外的任何位置,也就是SR-Zone内必须以写指针当前所在位置为起点,进行顺序追加写。

当SR-Zone写满之后,则需通过Reset Write Pointer操作将该WP重置到该Zone开头,即清空该Zone以回收空间,从头开始写入。SP-Zone和SR-Zone被统称为写指针区(Write Pointer Zone)。

如前所述,如果一块硬盘采用了叠瓦式写入技术,但是对外不暴露Zone和WP,由硬盘固件本身来管理写入的顺序性约束,我们称之为Drive Managed SMR。

如果一块硬盘采用了叠瓦式写入技术,对外暴露了Zone和WP,并且所包含的Zone类型仅仅含有C-Zone和SR-Zone,那么我们称之为Host Managed SMR(主机管理的SMR盘)。

如果一块硬盘采用了叠瓦式写入技术,对外也暴露了Zone和WP,并且所包含的Zone类型由C-Zone和SP-Zone组成,那么我们称之为Host Aware SMR(主机感知的SMR盘)。

HA SMR盘可以视为DM SMR盘和HM SMR盘的折中类型。

上表总结了三种SMR盘的特点。虽然DM SMR盘采用和传统硬盘相同的接口,在内部实现一个叠瓦转换层STL(Shingle Translation Layer)对外隐藏了顺序写入的限制,但它也有一个主要缺点:

在某些带有随机写的工作负载下,DM SMR盘内顺序写入区域需要进行数据迁移、垃圾回收等背景操作,DM SMR盘的性能可能受到不可预测的影响,性能波动巨大。

相比之下,HM SMR盘不将自身伪装为传统磁盘,而是根据ZBC/ZAC标准对外暴露了zone和WP的抽象结构,允许上层软件来完全管理SMR盘的顺序写入约束,对不符合顺序写规则的IO请求则直接返错。通过向上暴露新接口,HM SMR盘的IO行为完全受软件控制,因而其性能是可控的,能最大化发挥SMR盘的优势。

但劣势是上层的软件必须进行修改才能使用HM SMR盘。HA SMR盘提供了和HM SMR盘一样的新接口,但是当其收到不符合顺序写原则的IO是,HA SMR盘将允许其写入而非报错,具有一定的灵活性。

无论采用哪一种类型的SMR盘,我们都需要将上层应用的IO行为特点与SMR盘顺序写的内在特点相匹配,否则就无法使SMR盘工作在最佳状态。

SMR解析的更多相关文章

  1. PYTHON解析XML的多种方式效率对比实测

    在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜索后发现,目前应用比较广泛,且效率相对较高的E ...

  2. 横向对比分析Python解析XML的四种方式

    横向对比分析Python解析XML的四种方式 在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜 ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  4. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  5. Html Agility Pack 解析Html

    Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面  用Fir ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  8. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  9. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

随机推荐

  1. 1001. [BJOI2006]狼抓兔子【最小割】

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  2. virtualbox+vagrant学习-3-Vagrant Share-6-Custom Provider

    ⚠️警告:只是一个高级主题! 这个话题与开发vagrant插件有关.如果你对此不感兴趣,或者你刚刚开始使用vagrant,跳过这一页是安全的. 如果你正在开发一个 custom Vagrant pro ...

  3. 多线程之Thread类

    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...

  4. orcale字段

    ---数据类型 /* 1  数字 number [小数,整数] number(5,3)表示总共5个数字,小数点后3个,最大值99.999 number(5) 表示整数  最大值99999 2  字符 ...

  5. [NOI2001]炮兵阵地 【状压DP】

    #\(\color{red}{\mathcal{Description}}\) \(Link\) 司令部的将军们打算在\(N \times M\)的网格地图上部署他们的炮兵部队.一个\(N \time ...

  6. NYOJ 252 01串 普通dp

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=252 分析: dp[2][0]=2;//表示长度为2的满足要求的且以0结尾的串个数 ...

  7. oracle错误分析:ora-04063:view view_test has errors

    百度了一下,有一个大佬是这样说的: 在PL/SQL中查询数据库视图时总是报告“ora-04063:view view_test has errors”的错误: Oracle视图非常强大的功能之一在于其 ...

  8. Robosup3D平台搭建

    目录 1.安装simspark及默认播放器 安装依赖库/下载simspark源码 编译并安装simspark 编译并安装rcssmonitor3d播放器 2.安装Roboviz播放器 安装java 安 ...

  9. Linux—echo命令

    echo命令的功能是在屏幕上显示一段文字,起到一个提示作用,常用在脚本语言和批处理文件中来在标准输出或者文件中显示一行文本或者字符串. 命令格式:echo [选项] 字符串 选项参数: -n:不在最后 ...

  10. 解决kali linux使用metasploit报错办法

    curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit- ...