Trim命令

Trim命令ATA命令集中称为TRIMSCSI命令集中称为UNMAP),它使操作系统能通知固态硬盘(SSD)哪些数据块已不再考虑使用,可以被内部擦除。[1]

Trim命令几乎是与SSD同时推出的。这是因为SSD的底层操作方式与传统机械硬盘有着显著不同,若操作系统沿用传统方法处理诸如删除和格式化等操作,会导致SSD的写入性能发生下降。[2]Trim(意为修整、修剪、裁剪)使SSD能更有效地完成垃圾收集的工作,而不用牺牲对存储块的写入速度。[3]

尽管在引入Trim命令前,有些工具(比如“Reset”命令)已经可以将驱动器“重置”为空状态,但这些操作会删除驱动器上的所有数据,因而无法用于持续性优化。[4]许多SSD拥有厂商自己的后台垃圾收集机制,这些工具和Trim命令互相独立,使不支持Trim命令的操作系统能完成与之类似的工作,却依然存在写入放大的现象,往往也会导致存储块寿命过早地衰减。[5]

快閃記憶體磁碟機特有的問題

因为许多文件系统以标记数据块为“未使用”来处理删除操作,[6][7]而非真正“清空”数据,因此存储介质(传统硬盘、SSD)通常不知道哪个扇区/页是正在使用,哪些可被认作空闲空间,这与重写(rewrite)操作不同,删除操作不涉及对数据所在扇区/页的物理写入。SSD等存储介质通常不负责管理文件系统(例如未使用的数据块/扇区表),也无法获知哪些数据块/扇区已经可用。这使反删除工具能通过更底层的方法,从传统的机械硬盘上恢复文件,[8]因为尽管操作系统报告用户文件已被“删除”,并腾出了存储空间。但在存储介质上,文件所在的扇区只有在下一次写入时,旧数据才会被覆盖,从存储介质的角度看,“删除”操作更接近于“重写”。对于机械磁盘来说,这与写入空扇区没有区别,但因为SSD最底层的一些特性,与将数据写入空页相比,重写会有显著的开销,从而潜在地削弱写入性能。[9]

SSD在闪存单元中通常以4-16kB为一组来存储数据(称之为页),每128-512kB的页组合成更大的一组(称之为块或数据块)。举例来说,某一品牌的SSD将4kB的数据组合成一页,其数据块大小是512kB,每一数据块包含128个页。NAND闪存单元只能在处于空状态时写入。如果它们包含数据,则执行写操作前必须擦除其内容。SSD一次写入最少一页,但由于硬件限制,擦除数据时将会抹除整个数据块;[10]因此将数据写入到SSD上的空页时非常快,而写入已有数据的页就会明显变慢。这是因为页被再次写入前需要擦除数据,但SSD只能擦除一整个数据块,随后把数据块中的其他数据以改写的方式(按“读取、擦除、修改、写入”的方式)完成;[11]整个块的内容会先存储在缓存中,然后在SSD中擦除整个块,再将改写的页写入到缓存的块,最后再将更新的块写入闪存介质。这种现象也称写入放大[12][13]

操作

TRIM命令使SSD可以从操作系统处得知哪一部分数据将永远不会被访问。对于删除操作,操作系统会将整个数据块标记为可用于新数据,然后向SSD发送TRIM命令。SSD完成这一操作后,在新的数据写入这一页时,SSD将刷新整个块的数据,而不保留块中其他页原本的内容,从而缓解写入放大现象(写入次数更少),并提供更高的写入吞吐量(不需要执行读取、擦除、修改),还能显著延长驱动器寿命。

不同的SSD实现的方式有所不同,因此性能可能也有所差异。

TRIM命令通知SSD从LBA(Logical Block Addressing)区域上标记为无效,从逻辑层上对该区域进行读取将不会返回有效数据。从物理层面看,数据仍可能短时间驻留在闪存内部,SSD彻底完成垃圾回收的工作之后,恢复数据几乎是不可能的;[14]这不同于机械硬盘中被删除的数据可能被数据恢复

实现

操作系统支持

Trim仅在支持它的操作系统上有效。下表列出了各个重要的操作系统支持该命令的首个版本。此外,在TRIM命令添加到ATA标准之前设计的旧款固态驱动器需要更新固件(如果有)才能支持Trim,否则将忽略这个新命令。

操作系统 支持始自 备注
DragonFly BSD 2011-052011年5月[15]
FreeBSD 2010-078.1 - 2010年7月[16] 在8.1中的块设备层中添加了支持。文件系统支持在FreeBSD 8.3和FreeBSD 9中添加,随Unix文件系统(UFS)而来。[17]ZFSTrim支持在FreeBSD 9.2中添加。[18][19]FreeBSD 10支持在软件RAID上配置Trim。[20]
NetBSD 2012-102012年10月[21]
Linux 2008-12-252.6.28–2008年12月25日[22] 最初在2.6.28中添加了对FTL NAND闪存设备的discard(丢弃)操作符的支持。对ATA TRIM命令的支持在2.6.33中添加。[23]

并非所有文件系统都能使用trim。可以自动发出修剪请求的文件系统有Ext4[24]Btrfs[25]FATGFS2JFS[26]XFS[27]但是由于性能问题,在受支持SSD上进行定期修剪默认情况下已被禁用[28][29]Ext3NILFS2OCFS2提供Ioctl来执行离线修剪。TRIM规范称支持修剪特定范围列表,但截至内核3.0,修剪仅能较慢地逐个调用单个范围。[30]

MacOS 2011-06-2310.6.8–2011年6月23日[31] 尽管AHCI块设备驱动程序在10.6.6 (10J3210)中得到了显示设备是否支持TRIM操作的功能[32],该功能本身仍不可用,直至10.6.8暴露通过IOStorageFamily执行TRIM操作,以及文件系统(HFS+)的支持。直到10.10.4,Mac OS X只为苹果品牌的SSD原生启用TRIM;第三方实用程序可使其适用于其他品牌。旧的第三方TRIM驱动程序在Yosemite更新时已停止工作。[33] 现已有更新的适用于OS X Yosemite的驱动程序。[34][35] 在Mac OS X更新10.10.4页面存档备份,存于中,苹果公司添加了一个命令行使用工具trimforce,它可以用于为第三方SSD启用TRIM。[36]
Microsoft Windows 2009-10Windows 7和Windows Server 2008 R2 - 2009年10月[37][38] Windows 7最初支持的TRIM仅适用于包括ATASATA的AT Attachment系列中的驱动器,并不对任何其他包括Storport PCI-Express SSD设备支持此命令,即使即使设备本身将接受该命令。[39]已确认Windows 7上AHCI和旧有IDE/ATA模式下的原生微软驱动支持TRIM命令。[40]Windows 8及之后版本的Windows操作系统支持基于NVMe的PCI Express SSD的trim,以及来自SATA的TRIM命令完全模拟的unmap命令,用于使用SCSI驱动程序堆栈的设备。微软已为Windows 7发布一个KB2990941页面存档备份,存于更新,这在使用DISM集成到Windows 7安装程序时增加NVM Express的支持,包括对PCIe SSD设备的TRIM。
OpenSolaris 2010-072010年7月[41]
Android 2013-74.3[42] - 24 July 2013[43] 每24小时自动运行fstrim,仅在设备已空闲至少1小时并且电量80%(如果已连接充电器则30%)时执行。[42]

RAID问题

截至2017年1月 (2017-01),大多数基于硬件的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的发布版本已实现BIOS辅助的“假硬件RAID”支持,并且现在通行来自RAID阵列上的文件系统的任何TRIM请求。[44]


不同于dmraid,Linux的常规目的软件RAID系统mdraid有实验性的基于批处理(而不是在文件删除时实时)的TRIM,当系统配置为定期在RAID 1阵列上的文件系统上运行mdtrim实用工具(包括ext3等没有原生TRIM支持的文件系统)。[45]在Linux的稍晚版本(例如Red Hat Enterprise Linux 6.5和beyond)中 mdraid支持实时、实际传递TRIM命令,而不是作为一个批处理作业。[46]

但请注意,紅帽公司建议不要在大多数RAID技术的SSD上使用软件RAID 1、4、5和6,因为大多数RAID管理实用工具(例如Linux的mdadm)在初始化期间会在设备上写入所有块以确保校验和(或RAID 1/10情况下的驱动器到驱动器验证)运作正常,而这导致SSD认为除备用区域以外的所有块都在使用中,从而显著降低性能。[47]

另一方面,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卷的驱动器。[48]

截至2012年8月,英特尔确认,使用快速存储技术(RST)11.2驱动程序的7系列芯片组支持微软Windows 7中的RAID 0的TRIM。[49]虽然英特尔没有确认支持6系列芯片组,RAID 0卷上的TRIM已展示为在Z68、P67和X79芯片组上可用,通过由硬件发烧友修改的RAID选项ROM[50]据推测,缺乏对6系列芯片组的官方支持是由于验证成本[51]或企图鼓励消费者升级[52],而不是出于技术原因。

在使用X79芯片组的主板上需要修改选项ROM的例外是制造商添加了ROM开关;这需要RST和RST-E ROM存在于BIOS/UEFI内。这允许使用RST ROM而不是RST-E ROM,从而允许TRIM工作。[53]英特尔指出,使用与ROM版本相同的驱动程序可以实现最佳性能。例如,如果BIOS/UEFI具有11.0.0.0m选项ROM,则应使用11.x版本的驱动程序。[54]

为不支持的操作系统使用

在使用不支持自动TRIM的文件系统时,某些实用工具可以手动发送Trim命令。通常它们将确定哪些块为空闲,然后将该列表以一系列的Trim命令传递给驱动器。这些实用程序可从各制造商(例如Intel、[55]G.Skill[56])或作为一般实用程序(例如Linux的hdparm自v9.17起,[57][58]或者如上所述的mdtrim)。

硬件支持

ATA

TRIM命令规范[59]已被标准化为AT Attachment接口标准的一部分,由国际信息技术标准委员会(INCITS)的技术委员会T13所领导。[60] TRIM根据DATA SET MANAGEMENT(数据集管理)命令(操作码06h)实现,ACS-2规范草案。[61]ATA标准被并行(IDE、PATA)和串口(SATA)ATA硬件所支持。

原版ATA TRIM命令的缺点是它被定义为不可排队命令,因此不能轻松地与正常的、排队的读和写操作混合。SATA 3.1引入了一个排队的TRIM命令来纠正这一点。[62]

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。[63]

各LBA范围被称为一个LBA范围条目,并由八个字节表示。 LBA由LBA范围条目的前6个字节表示,范围长度是由剩下两个字节表示的一个从零开始的计数器。如果两个字节组成的范围长度为零,那么LBA范围条目应视作填充而丢弃。[64]这意味着以512字节为TRIM块范围支持的设备,该最大值为64个32 MB,也就是2 GB。如果设备在SATA字105处设为8,则它应该能在单个TRIM(数据集管理)命令中修整16GB。

SCSI

SCSI提供了UNMAP命令(TRIM的完全模拟),以及带有UNMAP标志集的WRITE SAME命令(10和16个变量)。[65]

SD/MMC

多媒體記憶卡SD ERASE(CMD38)命令提供了与ATA TRIM命令类似的功能,但它要求擦除的块用0或1重写。eMMC 4.5进一步定义了一个“discard”(丢弃)子操作,从而更紧密的配合ATA TRIM,因为丢弃的块的内容可以被认为是不确定的(即“不在乎”的)。

缺点

  • 在使用加密时,TRIM命令的相关信息将揭露哪些块正在使用,哪些没有。[66]
  • TRIM命令的原始版本已被T13小组委员会定义为非排队命令,因此执行不当可能造成大量的错误执行。例如,如果它在操作系统的每个删除命令后发出,该命令的非排队性质将要求驱动程序先等待所有未完成的命令完成,然后发出TRIM命令,最后再继续正常命令。TRIM可能需要很长时间才能完成,这取决于SSD中的固件,并还可能触发垃圾收集周期。这种缺陷可以用定期执行批量TRIM的解决方案来最小化,而不是在每次文件删除时执行修剪,批量处理任务可以在系统利用率最小时调度。这项TRIM缺点已在Serial ATA修订3.1中解决,其中引入了排队的TRIM命令。[67][68]
  • 排队的TRIM命令已在多款设备中涉及严重的数据损坏,最显著的是Micron的M500、[69]Crucial的M500、以及Samsung 8**系列。[70]在2015年7月1日,Linux操作系统在这些设备上的数据损坏已得到确认。[71]

这些设备已被列入Linux内核中libata-core.c的黑名单,从而强制发送非排队的TRIM命令到这些设备,而不是排队的TRIM命令:[72]

  • 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会导致错误的块丢失数据。[72][73]

libata-core.c还有一个列出子系统维护者已确认正确实现DRAT和RZAT标志(flags)的SSD,这不同于许多忽略它们的驱动器。白名单中的设备如下:

  • Crucial多款SSD
  • Intel多款SSD(不包括Intel SSD 510)
  • Micron多款SSD
  • 三星多款SSD
  • 希捷多款SSD[74]

参见

  • 数据残留

参考资料

  1. . Intel.com. Intel. 2010-09-14 [2012-02-21]. (原始内容存档于2016-03-06).
  2. Shimpi, Anand Lal. . AnandTech.com: 4. 2009-03-18 [2010-06-19]. (原始内容存档于2012-06-30).
  3. Shimpi, Anand Lal. (2009-03-18). p. 10.
  4. Shimpi, Anand Lal. (2009-03-18). p. 11.
  5. . AnandTech.com. Anand Lal Shimpi. 2010-11-11 [2010-12-10]. (原始内容存档于2010-12-13).
  6. Savill, John. . WindowsITPro. 2009-04-21 [2010-06-19]. (原始内容存档于2012-06-30).
  7. Shimpi, Anand Lal. (2009-03-18). p. 7.
  8. Savill, John. . WindowsITPro. 2009-04-22 [2010-06-19]. (原始内容存档于2013-02-09).
  9. Malventano, Allyn. . PC Perspective. 13 February 2009 [10 February 2012]. (原始内容存档于2012-02-28).
  10. Shimpi, Anand Lal. (2009-03-18). p. 5.
  11. Shimpi, Anand Lal. (2009-03-18). p. 8.
  12. . ExtremeTech.com. [2010-11-06]. (原始内容存档于2010-11-15).
  13. . TomsHardware.com. 2008-09-08 [2010-11-06].
  14. . TechGage. TechGage. 2010-03-05 [2010-04-16]. (原始内容存档于2012-06-30).
  15. . [2017-03-16]. (原始内容存档于2020-07-06).
  16. . [2010-09-01]. (原始内容存档于2010-07-27).
  17. . [2011-02-01].
  18. . [2013-06-05]. (原始内容存档于2018-02-17).
  19. . [2013-10-04]. (原始内容存档于2013-10-03).
  20. . [2012-10-30]. (原始内容存档于2013-05-20).
  21. . 2012-10-19 [2017-03-16]. (原始内容存档于2016-03-05).
  22. . [2017-03-16]. (原始内容存档于2018-06-12).
  23. . Kernel Newbies. [2010-09-01]. (原始内容存档于2012-06-30).
  24. . [2017-03-16]. (原始内容存档于2016-12-25).
  25. . [2017-03-16]. (原始内容存档于2012-09-16).
  26. . [2012-03-28]. (原始内容存档于2012-10-04).
  27. . [2017-03-16]. (原始内容存档于2016-03-30).
  28. Freemyer, Greg. . 2010 [2017-03-16]. (原始内容存档于2013-01-27).
  29. . Ask Ubuntu. [11 November 2015]. (原始内容存档于2017-03-22).
  30. . [2017-03-16]. (原始内容存档于2012-11-14).
  31. . 2012-02-24 [2017-03-16]. (原始内容存档于2017-03-18).
  32. . 2011-03-04 [2017-03-16]. (原始内容存档于2012-06-30).
  33. . [2017-03-16]. (原始内容存档于2014-12-02).
  34. . [2020-09-27]. (原始内容存档于2014-12-02).
  35. . [2017-03-16]. (原始内容存档于2016-03-06).
  36. Lee Hutchinson. . Ars Technica. Condé Nast. Jun 30, 2015 [2015-07-01]. (原始内容存档于2015-07-01).
  37. . 微软开发者网络. 2009-05-09 [2010-08-12]. (原始内容存档于2012-06-30).
  38. (PDF). Microsoft downloads. Microsoft Corporation. 2008-11-12 [2009-07-08]. (原始内容存档 (PDF)于2012-06-30).
  39. Geoff Gasior (2012) 页面存档备份,存于 OCZ's RevoDrive 3 X2 240GB solid-state drive
  40. Coles, Olin. . BenchmarkReviews. 15 April 2010 [20 August 2013]. (原始内容存档于2013-12-03).
  41. . 2010-07-29 [2017-03-16]. (原始内容存档于2012-06-30).
  42. . 2013-07-29 [2013-07-30]. (原始内容存档于2013-08-01).
  43. "Android 4.3 announced, rolling out to Nexus devices today" 页面存档备份,存于.The Verge. 24 July 2013. Retrieved 24 July 2013.
  44. . [2011-11-29]. (原始内容存档于2011-12-20).
  45. . [2011-11-29]. (原始内容存档于2018-06-10).
  46. . [2016-03-09]. (原始内容存档于2015-12-26).
  47. . 2015-11-11 [2016-02-29].
  48. . Intel. 2010-03-26 [2010-11-06]. (原始内容存档于2010-09-15).
  49. . 2012-08-19 [2013-01-14]. (原始内容存档于2012-10-22).
  50. . 2012-11-18 [2013-01-14]. (原始内容存档于2013-01-18).
  51. . 2012-11-28 [2013-01-14]. (原始内容存档于2013-01-09).
  52. . 2012-08-16 [2013-01-14]. (原始内容存档于2013-01-13).
  53. Anand Lal Shimpi. . [2017-03-16]. (原始内容存档于2017-05-06).
  54. Doug Crowthers. . Tom's Hardware.
  55. (PDF). Intel Corporation. [2010-01-23]. (原始内容 (PDF)存档于2010-06-02).
  56. . XtremeSystems. [2010-01-23]. (原始内容存档于2012-06-30).
  57. . [2010-08-14]. (原始内容存档于2010-06-09).
  58. . sourceforge.net. [2010-08-14]. (原始内容存档于2010-08-21).
  59. . INCITS T13. INCITS. 2007-12-12 [2009-07-08]. (原始内容存档于2010-06-13).
  60. . INCITS T13. INCITS. [2009-07-08]. (原始内容存档于2010-05-26).
  61. (PDF). INCITS. 2010-06-23 [2010-08-14]. (原始内容存档 (PDF)于2011-03-22).
  62. . Serial ATA International Organization. [2012-09-26]. (原始内容存档于2013-02-02).
  63. . [2016-02-29]. (原始内容存档于2016-03-14).
  64. (PDF). [2016-02-29]. (原始内容存档 (PDF)于2016-04-05).
  65. . [2017-03-16]. (原始内容存档于2012-06-30).
  66. . Milan Broz. [2014-10-01]. (原始内容存档于2011-12-30).
  67. . [2017-03-16]. (原始内容存档于2013-02-02).
  68. . The Tech Report. [2017-03-16]. (原始内容存档于2016-05-20).
  69. . [2017-03-16]. (原始内容存档于2017-10-11).
  70. . [2017-03-16]. (原始内容存档于2017-01-18).
  71. torvalds. . GitHub. [2017-03-16]. (原始内容存档于2016-07-07).
  72. torvalds. . GitHub. [2017-03-16]. (原始内容存档于2017-02-27).
  73. torvalds. . GitHub. [2017-03-16]. (原始内容存档于2018-12-26).
  74. . [2017-03-16]. (原始内容存档于2016-03-04).

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.