Trim命令

Trim命令（ATA命令集中称为TRIM，SCSI命令集（英语：SCSI command）中称为UNMAP），它使操作系统能通知固态硬盘（SSD）哪些数据块已不再考虑使用，可以被内部擦除。 Trim命令几乎是与SSD同时推出的。这是因为SSD的底层操作方式与传统机械硬盘有着显著不同，若操作系统沿用传统方法处理诸如删除和格式化等操作，会导致SSD的写入性能发生下降。Trim（意为修整、修剪、裁剪）使SSD能更有效地完成垃圾收集的工作，而不用牺牲对存储块的写入速度。 尽管在引入Trim命令前，有些工具（比如“Reset”命令）已经可以将驱动器“重置”为空状态，但这些操作会删除驱动器上的所有数据，因而无法用于持续性优化。许多SSD拥有厂商自己的后台垃圾收集机制，这些工具和Trim命令互相独立，使不支持Trim命令的操作系统能完成与之类似的工作，却依然存在写入放大的现象，往往也会导致存储块寿命过早地衰减。 因为许多文件系统以标记数据块为“未使用”来处理删除操作，而非真正“清空”数据，因此存储介质（传统硬盘、SSD）通常不知道哪个扇区/页是正在使用，哪些可被认作空闲空间，这与重写（rewrite）操作不同，删除操作不涉及对数据所在扇区/页的物理写入。SSD等存储介质通常不负责管理文件系统（例如未使用的数据块/扇区表），也无法获知哪些数据块/扇区已经可用。这使反删除（英语：Undelete）工具能通过更底层的方法，从传统的机械硬盘上恢复文件，因为尽管操作系统报告用户文件已被“删除”，并腾出了存储空间。但在存储介质上，文件所在的扇区只有在下一次写入时，旧数据才会被覆盖，从存储介质的角度看，“删除”操作更接近于“重写”。对于机械磁盘来说，这与写入空扇区没有区别，但因为SSD最底层的一些特性，与将数据写入空页相比，重写会有显著的开销，从而潜在地削弱写入性能。 SSD在闪存单元中通常以4-16kB为一组来存储数据（称之为页），每128-512kB的页组合成更大的一组（称之为块或数据块）。举例来说，某一品牌的SSD将4kB的数据组合成一页，其数据块大小是512kB，每一数据块包含128个页。NAND闪存单元只能在处于空状态时写入。如果它们包含数据，则执行写操作前必须擦除其内容。SSD一次写入最少一页，但由于硬件限制，擦除数据时将会抹除整个数据块；因此将数据写入到SSD上的空页时非常快，而写入已有数据的页就会明显变慢。这是因为页被再次写入前需要擦除数据，但SSD只能擦除一整个数据块，随后把数据块中的其他数据以改写的方式（按“读取、擦除、修改、写入”的方式）完成；整个块的内容会先存储在缓存中，然后在SSD中擦除整个块，再将改写的页写入到缓存的块，最后再将更新的块写入闪存介质。这种现象也称写入放大。 TRIM命令使SSD可以从操作系统处得知哪一部分数据将永远不会被访问。对于删除操作，操作系统会将整个数据块标记为可用于新数据，然后向SSD发送TRIM命令。SSD完成这一操作后，在新的数据写入这一页时，SSD将刷新整个块的数据，而不保留块中其他页原本的内容，从而缓解写入放大现象（写入次数更少），并提供更高的写入吞吐量（不需要执行读取、擦除、修改），还能显著延长驱动器寿命。 不同的SSD实现的方式有所不同，因此性能可能也有所差异。 TRIM命令通知SSD从LBA(Logical Block Addressing)区域上标记为无效，从逻辑层上对该区域进行读取将不会返回有效数据。从物理层面看，数据仍可能短时间驻留在闪存内部，SSD彻底完成垃圾回收的工作之后，恢复数据几乎是不可能的；这不同于机械硬盘中被删除的数据可能被数据恢复。 Trim仅在支持它的操作系统上有效。下表列出了各个重要的操作系统支持该命令的首个版本。此外，在TRIM命令添加到ATA标准之前设计的旧款固态驱动器需要更新固件（如果有）才能支持Trim，否则将忽略这个新命令。 截至2017年1月 (2017-01)[update]，大多数基于硬件的RAID技术未实现TRIM命令的支持。但是，软件实现的RAID通常提供了TRIM支持。 Windows： Windows 10为SSD RAID卷在配置一个RAID卷时通过“优化驱动器”选项提供了TRIM支持。 Mac OS： macOS RAID驱动程序不支持TRIM。自Mac OS X 10.7至macOS 10.12.x的所有版本均是如此。 对于使用第三方SoftRAID®应用程序的RAID（0,1,4,5和10）卷支持TRIM，包括使用非苹果品牌SSD设备的TRIM支持。 （注：非苹果品牌的SSD设备必须使用终端命令“sudo trimforce enable”来启动TRIM） Linux： 2011年1月以后的Linux内核中dmraid（英语：Device mapper）的发布版本已实现BIOS辅助的“假硬件RAID”支持，并且现在通行来自RAID阵列上的文件系统的任何TRIM请求。 不同于dmraid，Linux的常规目的软件RAID系统mdraid（英语：Mdadm）有实验性的基于批处理（而不是在文件删除时实时）的TRIM，当系统配置为定期在RAID 1阵列上的文件系统上运行mdtrim实用工具（包括ext3等没有原生TRIM支持的文件系统）。在Linux的稍晚版本（例如Red Hat Enterprise Linux 6.5和beyond）中 mdraid支持实时、实际传递TRIM命令，而不是作为一个批处理作业。 但请注意，紅帽公司建议不要在大多数RAID技术的SSD上使用软件RAID 1、4、5和6，因为大多数RAID管理实用工具（例如Linux的mdadm）在初始化期间会在设备上写入所有块以确保校验和（或RAID 1/10情况下的驱动器到驱动器验证）运作正常，而这导致SSD认为除备用区域以外的所有块都在使用中，从而显著降低性能。 另一方面，Red Hat推荐在SSD上为LVM RAID使用RAID 1或RAID 10，因为这些级别支持TRIM（在Linux术语中称为"discard"），并且LVM实用工具在创建时不会写入所有块到RAID 1或RAID 10卷。 在2010年3月的一小段时间内，用户被误导相信英特尔快速存储技术（RST）9.6驱动程序支持RAID卷上的TRIM，但后来英特尔澄清说，TRIM支持AHCI模式和RAID模式的BIOS设置，但不支持RAID卷的驱动器。 截至2012年8月，英特尔确认，使用快速存储技术（RST）11.2驱动程序的7系列芯片组支持微软Windows 7中的RAID 0的TRIM。虽然英特尔没有确认支持6系列芯片组，RAID 0卷上的TRIM已展示为在Z68、P67和X79芯片组上可用，通过由硬件发烧友修改的RAID选项ROM（英语：Option ROM）。据推测，缺乏对6系列芯片组的官方支持是由于验证成本或企图鼓励消费者升级，而不是出于技术原因。 在使用X79芯片组的主板上需要修改选项ROM的例外是制造商添加了ROM开关；这需要RST和RST-E ROM存在于BIOS/UEFI内。这允许使用RST ROM而不是RST-E ROM，从而允许TRIM工作。英特尔指出，使用与ROM版本相同的驱动程序可以实现最佳性能。例如，如果BIOS/UEFI具有11.0.0.0m选项ROM，则应使用11.x版本的驱动程序。 在使用不支持自动TRIM的文件系统时，某些实用工具可以手动发送Trim命令。通常它们将确定哪些块为空闲，然后将该列表以一系列的Trim命令传递给驱动器。这些实用程序可从各制造商（例如Intel、G.Skill）或作为一般实用程序（例如Linux的hdparm（英语：hdparm）自v9.17起，或者如上所述的mdtrim）。 TRIM命令规范已被标准化为AT Attachment接口标准的一部分，由国际信息技术标准委员会（英语：International Committee for Information Technology Standards）（INCITS）的技术委员会T13所领导。 TRIM根据DATA SET MANAGEMENT（数据集管理）命令（操作码06h）实现，ACS-2规范草案。ATA标准被并行（IDE、PATA）和串口（SATA）ATA硬件所支持。 原版ATA TRIM命令的缺点是它被定义为不可排队命令，因此不能轻松地与正常的、排队的读和写操作混合。SATA 3.1引入了一个排队的TRIM命令来纠正这一点。 ATA IDENTIFY DEVICE命令返回的SATA Words 69和169定义了不同类型的TRIM。 非确定性TRIM：TRIM后每个对邏輯區塊位址（LBA）的读取命令可能返回不同的数据。 确定性TRIM（DRAT）：TRIM后对LBA的所有读取命令都返回相同的数据，或者变为确定的。 TRIM（RZAT）后确定性读零：TRIM后对LBA的所有读取命令都将返回零。 在SATA字105中有额外信息，描述驱动器可以在每个数据集管理命令（DATA SET MANAGEMENT）支持最多多少个512字节的数据块。通常此值默认为8（或4kB），但许多驱动器将其减少到1，以满足微软Windows硬件要求对TRIM的部分——该命令完成时间不应超过20 ms或者8 ms × （LBA范围项的数量），且两者中的较大者应始终小于600 ms。 各LBA范围被称为一个LBA范围条目，并由八个字节表示。 LBA由LBA范围条目的前6个字节表示，范围长度是由剩下两个字节表示的一个从零开始的计数器。如果两个字节组成的范围长度为零，那么LBA范围条目应视作填充而丢弃。这意味着以512字节为TRIM块范围支持的设备，该最大值为64个32 MB，也就是2 GB。如果设备在SATA字105处设为8，则它应该能在单个TRIM（数据集管理）命令中修整16GB。 SCSI提供了UNMAP命令（TRIM的完全模拟），以及带有UNMAP标志集的WRITE SAME命令（10和16个变量）。 多媒體記憶卡和SD ERASE（CMD38）命令提供了与ATA TRIM命令类似的功能，但它要求擦除的块用0或1重写。eMMC 4.5进一步定义了一个“discard”（丢弃）子操作，从而更紧密的配合ATA TRIM，因为丢弃的块的内容可以被认为是不确定的（即“不在乎”的）。 在使用加密时，TRIM命令的相关信息将揭露哪些块正在使用，哪些没有。 TRIM命令的原始版本已被T13小组委员会（英语：T13 subcommittee）定义为非排队命令，因此执行不当可能造成大量的错误执行。例如，如果它在操作系统的每个删除命令后发出，该命令的非排队性质将要求驱动程序先等待所有未完成的命令完成，然后发出TRIM命令，最后再继续正常命令。TRIM可能需要很长时间才能完成，这取决于SSD中的固件，并还可能触发垃圾收集周期。[來源請求]这种缺陷可以用定期执行批量TRIM的解决方案来最小化，而不是在每次文件删除时执行修剪，批量处理任务可以在系统利用率最小时调度。这项TRIM缺点已在Serial ATA修订3.1中解决，其中引入了排队的TRIM命令。 排队的TRIM命令已在多款设备中涉及严重的数据损坏，最显著的是Micron的M500、Crucial的M500、以及Samsung 8**系列。在2015年7月1日，Linux操作系统在这些设备上的数据损坏已得到确认。 这些设备已被列入Linux内核中libata-core.c的黑名单，从而强制发送非排队的TRIM命令到这些设备，而不是排队的TRIM命令： Micron M500，所有固件版本（仅MU07之前有此问题，但Linux尚未跟进） Crucial M500，所有固件版本，包括工厂重新认证的SSD（仅MU07之前有此问题，但Linux尚未跟进） Micron M510，固件版本MU01 Micron M550，固件版本MU01 Crucial M550，固件版本MU01 Crucial MX100，固件版本MU01 三星SSD 8**系列，所有固件版本 此文件也已将SuperSSpeed S238列入常规TRIM的黑名单，因为发出TRIM会导致错误的块丢失数据。 libata-core.c还有一个列出子系统维护者已确认正确实现DRAT和RZAT标志（flags）的SSD，这不同于许多忽略它们的驱动器。白名单中的设备如下： Crucial多款SSD Intel多款SSD（不包括Intel SSD 510） Micron多款SSD 三星多款SSD 希捷多款SSD 数据残留（英语：Data remanence） Intel High Performance Solid State Drive - Advantages of TRIM. Intel.com. Intel. 2010-09-14 [2012-02-21]. （原始内容存档于2016-03-06）.  Shimpi, Anand Lal. The SSD Anthology. AnandTech.com: 4. 2009-03-18 [2010-06-19]. （原始内容存档于2012-06-30）.  Shimpi, Anand Lal. (2009-03-18). p. 10. Shimpi, Anand Lal. (2009-03-18). p. 11. Kingston SSDNow V Plus 100 Review. AnandTech.com. Anand Lal Shimpi. 2010-11-11 [2010-12-10]. （原始内容存档于2010-12-13）.  Savill, John. I heard solid-state disks (SSDs) suffer from a decline in write performance as they're used. Why?. WindowsITPro. 2009-04-21 [2010-06-19]. （原始内容存档于2012-06-30）.  Shimpi, Anand Lal. (2009-03-18). p. 7. Savill, John. What is the TRIM function for solid-state disks (SSDs) and why is it important?. WindowsITPro. 2009-04-22 [2010-06-19]. （原始内容存档于2013-02-09）.  Malventano, Allyn. Long-term performance analysis of Intel Mainstream SSDs. PC Perspective. 13 February 2009 [10 February 2012]. （原始内容存档于2012-02-28）.  Shimpi, Anand Lal. (2009-03-18). p. 5. Shimpi, Anand Lal. (2009-03-18). p. 8. Write Amplification: Intel's Secret Sauce. ExtremeTech.com. [2010-11-06]. （原始内容存档于2010-11-15）.  Inside the X25-M Controller: Wear Leveling, Write Amplification Control. TomsHardware.com. 2008-09-08 [2010-11-06].  Too TRIM? When SSD Data Recovery is Impossible. TechGage. TechGage. 2010-03-05 [2010-04-16]. （原始内容存档于2012-06-30）.  Preliminary TRIM support. [2017-03-16]. （原始内容存档于2020-07-06）.  FreeBSD 8.1-RELEASE Release Notes: Disks and Storage. [2010-09-01]. （原始内容存档于2010-07-27）.  Add kernel side support for BIO_DELETE/TRIM on UFS. [2011-02-01].  Added ZFS TRIM support which is enabled by default.. [2013-06-05]. （原始内容存档于2018-02-17）.  FreeBSD 9.2-RELEASE Announcement. [2013-10-04]. （原始内容存档于2013-10-03）.  Base revision 242323 – Add basic BIO_DELETE support to GEOM RAID class for all RAID levels. [2012-10-30]. （原始内容存档于2013-05-20）.  TRIM support in NetBSD. 2012-10-19 [2017-03-16]. （原始内容存档于2016-03-05）.  Block device changes in Linux 2.6.28. [2017-03-16]. （原始内容存档于2018-06-12）.  Storage changes in Linux 2.6.33. Kernel Newbies. [2010-09-01]. （原始内容存档于2012-06-30）.  HOWTO: Configure Ext4 to Enable TRIM Support for SSDs on Ubuntu and Other Distributions - Forked by Nicolay. [2017-03-16]. （原始内容存档于2016-12-25）.  Btrfs improvements in Linux 2.6.32. [2017-03-16]. （原始内容存档于2012-09-16）.  JFS Filesystem can now handle trim. [2012-03-28]. （原始内容存档于2012-10-04）.  Filesystem changes in Linux 3.0. [2017-03-16]. （原始内容存档于2016-03-30）.  Freemyer, Greg. OpenSUSE forum - SSD detection when creating first time fstab. 2010 [2017-03-16]. （原始内容存档于2013-01-27）.  How to enable TRIM?. Ask Ubuntu. [11 November 2015]. （原始内容存档于2017-03-22）.  SDB:SSD discard (trim) support. [2017-03-16]. （原始内容存档于2012-11-14）.  Mac OS X 10.6.8 Brings TRIM Support for Apple SSDs, Graphics Improvements. 2012-02-24 [2017-03-16]. （原始内容存档于2017-03-18）.  Macbook Pros ship with active SSD TRIM support. 2011-03-04 [2017-03-16]. （原始内容存档于2012-06-30）.  Yosemite kills third-party SSD support. [2017-03-16]. （原始内容存档于2014-12-02）.  Chameleon SSD Optimizer. [2020-09-27]. （原始内容存档于2014-12-02）.  Cindori Software. [2017-03-16]. （原始内容存档于2016-03-06）.  Lee Hutchinson. Latest OS X update allows you to enable TRIM for third-party SSDs. Ars Technica. Condé Nast. Jun 30, 2015 [2015-07-01]. （原始内容存档于2015-07-01）.  Support and Q&A for Solid-State Drives. 微软开发者网络. 2009-05-09 [2010-08-12]. （原始内容存档于2012-06-30）.  Windows 7 Enhancements for Solid-State Drives (PDF). Microsoft downloads. Microsoft Corporation. 2008-11-12 [2009-07-08]. （原始内容存档 (PDF)于2012-06-30）.  Geoff Gasior (2012) （页面存档备份，存于互联网档案馆） OCZ's RevoDrive 3 X2 240GB solid-state drive Coles, Olin. SSD Benchmark Tests: SATA IDE vs AHCI Mode - AHCI vs IDE Final Thoughts. BenchmarkReviews. 15 April 2010 [20 August 2013]. （原始内容存档于2013-12-03）.  SATA TRIM support in OpenSolaris. 2010-07-29 [2017-03-16]. （原始内容存档于2012-06-30）.  Android 4.3 Update Brings TRIM to All Nexus Devices. 2013-07-29 [2013-07-30]. （原始内容存档于2013-08-01）.  "Android 4.3 announced, rolling out to Nexus devices today" （页面存档备份，存于互联网档案馆）.The Verge. 24 July 2013. Retrieved 24 July 2013. Possible to get SSD TRIM (discard) working on ext4 + LVM + software RAID in Linux? - Server Fault. [2011-11-29]. （原始内容存档于2011-12-20）.  Cyberax/mdtrim - GitHub. [2011-11-29]. （原始内容存档于2018-06-10）.  Red Hat Enterprise Linux 6 Storage Administration Guide, Chapter 21. Solid-State Disk Deployment Guidelines. [2016-03-09]. （原始内容存档于2015-12-26）.  Red Hat Enterprise Linux 7 Storage Administration Guide. 2015-11-11 [2016-02-29].  Is there TRIM support for RAID configurations?. Intel. 2010-03-26 [2010-11-06]. （原始内容存档于2010-09-15）.  Intel Confirms RAID0 TRIM Support on 7-Series Chipsets. 2012-08-19 [2013-01-14]. （原始内容存档于2012-10-22）.  RAID0 trim and SRT seems possible on 6-series and 5-Series. 2012-11-18 [2013-01-14]. （原始内容存档于2013-01-18）.  TRIM & RAID-0 SSD Arrays Work With Intel 6-Series Motherboards Too. 2012-11-28 [2013-01-14]. （原始内容存档于2013-01-09）.  Intel Brings TRIM to RAID-0 SSD Arrays on 7-Series Motherboards, We Test It. 2012-08-16 [2013-01-14]. （原始内容存档于2013-01-13）.  Anand Lal Shimpi. Intel Brings TRIM to RAID-0 SSD Arrays on 7-Series Motherboards, We Test It. [2017-03-16]. （原始内容存档于2017-05-06）.  Doug Crowthers. TRIM Command Confirmed With RAID 0 on Intel 7 Series. Tom's Hardware.  Intel SSD Optimizer White Paper (PDF). Intel Corporation. [2010-01-23]. （原始内容 (PDF)存档于2010-06-02）.  wiper.exe for Falcon Series. XtremeSystems. [2010-01-23]. （原始内容存档于2012-06-30）.  hdparm-9.17 released, with experimental trim/wiper scripts for SSDs. [2010-08-14]. （原始内容存档于2010-06-09）.  hdparm project page. sourceforge.net. [2010-08-14]. （原始内容存档于2010-08-21）.  Data Set Management Commands Proposal for ATA8-ACS2 (revision 6). INCITS T13. INCITS（英语：INCITS）. 2007-12-12 [2009-07-08]. （原始内容存档于2010-06-13）.  T13 documents referring to TRIM. INCITS T13. INCITS（英语：INCITS）. [2009-07-08]. （原始内容存档于2010-05-26）.  T13 ATA8 Draft Spec 1697-D (PDF). INCITS（英语：INCITS）. 2010-06-23 [2010-08-14]. （原始内容存档 (PDF)于2011-03-22）.  SATA 6Gb/s. Serial ATA International Organization. [2012-09-26]. （原始内容存档于2013-02-02）.  Device.Storage Requirements (Windows). [2016-02-29]. （原始内容存档于2016-03-14）.  T13/2161-D: Information technology - ATA/ATAPI Command Set - 3 (ACS-3) (PDF). [2016-02-29]. （原始内容存档 (PDF)于2016-04-05）.  Note for SCSI UNMAP support in FreeBSD mailing list. [2017-03-16]. （原始内容存档于2012-06-30）.  Milan Broz's blog: TRIM & dm-crypt ... problems?. Milan Broz. [2014-10-01]. （原始内容存档于2011-12-30）.  存档副本. [2017-03-16]. （原始内容存档于2013-02-02）.  SATA 3.1 spec brings swap standard, improved TRIM. The Tech Report. [2017-03-16]. （原始内容存档于2016-05-20）.  Bug 71371 – [PATCH]Crucial M500, broken "queued TRIM" support. [2017-03-16]. （原始内容存档于2017-10-11）.  Bug #1449005 "trim does not work with Samsung 840 EVO after firm..." : Bugs : fstrim package : Ubuntu. [2017-03-16]. （原始内容存档于2017-01-18）.  torvalds. linux/libata-core.c at e64f638483a21105c7ce330d543fa1f1c35b5bc7 · torvalds/linux · GitHub. GitHub. [2017-03-16]. （原始内容存档于2016-07-07）.  torvalds. linux/libata-core.c at master · torvalds/linux · GitHub. GitHub. [2017-03-16]. （原始内容存档于2017-02-27）.  torvalds. libata: force disable trim for SuperSSpeed S238 · torvalds/linux@cda57b1. GitHub. [2017-03-16]. （原始内容存档于2018-12-26）.  [1/3] libata: Whitelist SSDs that are known to properly return zeroes after TRIM. [2017-03-16]. （原始内容存档于2016-03-04）.  From write() down to flash chips – An explanation on how the TRIM command lets SSDs erase data not used by the filesystem TRIM Command White Paper（页面存档备份，存于互联网档案馆） – A white paper explaining the command's purpose and actions Fusion-io Patent "Apparatus, system, and method for redundant write caching"（页面存档备份，存于互联网档案馆）