ssd固态硬盘的Trim命令是什么?

许多用户朋友在购买SSD的时候都会特别强调Trim,不过Trim是什么?做什么用的?
 
什么是Trim?
 
Trim指令也叫disable delete notify(禁用删除通知),是微软联合各大ssd厂商所开发的一项技术,属于ata8-acs2规范的技术指令,早在winhec 2008大会上就已正式发布,并宣布加入到windows 7当中。Win 7发现系统内存固态硬盘,就会做针对性的调整和优化,比如禁用磁盘碎片整理、ReadyBoost(闪存加速)、SuperFetch(超级预取)。
 
Trim的作用是什么?
 
对于传统机械硬盘来说,在Windows下对磁盘上的文件进行删除操作时,系统只会在该文件所在的磁道上作标记,将该磁道标记为没有数据记录,而不是真正意义上的“删除”;而当下次在磁道上进行写入操作时,系统才会将该磁道上原有的数据清空再进行写入,这样的操作方式效率上会比较低(优点是数据恢复成为可能)。
 
而在 Windows7 系统上,对支持Trim指令的SSD启动 Trim命令后,这个过程变得简单许多。这时在对SSD进行数据删除的操作,NTFS文件系统是不向SSD发送删除指令的,固态硬盘发出新的Trim操作 指令,告诉它相关页面可以安全擦除。固态硬盘得到这一指示后,就不会急于执行擦除操作,而是等到再次有写入操作的时候再执行,因为这时相关区域已经可以重新使用了,就不用花时间去擦除原本的数据。其速度比直接读写硬盘去标记删除区域要快得多,既提升了读写效率又大大减轻了固态硬盘的损耗。
 
在Windows 7里Trim命令请求不仅限于删除操作,还与分区和卷级别命令、文件系统命令、系统还原功能完全整合。
 
TRIM 如何开启关闭?
 
其实 Windows 7默认状态下Trim指令是开启的,如果想查询目前的Trim指令状态,我们可以在管理员权限下,进入命令提示符界面,输入“fsutil behavior QUERY DisableDeleteNotify”,之后会得到相关查询状态的反馈。在这里,提示为“DisableDeleteNotify = 0”即Trim指令已启用;提示为“DisableDeleteNotify = 1”即为Trim指令未启用。
 
并不是操作系统提供Trim指令支持,所有SSD都能享受到Trim技术所带来的好处,这还需要固态硬盘的固件支持才能实现。基本上现在流行的固态硬盘主控芯片厂商已经都提供了支持Trim的固件,不过也有厂商开发出不依赖操作系统的垃圾回收技术,通过回收不再使用的闪存区块加入负载平衡算法,防止固态硬盘在长期使用后速度下滑,并延长闪存使用寿命,过程完全在固态硬盘内部完成。
 

附:技术细节
 
机械硬盘可以直接覆写旧的区域,但是当用到NAND闪存上就行不通了,当全部闪存被写满一遍后,没有空余 (从未写过)的块可以被使用的情况下,速度就下来了。
 
在固态硬盘闪存内,数据存储一般是以page(页)为最小单位存储的(典型的为4KB),而128个page组成了一个Block(块),数据可以以 4KB大小的页来读取和写入,但却只能以512KB(128 page)的块大小来删除。当读取数据或者写入到一个没有被使用过的page上时,固态硬盘的速度是很快的,但是覆写数据的话,就比较复杂了,需要许多步骤来完成。步骤可见下图:
 
 
当SSD的所有空闲块都被使用后,再有写入操作,它只能覆写数据到之前被操作系统标记为删除的区域。这也是速度下降的开始:
 
要覆写一个4KB 页的文件系统,首先要把整个512KB 块复制进缓存里。然后,在缓存里删除这个4KB页,替换成新的数据。接下来,清空整个闪存内的这个512KB区域,并从缓存里把新的数据写回去。如果需要同时覆写很多的块 ”例如是一系列小文件随机写入操作或者只是简单的写入一个大文件到SSD“。你会让你的SSD缓存快速过载,然后你的写入速度明显下降,早期缓存小的SSD甚至会延迟接近1秒,所以SSD厂商开始在主控制器上加入大的外置缓存,在一定程度上解决了随机写入慢的问题,但是却不能解决SSD在覆写时速度下降的问题。
 
Trim命令到底做了什么?
A: 简而言之,这个问题是因为操作系统和文件系统不能和SSD的主控进行删除文件的交流造成的,如果有之前没清除干净的数据,所有写入的页的操作都要先清除块再改写,将严重影响写入速度。有2种途径来修复这个问题:
 
第一个就是定期运行垃圾回收程序(GC)(这个操作有点像整理,在SSD空闲时,全盘扫描有效的页并合并整理起来变为一个包含全部有效页的块,而那些无效的页和块都将被完全的清除)。
 
第二个更好的途径就是当数据删除时候让系统告诉SSD数据没了,让SSD立即擦掉那些数据占用的块,这就是Trim命令做的事。
 
当一个文件在支持Trim的系统里被删除后,操作系统会发个命令给SSD,让他知道这个数据所在的这个page可以直接被写入,等于把控制权从操作系统变为了SSD主控制器固件。SSD一样会复制整个包含删除数据的块到缓存,清空块并写入有效数据的页回去,区别是这样等于把这个延迟时间从覆写数据的那个时间提前到了删除数据的时候(这个时候你对速度不敏感,如果你删除了很大很大的数据,可以去观察硬盘灯在你删除之后几秒内狂闪),自然就会显得SSD的速度 回来了,因为你写入的时候有可用的空块。barefoot主控的SSD,有个程序叫做Wiper,这个程序会扫描全盘,清除掉全盘过去被删除的页(和 Trim的操作一样,手动),让SSD像新买来的一样。事实上这个程序在清除全盘已删除的数据之前,预先做了有效数据备份。由于程序独特算法和主控对应,别家的主控不支持,因为不算是真正的Trim命令(不是由系统发出的命令),所以可以支持XP之类的老系统。
 
所以我们可以说,Trim保证速度不下跌的真正秘密是:把将来要做的事提前做掉了。 但是这件事迟早要做,所以基本不会影响SSD原有的写入次数(寿命)。
 
对于GC来说,由于是移动,整理,合并了旧页到新块,删除了无效的旧块,会牺牲点写入次数(寿命)。但是GC支持RAID,也算有利有弊吧。

[转帖]ssd固态硬盘的Trim命令是什么?的更多相关文章

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

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

  2. SSD固态硬盘使用注意事项

    SSD固态硬盘的结构和运行方式不同于传统硬盘,在购买以后强烈建议进行一些设置以达到最优的运行效能,延长SSD的使用寿命.以下第一部分是一些可以在网上找到的关于SSD硬盘相关的注意事项,已经介绍很多,这 ...

  3. 【转】如何使用分区助手完美迁移系统到SSD固态硬盘?

    自从SSD固态硬盘出世以来,一直都被持续关注着,SSD的性能优势让无数用户起了将操作系统迁移到SSD的心思,直接后果就是让无数机械硬盘为止黯然退场,很多软件都可以做到系统迁移,然而,被完美迁移的系统却 ...

  4. 笔记本光驱位置装SSD固态硬盘(亲自试验)

    我的笔记本买的早了,2010年的联想Z460,速度有点慢,本来想换台电脑,想想还是算了,没有太大必要.固态硬盘便宜了,于是在原来的光驱位置装了一个256G的SSD固态硬盘,现在的性能能达到刚买来时的1 ...

  5. 基于SSD固态硬盘的数据库性能优化

    基于SSD固态硬盘的数据库性能优化 2010-11-08 00:0051cto佚名   关键字:固态硬盘 数据库管理 SSD 企业软件热点文章 Java内存结构与模型结构分析 Oracle触发器的语法 ...

  6. 6款实用的硬盘、SSD固态硬盘、U盘、储存卡磁盘性能测试工具

    一.检测工具名称汇总 HDTune ATTO Disk Benchmark CrystalDiskMark AS SSD Benchmark Parkdale CrystalDiskInfo 二.各项 ...

  7. 新买的 SSD 固态硬盘竟然是坏的,我傻了啊!

    1. 今天早上上班路上在网上下单了一个 1 T 的 SSD 固态硬盘,晚上 7 点半左右送到手后迫不及待想替换掉原来的机械硬盘,在这个新硬盘上装系统,玩起来. 2. 拆开包装,先用移动硬盘接口检查下新 ...

  8. 如何把win10系统迁移到SSD固态硬盘

    https://jingyan.baidu.com/article/5d368d1ec59ac43f60c05733.html 我之前将两个盘都已经固定在笔记本内,迁移完之后无论怎么改还是从原来的机械 ...

  9. Linux下测试SSD固态硬盘写入速度

    最近买了一个256GB的SSD固态硬盘,想测试一下写入速度,于是如下操作. 部分代码: gettimeofday(&start, NULL); int fd = open("test ...

随机推荐

  1. matplotlib 代码风格

    当查看 matplotlib 官方文档和示例时,你会发现不同的编码风格和使用模式.这些风格是完全有效的,各有其优缺点. 几乎所有的例子都可以转换成另一种风格,以实现相同的结果.当然,需要注意的是不要把 ...

  2. C++多线程,互斥,同步

    同步和互斥 当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源.例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数.当然,在把整个文件调入内存之前, ...

  3. PKUWC2019题解

    这里其实只放一下题面和一些提示,大家评一评有几道题可做 题面全部蒯自xzz的博客 Day 1 T1 题面 一个有向图,每一条边可能存在也可能不存在,求拓扑序列数量的期望乘\(2^m\) 没有重边自环, ...

  4. Codeforces 912 D. Fishes (贪心、bfs)

    题目链接:Fishes 题意: 有一个n×m的鱼塘,有一张r×r的渔网,现在往池塘里面放k条鱼(每个格子只能放一条鱼), 现在撒网的地方是随机的(必须在池塘内),问能捕的鱼的期望值最大是多少? 题解: ...

  5. 模拟UNIX(linux)文件系统

    操作系统课程设计 一.实验内容 1. 题目:模拟UNIX(linux)文件系统                [问题描述] 在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的 模拟U ...

  6. buglly热更新集成遇到的那些坑

    首先说明使用热修复的意义,那就是你的apk包发出去了,万一发生了紧急异常需要修复,怎么办?这时候再发包上市场审核,也是有点慢了吧?而且错误发生在apk中,无法通过后台接口修复,这时候你就需要一个强大的 ...

  7. UnityEditor扩展-Shader浏览器

    1. 用途 用于浏览项目所有Shader被使用的情况 2. 界面说明 Ignore Directory:添加不搜索的文件夹,不添加默认搜索全部 Find按钮:开始搜索 Used Shaders:已被使 ...

  8. oracle存储过程 关于update的动态SQL-工作心得

    本随笔文章,由个人博客(鸟不拉屎)转移至博客园 发布时间: 2018 年 12 月 20 日 原地址:https://niaobulashi.com/archives/oracle-procedure ...

  9. python中web应用与mysql数据库交互

    7使用数据库 具体使用python的DB-API,这一章里介绍如何编写代码与MYSQL数据库技术交互,这里使用一个通用的数据库API,名为DB-API. 7.1基于数据库的web应用 之前我们把日志数 ...

  10. Linux常规命令总结

    Linux常规命令总结,仅供参考: 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显 ...