什么是TRIM与GC?他们是怎样让SSD保持高速的

2017-7-6 15:43  |  作者:Strike   |  关键字:SSD,TRIM,GC,超能课堂

分享到      

SSD的写入方式决定了它越用越慢的特性,数据写入的越多性能就会越差,不过现在的SSD都支持TRIM指令与GC垃圾回收功能,在他们俩的守护下可以确保你的SSD里面即使写入得再多东西也不会轻易掉速。

本文约2152字,需4分钟阅读

使用闪存为存储载体的SSD的读写过程与传统的HDD有着本质上的不同,特别是在写入方面,HDD是可以直接对存储在磁碟上的数据进行覆盖写入的,SSD并不能这样,闪存需要先擦除原来的数据再把新的数据写进去,不能直接覆写数据使得SSD多了擦除的操作,而写入单位(Page)与擦除单位(Block)的不统一又让SSD不停地在各个Block区块之间折腾,SSD用久了需要擦除的区块就会越多,性能自然也会变慢,然而现在的SSD基本都不会这样,为什么会这样呢?


浦科特的SSD就以True Speed不掉速

SSD的写入方式决定了它越用越慢的特性,数据写入的越多性能就会越差,不过现在的SSD都支持TRIM指令与GC垃圾回收功能,在他们俩的守护下可以确保你的SSD里面即使写入得再多东西也不会轻易掉速。

TRIM指令

TRIM指令是微软提出的,但是SSD厂商也有支持与不支持TRIM之分,所以还是跟SSD有一定关系。

TRIM是基于SATA控制器的一个指令,一旦有文件删除或者分区格式化,操作系统就会发TRIM指令给SSD主控告诉它某处的数据已经删除了,SSD因而知道哪些数据是能动的哪些不能动的,之后就可以进行清空操作以恢复性能了。不过这个过程不是马上就完成的,TRIM命令是即时发送到SSD主控中的,但是什么时候开始清空数据是主控算法的事。


对TRIM指令的支持是现在SSD主控必备的

之所以有这么一个沟通过程还是跟SSD与HDD的读写方式不同有关,首先操作系统的删除数据并不是真正把数据清空了,只是加了删除的标签而已(就像摘了门牌号,房子还在一样)就是说真实的数据还在,不过普通的操作访问不到了,但是一些专用的数据恢复软件可以把这些数据再找回来。

HDD机械硬盘是可以直接在原有数据上直接覆盖,但是SSD不行,必须要清空原有数据才能写入新数据,而系统并非真正删除数据的特性会对SSD的性能造成影响,TRIM指令的存在使得SSD能够紧紧跟随OS的操作意图,擦除已删除的无用数据以恢复SSD性能。

 

上图很好的说明了TRIM指令是如何工作的,前三步分别是空数据、写数据和删除部分数据,在此之后TRIM指令就会通知SSD主控可以清空红色区域的无用数据,之后SSD的性能就可以恢复如初了。

TRIM支持与否依赖于操作系统、磁盘控制器驱动以及SSD主控,Win7、Windows 2008 R2、Linux 2.6.33、MAC OS 10.6.6、Free BSD 8.2及之后的系统都支持TRIM或者类似指令,Intel 9.6.0.1014及之后的磁盘驱动都可以支持,不过TRIM指令并不强制要求AHCI,IDE模式也可以,只是SSD几乎没谁用IDE模式吧。


微软PPT中专门解释过TRIM指令的工作方式和优点

Intel在RST 11.5之后的驱动中提供RAID模式的TRIM指令支持,还有一些厂商用自己的方式解决了RAID模式下的TRIM指令问题。另外,XP系统下是不支持TRIM指令的,不过三星的工具软件也可以让其SSD实现类似TRIM的功能。

浦科特M8Se有着很高的TRIM效率,这可以提高产品的性能稳定性,能让SSD能够保持较长时间的高速运行,还可以抑制写入放大,提高闪存的寿命:

用户可以自行检查TRIM指令开启与否,打开CMD窗口定位到“fsutil behavior set DisableDeleteNotify 0”表示启用TRIM,如果是1就表示禁用状态或者不支持。

GC垃圾回收

垃圾回收(garbage collection,简称GC)是SSD恢复性能的另一大秘籍,这个主要跟厂商所用的主控有关,其意义就跟字面意思一样,通过清理无用的垃圾数据保持SSD性能如新。

它的存在还是跟SSD的特性有关,空盘下SSD写入数据所需时间以ns计,但是擦除数据的过程则以ms计,写入的数据越多,需要擦除的时间也越长,SSD的写入性能就会严重下降,GC机制相当于”腾笼换鸟”,把原本杂乱无章存放的数据整理一遍,然后写入到新的空白区,之前的区块就会进行清除操作以恢复正常性能。


GC的处理过程

由于各种写入、删除操作会在SSD留下杂乱的数据,其中有些是还有用的,有些就是无效的,GC功能启动之后就把有用的数据拷贝到另外的区块,这一步相当于“腾笼”,原来存储数据的区域就会被 清除,恢复空盘水平以准备写入新的数据,这就是“换鸟”了。

上面只是理论操作过程,具体怎么做还有个选择问题,如果在SSD读写数据的同时进行GC操作,这种实时GC(Real Time GC)对主控的性能是个考验,一方面要往空白区写入数据,同时还要照顾无效数据的“拆迁”工作,这么频繁折腾SSD的话估计SSD那有限的读写寿命也支撑不住,实时GC并不可取。

浦科特在2011年的M2P就使用过相当激进的实时GC功能,性能确实不会降低,不过那个时候的闪存还是32nm的MLC,寿命相当有保障,现在无论MLC还是TLC都不够胆这样玩了。

目前的GC大都是在SSD闲置时才开始工作,也就是所谓的“Idle Time GC(闲置GC)”了。厂商会在主控中设定一个条件,比如空白容量达到某种比例才开始GC处理,这样就预先释放了空白空间,如果达到设定条件的上限,那么GC也会停止,这样处理比实时GC更利于延长SSD寿命。

闲置GC也不是完美无缺的,它会带来额外的写入放大,因为在GC处理开始之前,某些整理过的页面(page)可能正在变脏,不过闲置GC增加的写入放大率非常小,OCZ称其SSD的闲置GC只有额外的1%放大率,影响非常小,整体上依然是利大于弊。

现在的SSD大都是利用TRIM和闲置GC相辅相成工作的,当用户删除或者修改文件时,系统就会发送TRIM指令告诉SSD那部分数据可以删掉了,然后SSD在闲置时就会对这部分区域进行GC腾出空白的闪存空间,实时GC功能现在在启用SLC Cache的SSD上会比较明显,毕竟它们要快速的腾出SLC Cache空间给后续的数据,这样才能确保SSD拥有高速的写入。

TRIM指令通知给SSD的可删除数据越多,GC操作需要转移的数据就越少,写入量也会减少,对SSD来说也是延长使用寿命的一种方式。

[转帖]什么是TRIM与GC?他们是怎样让SSD保持高速的的更多相关文章

  1. 关于SSD Trim功能

    TRIM指令是微软联合各大SSD厂商所开发的一项技术,属于ATA8-ACS规范的技术指令.   TRIM是告诉NAND闪存固态存储设备要擦除哪些数据的SATA接口指令.当相关页面的数据可以被覆盖时,操 ...

  2. 如何避免后台IO高负载造成的长时间JVM GC停顿(转)

    译者著:其实本文的中心意思非常简单,没有耐心的读者建议直接拉到最后看结论部分,有兴趣的读者可以详细阅读一下. 原文发表于Linkedin Engineering,作者 Zhenyun Zhuang是L ...

  3. SSD 固态硬盘,Trim指令 ,查看状态、开启、关闭

    一说到SSD 固态硬盘,经常会看到Trim指令这个名词,那什么是Trim?   Trim是什么? 为了解决硬盘降速的问题,微软联合各大SSD厂商开发了一个新技术——Trim.Trim指令也叫disab ...

  4. [转帖]深度: NVMe SSD存储性能有哪些影响因素?

    深度: NVMe SSD存储性能有哪些影响因素? http://www.itpub.net/2019/07/17/2434/ 之前有一个误解 不明白NVME 到底如何在队列深度大的情况下来提高性能, ...

  5. 使用MongoDB和JSP实现一个简单的购物车系统

    目录 1 问题描述  2 解决方案  2.1  实现功能  2.2  最终运行效果图  2.3  系统功能框架示意图  2.4  有关MongoDB简介及系统环境配置  2.5  核心功能代码讲解  ...

  6. Investigating Your RAM Usage

    转载自:http://developer.android.com/intl/zh-cn/tools/debugging/debugging-memory.html Because Android is ...

  7. 【转】花开正当时,十四款120/128GB SSD横向评测

    原文地址:http://www.expreview.com/19604-all.html SSD横评是最具消费指导意义的评测文章,也是各类热门SSD固态硬盘的决斗疆场.SSD评测在行业内已经有不少网站 ...

  8. Ubuntu 针对 SSD 的优化方案

    . . . . . 首先看下 LZ 的分区情况: >$ sudo fdisk -l Disk /dev/sda: bytes heads, sectors/track, cylinders, t ...

  9. hbase 学习(十五)缓存机制以及可以利用SSD作为存储的BucketCache

    下面介绍Hbase的缓存机制: a.HBase在读取时,会以Block为单位进行cache,用来提升读的性能 b.Block可以分类为DataBlock(默认大小64K,存储KV).BloomBloc ...

随机推荐

  1. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  2. linux提权 searchsploit 使用规范

    使用 searchsploit 时,要把整个控制台最大化,这样才能显示完整的漏洞信息. 查看漏洞帮助文件:

  3. Python爬虫之HTTP和HTTPS

    一:HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法,以明文的形式传输,效率高,但是不安全 HTTPS ...

  4. linux bash Shell脚本经典 Fork炸弹演示及命令详解

    Jaromil 在 2002 年设计了最为精简的一个Linux Fork炸弹,整个代码只有13个字符,在 shell 中运行后几秒后系统就会宕机: :(){:|:&};: 这样看起来不是很好理 ...

  5. Discuz x3.2利用阿里云cdn处理https访问亲测教程

    第一步配置cdn和https 1.首先去阿里云.腾讯云.七牛云等申请免费https证书 2.虚拟主机是不能直接支持https的,需要cdn处理后才可以,并且端口是80 3.开启cdn加速处理,(买一个 ...

  6. 自己编写的:centos6.6上编译安装apache2.4+php5.6+mysql5.6【亲自】

    在centos6.6上安装apache2.4+php5.6+mysql5.6 关于wget的安装 将之前装系统的.iso文件挂载到光驱 由于我在/home/jinnan/下建立了一个cdrom文件夹 ...

  7. vue组件--TagsInput

    简介 TagsInput 是一种可编辑的输入框,通过回车或者分号来分割每个标签,用回退键删除上一个标签.用 vue 来实现还是比较简单的. 先看效果图,下面会一步一步实现他. 注:以下代码需要vue- ...

  8. 【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题.    [Unity Shader](三) -- ...

  9. linux下实现压测-html报表生成-控制台参数优化【jmeter】

    jmeter - 单机压测 - 命令行模式-html报表生成-控制台参数优化 一/ 准备工作 1.压力机安装并配置好 jdk 2.调试好程序脚本 再上传到 linux下 3.进入jmeter  bin ...

  10. 第五章 if语句

    5.2条件测试 使用==判断相当: 使用!=判断不相等: 每条if语句的核心都是一个值为Tre或False的表达式,这种表达式被称为条件测试,如果条件测试的值为Ture,则执行紧跟在if语句后面的代码 ...