原文 http://codecapsule.com/2014/02/12/coding-for-ssds-part-4-advanced-functionalities-and-internal-parallelism/

在这个部分。我将简要的介绍一些SSD的主要功能,如TRIM和预留空间。我相同会介绍SSD中不同等级的内部并行。

5. 高级功能

5.1 TRIM

让我们如果一个程序向SSD全部的逻辑块地址都写入文件,这个SSD当然会被装满。然后删除这些文件。文件系统会报告全部的地方都是空的。虽然硬盘实际上还是满的,由于SSD主控没法知道逻辑数据是什么时候被主机删掉的。SSD主控仅仅会在这些逻辑块地址被复写的时候才知道这些是空暇空间。此时,垃圾回收进程将会擦除与这些文件相关的块。为进来的写操作提供空的页。其结果就是。擦除操作并不是在知道保存有无用数据之后立马运行,而是被延迟了。这将严重影响性能。

还有一个值得关心的是,既然SDD主控不知道这些页保存有已删除的文件,垃圾回收机制仍然会为了损耗均衡而移动这些页上的数据。

这添加了写入放大。并毫无意义地影响了来自主机的前台工作负载。

延迟擦除问题的一个解决方法是TRIM命令。这个命令由操作系统发送。通知SSD控制器逻辑空间中的这些页不会再使用了。有了这个信息,垃圾回收进程就会知道自己不必再移动这些页,并能够在不论什么须要的时间擦除它们。TRIM命令仅仅会在当SSD、操作系统和文件系统都支持的时候才起作用。

TRIM命令的维基百科页面列出了支持TRIM的操作系统和文件系统[16]

Linux下,ATA
TRIM的支持是在2.6.33版本号增加的。虽然ext2和ext3 文件系统不支持TRIM,ext4 和XFS以及其它的一些是支持的。

在Mac OS 10.6.8下。HFS+支持TRIM操作。Windows 7则仅仅支持使用SATA接口的SSD的TRIM。使用PCI-Express的则不支持。

如今大部分的硬盘都支持TRIM,确实。同意垃圾回收尽早的工作显著地提升了将来的性能。

因此强烈建议使用支持TRIM的SSD,并确保操作系统和文件系统级都启用了TRIM功能。

5.2 预留空间

预留空间仅仅是简单的使物理块比逻辑块多,即为主控保留一定比例的。用户不可见的物理块。大多专业级SSD生产商已经包含了一些预留空间,一般是7~25%[13]。用户能够简单的通过创建比最大物理容量小的逻辑容量分区来创建很多其它的预留空间。比如。你能够在100G的硬盘上创建一个90G的分区,而把剩下的10G作为预留空间。即使预留空间在操作系统级是不可见的。但SSD主控仍然是能够看见的。

生产商提供预留空间的主要原因是为了对付NAND闪存单元固有的兽兽门限制。不可见的预留空间的块将无缝的替换可见空间上的已耗损殆尽的块。

AnandTech有一篇有意思的文章显示出预留空间对SSD寿命和性能的影响[34]。在他们研究的硬盘上,结果显示出仅通过保证25%的预留空间(把全部的预留空间加在一起)就能够使性能极大地提升。在Percona的一篇文章中有另外一个有意思的结果,在他们測试了一块Intel
320 SSD,显示出当硬盘逐渐填满时。写入吞吐量将随之下降[38]

这里是我的实验中发生的事情。

垃圾回收是使用空暇时间在后台擦除页上不再使用的数据的。

但既然擦除操作比写入操作的延迟更久,或者说擦除要的时间比写入长。在持续的重随机写入工作负载下的SSD将会在垃圾回收有机会擦除之前用尽全部的空块。此时。FTL将不能跟上前台的随机写入工作负载,而垃圾回收进程将必须在写入命令进来的同一时候擦除块。

这就是在基准測试中SSD性能下降的厉害,而SSD显得性能超差的时候,例如以下图7所看到的。因此,预留空间能够吸收高吞吐量写入负载,起到缓冲的作用,为垃圾回收跟上写入操作并又一次開始擦除无用块留够时间。

预留空间须要多少大部分基于SSD使用环境的工作负载,和其须要的承受的写入操作的量。作为參考,持续随机写入的工作负载比較推荐使用大约25%的预留空间[34]。假设工作负载不是非常重,大概10~15%预计够大的了。

预留空间对损耗均衡和性能表现是实用的

SSD能够简单地通过格式化时设置比最大物理容量小的逻辑容量来启动预留空间。

余下的不被用户所见的空间仍会被SSD主控所用。预留空间帮助损耗均衡机制来对付NAND闪存单元的寿命限制。对于写入不是非常重的工作负载,10~15%的预留空间足够了。

对于持续的随机写入工作负载,保持25%的预留空间将会提升性能。预留空间将会扮演NAND闪存块的缓冲区的角色。帮助垃圾回收进程吸收写入峰值。

从此,相同能够推导出,预留空间甚至可能为不支持TRIM命令的环境提供更大的性能提升——注意我仅仅是在这进行个如果,我仍然在寻找材料来支持这个观点。如果仅仅有75%的硬盘空间可被操作系统使用。余下的25%留作预留空间。

由于SSD控制器能够看见整个硬盘,虽然在某一时刻仅仅有75%的物理NAND闪存被使用,但100%的块都在已使用、已废弃、已擦除三种状态中交替转换。这表示余下的25%物理闪存将能够安全的觉得没有保存有数据,由于其并没有被映射到不论什么逻辑块地址上。因此,即使不支持TRIM。垃圾回收进程也能够提前擦除这些预留空间中块。

5.3 安全擦除

一些SSD主控提供ATA安全擦除功能,其作用是当硬盘处于意料之外的状态时恢复其性能。这个命令擦除全部用户写入的数据并重置FTL映射表,但这显然不能克服P/E循环有限造成的物理限制。虽然其功能上看上去很有前途。但须要每一个生产商争取的实现它。Wei等人2011年在他们关于安全擦除命令的review中显示,在他们研究的超过12个型号SSD中,仅仅有8个提供了ATA安全擦除功能。而在这8个硬盘中,三个都有各种bug[11]

对于性能的影响是非常重要的。而且在安全方面更加重要,但我不想展开说。这里有几个Stack Overflow上的讨论能够解释关于怎样可靠地删除SSD中的数据的细节。

5.4 原生命令队列(NCQ)

原生命令队列(NCQ)是SATA的一个功能,其同意SSD接受来自主机的多个命令,使SSD能够使用内部并行同一时候完毕这些命令[3]。除了降低由于硬盘造成的延迟外,一些新的硬盘相同使用NCQ来应对来自主机的延迟。比如NCQ能够优先传入的命令来确保当主机CPU忙的时候硬盘总是有命令处理。

5.5 断电保护

不管是在家还是在数据中心,断电都是有可能发生的。一些生产商在他们的SSD结构中设置有超级电容,这个电容设计为存有足够提交总线中全部I/O请求所需的能量以防掉电。问题在于并不是全部的SSD生产商都为他们的硬盘设置超级电容或者某种掉电保护,而有超级电容的不总是在说明书中提及。

然后,和安全擦除命令一样。断电保护机制的实现是否正确,而且是否确实可以在掉电时避免数据损坏是搞不清楚的。

Zheng等人2013年的研究中測试了15个SSD。但没有透露品牌[72]

他们给硬盘各种各样的电源故障,发现測试的15个SSD中有13个终于丢失数据或者大规模的数据损坏。在另外一篇Luke
Kenneth Casson Leighton写的关于电源故障的文章中显示出。測试的4个硬盘有3个终于都在不对的状态,剩下的一个没有问题(是Intel的硬盘)[73] 。

SSD还是一个很年轻的技术,而且我相信这些电源故障下造成数据损坏的阻力将会在接下来的产品中克服。然而如今,在数据中心配置不间断电源(UPS)可能还是应该做的。而且和不论什么其它存储解决方式一样。常常备份敏感数据。

6.SSD中的内部并行

6.1 总线带宽限制

由于物理限制的存在,异步NAND闪存I/O总线无法提供32-40 MB/s以上的带宽[5]。SSD生产商提升性能的唯一办法是以某种方法让他们的硬盘中的多个存储芯片能够并行或者交错。[2]的2.2节中有一个比較好的关于交错的解释。

通过组合SSD内全部层次的内部并行。不同芯片中的多个块能够作为一个叫clustered block(直译是集群块,但我感觉用比較亲切。本译文中全部的簇都是指它)东西同一时候訪问。

我不打算解释关于SSD内部并行的全部细节,因此我仅仅简述一下并行的层次和簇。

获取很多其它关于这个话题的信息。以及SSD内部并行的概括,这里的两篇论文是非常好的開始[2,
3]

此外。一些高级命令如copybackinter-plane transfer[5]中有阐述。

内部并行

在SSD内部。数个层次的并行同意一次将数个块写入到不同的NAND闪存芯片中,这些块称为簇。

6.2 并行的多级别

下边的图6展示了NAND闪存芯片的内部。其组织为一种分级的结构。

这些级别包含通道、封装、芯片、面、块和页。如[3]中揭示的,这些不同的层通过下边的方法提供并行

  • 通道级并行 闪存主控和闪存封装之间的通信通过数个通道。

    这些通道能够独立或者同一时候訪问。

    每一个独立通道有数个封装共享。

  • 封装级并行 一个通道中的不同封装能够独立訪问。交错能够使命令同一时候在同一个通道中的不同封装中执行。
  • 芯片级并行 一个封装包括两个或者很多其它的芯片,芯片能够并行独立訪问。

    注:芯片通常也被称为核心(chips are also called “dies”)

  • 面级并行 一个芯片包括两个或者很多其它的面。

    同样的操作(读、写或者擦除)能够在芯片中多个面上同一时候执行。面包括了块,块包括了页。面也包括了寄存器(小RAM缓存),其用在面级操作上。

图6: NAND 闪存封装

6.3 簇

译注: 本节标题原文是“clustered blocks”,词典上没有这个词(词组?)。Google了也没有发现合适的翻译。其直译是“集群的块”或者“成簇的块”。由于这个“clustered blocks”和“簇”的英文“Data cluster”比較像,特性上也相似(都是若干存储单位的集合),决定将这个“clustered blocks”在本文中译为“簇”。但这个簇与机械硬盘的簇不是同样的东西,请读者注意分辨。假设有更为合适或者正规的翻译请告诉我。

从多个芯片中訪问到的多个块被称为一个簇[2]。这个做法比較像RAID系统中的striping[1,
5]

一次訪问的逻辑块地址被分到不同SSD闪存封装中的不同芯片上。这归功于FTL的映射算法,而且这与这些地址是否连续无关。切割块同意同一时候使用多个通道来整合其带宽。并相同可以并行运行多个读、写和擦除操作。

这即表示I/O操作按簇大小对齐来确保SSD中多个级别的内部并行所提供的性能可以最大程度的利用。

为SSD编程(4)——高级功能和内部并行的更多相关文章

  1. SQL编程之高级查询(子查询)以及注意事项

    SQL编程之高级查询(子查询)以及注意事项   1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命 ...

  2. C#高级功能(四)扩展方法和索引

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但 ...

  3. SLAM+语音机器人DIY系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  4. vim 高级功能

    本文章原创首发于公众号:编程三分钟 ,文末二维码. 文本编辑.跳转.删除.复制.替换这些操作用vim确实是快:但是好像仅仅是这样根本不能说服我vim超过鼠标的地方. 花点时间弄熟这些,除了炫技意外,主 ...

  5. Elasticsearch系列---几个高级功能

    概要 本篇主要介绍一下搜索模板.映射模板.高亮搜索和地理位置的简单玩法. 标准搜索模板 搜索模板search tempalte高级功能之一,可以将我们的一些搜索进行模板化,使用现有模板时传入指定的参数 ...

  6. Xen之初体验:XenMotion、 StorageMotion、Site Recovery、Power Management 各种新、高级功能免费

    Xenserver 的新版本6.2现在已经全面开源,省掉了原有的序列号,也能免费体验曾经标题中的付费高级功能. 安装镜像:http://downloadns.citrix.com.edgesuite. ...

  7. MVC5 Entity Framework学习之Entity Framework高级功能(转)

    在之前的文章中,你已经学习了如何实现每个层次结构一个表继承.本节中你将学习使用Entity Framework Code First来开发ASP.NET web应用程序时可以利用的高级功能. 在本节中 ...

  8. C#高级功能(三)Action、Func,Tuple

    Action和Func泛型委托实际上就是一个.NET Framework预定义的委托,3.5引入的特性.基本涵盖了所有常用的委托,所以一般不用用户重新声明. Action系列泛型委托,是没有返回参数的 ...

  9. C#高级功能(二)LINQ 和Enumerable类

    介绍LINQ之前先介绍一下枚举器 Iterator:枚举器如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的.我们将以创建一个简单化的 ...

随机推荐

  1. Git-如何将已存在的项目提交到git

    1.首先在码云或者github上创建一个不带README.md的项目,然后复制远程库的地址(下面以码云为例): 2.进入本地已存在的项目目录:house  touch README.md //新建说明 ...

  2. []HAOI2008] 硬币购物 解题报告 ( 完全背包+容斥原理)

    题目链接:https://www.luogu.org/problemnew/show/P1450 题目描述: 题解: 如果去掉限制的话,这就是一个完全背包. 我们可以考虑先去掉限制,把这个完全背包做出 ...

  3. Spring MVC 核心架构图

    架构图对应的DispatcherServlet核心代码如下: //前端控制器分派方法 protected void doDispatch(HttpServletRequest request, Htt ...

  4. cuda thrust函数首次调用耗费时间比后续调用长原因

    lazy context initialisation. stackoverflow

  5. [HAOI2016]找相同字符 广义后缀自动机_统计出现次数

    题目描述:给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 输入输出格式输入格式:两行,两个字符串 s1,s2,长度分别为n ...

  6. APUE 学习笔记 —— 文件I/O

    本章节主要讲了 Linux 系统下的关于文件I/O操作的几个函数:open.read.write.lseek.close 的使用和需要注意的一些细节.接着,又介绍了多进程见如何共享文件.下面开始知识点 ...

  7. win10如何设置开机自动启动热点WIFI?

    1.编写脚本文件(先新建txt文件,编写代码内容netsh wlan start hostednetwork,最后重命名成HotSpot.bat):文件名称:HotSpot.bat,代码内容: net ...

  8. 洛谷 P2014 选课 && caioj 1108 树形动态规划(TreeDP)3:选课

    这里的先后关系可以看成节点和父亲的关系 在树里面,没有父亲肯定就没有节点 所以我们可以先修的看作父亲,后修的看作节点 所以这是一颗树 这题和上一道题比较相似 都是求树上最大点权和问题 但这道题是多叉树 ...

  9. Python 生成器 Generator 和迭代器 Iterator

    #最近一周刚开始接触python,基本的语法,和使用特性和Java差别还是蛮大的. 今天接触到Python的迭代器和生成器有点不是很明白,所以搜索了先关资料整理了一些自己的理解和心得 简述(Profi ...

  10. 坑爹的RockSaw和坑爹的windows7

    坑爹的RockSaw和坑爹的windows7 http://chen4w.iteye.com/blog/1153433