Trim命令
Trim命令(ATA命令集中称为TRIM,SCSI命令集中称为UNMAP),它使作业系统能通知固态硬碟(SSD)哪些数据块已不再考虑使用,可以被内部擦除。
Trim在SSD被推出后很快被跟着推出。因为SSD的底层操作与硬碟驱动器显着不同,作业系统处理诸如删除和格式化等操作的典型方式将导致SSD上的写操作不可预期的逐步性能退化。Trim(意为修整、修剪、裁剪)使SSD能更有效地处理垃圾收集,否则将减慢在未来对所涉及块的写入操作。
儘管在引入Trim前已有将某些驱动器“重置”为新状态的工具,但它们也将删除该驱动器上的所有数据,从而使这些工具和技术不能用于持续性最佳化。在2014年,许多SSD有内部的后台垃圾收集机制,它们与修整工作相独立。儘管这在不支持修整的作业系统上也成功地保持了性能,它存在增加写入放大和快闪记忆体单元磨损的相关缺点。
基本介绍
- 中文名:Trim命令
- 外文名:Trim (computing)
- 领域:计算机
快闪记忆体磁碟驱动器特有的问题
因为许多档案系统以标记数据块为“未使用”来处理删除操作,存储介质(传统硬碟、SSD)通常不知道哪个扇区/页是真在使用,哪些可被认作空闲空间。因此与重写操作不同,删除将不涉及对数据所在扇区的物理写入。由于通用SSD不了解档案系统结构(例如未使用的块/扇区的列表),存储介质无法获知哪些块已经变为可用。这使反删除工具能从传统的机械硬碟上恢复档案,因为儘管作业系统报告档案已被“删除”,档案所在的扇区只是在作业系统之后进行写入时作为空闲空间的扇区,从而有效使操作变得像重写操作。对于机械磁碟来说,这与写入空扇区没有区别,但因为SSD最底层的一些特性,与将数据写入空页面相比,重写会有显着的开销,从而潜在地削弱写入性能。
SSD在快闪记忆体单元中通常以4至16kB的分组来存储数据,并将分组组合成128至512页的块。例如,512kB以4kB为一页存储在128页的块中。NAND快闪记忆体单元只能在处于空状态时写入。如果它们可能包含数据,则执行写操作前必须擦除其内容。一次SSD写入操作可以只完成单个页,但由于硬体限制,擦除命令始终会影响整个块;因此将数据写入到SSD上的空页非常快,而写入存在数据的页就会显着变慢。由于页被再次写入前需要擦除单元,但擦除只能对整个块,改写将按“读取、擦除、修改、写入”的方式完成;整个块的内容会先存储在快取中,然后在SSD中擦除整个块,再将改写的页写入到快取的块,最后再将更新的块写入快闪记忆体介质。这种现象也称写入放大。
操作
TRIM命令使作业系统得以通知SSD哪个页不再包含有效的数据。对于档案删除操作,作业系统会将档案删除标记为可用于新数据,然后向SSD传送TRIM命令。在Trim后,在新的数据写入快闪记忆体页面时,SSD不保留块的任何内容,从而实现更少的写入放大(更少的写入)、更高的写入吞吐量(不需要读取、擦除、修改),从而增加驱动器寿命。
不同的SSD实现的命令有所不同,因此性能可能也有所差异。
Trim为不可逆地擦除数据,无法恢复;这不同于机械硬碟中被删除的数据可能被数据恢复。
实现
作业系统支持
Trim仅在支持它的作业系统上有效。下表列出了各个重要的作业系统支持该命令的首个版本。此外,在TRIM命令添加到高技术配置标準之前设计的旧款固态驱动器需要更新固件(如果有)才能支持Trim,否则将忽略这个新命令。
RAID问题
截至2017年1月,大多数基于硬体的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请求。
不同于dmraid,Linux的常规目的软体RAID系统mdraid有实验性的基于批处理(而不是在档案删除时实时)的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上为LVMRAID使用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月,英特尔确认,使用Rapid Storage Technology(RST)11.2驱动程式的7系列晶片组支持微软Windows 7中的RAID 0的TRIM。虽然英特尔没有确认支持6系列晶片组,RAID 0卷上的TRIM已展示为在Z68、P67和X79晶片组上可用,通过由硬体发烧友修改的RAID选项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自v9.17起,或者如上所述的mdtrim)。
硬体支持
高技术配置
TRIM命令规範已被标準化为AT Attachment接口标準的一部分,由国际信息技术标準委员会(INCITS)的技术委员会T13所领导。TRIM根据D高技术配置 SET MANAGEMENT(数据集管理)命令(操作码06h)实现,ACS-2规範草案。高技术配置标準被并行(IDE、P高技术配置)和串口(S高技术配置)高技术配置硬体所支持。
原版高技术配置 TRIM命令的缺点是它被定义为不可排队命令,因此不能轻鬆地与正常的、排队的读和写操作混合。S高技术配置 3.1引入了一个排队的TRIM命令来纠正这一点。
高技术配置 IDENTIFY DEVICE命令返回的S高技术配置 Words 69和169定义了不同类型的TRIM。
- 非确定性TRIM:TRIM后每个对逻辑区块地址(LBA)的读取命令可能返回不同的数据。
- 确定性TRIM(DRAT):TRIM后对LBA的所有读取命令都返回相同的数据,或者变为确定的。
- TRIM(RZAT)后确定性读零:TRIM后对LBA的所有读取命令都将返回零。
在S高技术配置字105中有额外信息,描述驱动器可以在每个数据集管理命令(D高技术配置 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。如果设备在S高技术配置字105处设为8,则它应该能在单个TRIM(数据集管理)命令中修整16GB。
SCSI
SCSI提供了UNMAP命令(TRIM的完全模拟),以及带有UNMAP标誌集的WRITE SAME命令(10和16个变数)。
SD/MMC
多媒体存储卡和SDERASE(CMD38)命令提供了与高技术配置 TRIM命令类似的功能,但它要求擦除的块用0或1重写。eMMC 4.5进一步定义了一个“discard”(丢弃)子操作,从而更紧密的配合高技术配置 TRIM,因为丢弃的块的内容可以被认为是不确定的(即“不在乎”的)。
缺点
- 在使用加密时,TRIM命令的相关信息将揭露哪些块正在使用,哪些没有。
- TRIM命令的原始版本已被T13小组委员会定义为非排队命令,因此执行不当可能造成大量的错误执行。例如,如果它在作业系统的每个删除命令后发出,该命令的非排队性质将要求驱动程式先等待所有未完成的命令完成,然后发出TRIM命令,最后再继续正常命令。TRIM可能需要很长时间才能完成,这取决于SSD中的固件,并还可能触发垃圾收集周期。这种缺陷可以用定期执行批量TRIM的解决方案来最小化,而不是在每次档案删除时执行修剪,批量处理任务可以在系统利用率最小时调度。这项TRIM缺点已在Serial 高技术配置修订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
ATA配置
ATA(英语:Advanced Technology Attachment,简称“ATA”)与由集成驱动电子设备(英语:Integrated Drive Electronics,简称IDE)技术实现的磁碟驱动器关係最密切。
IDE是一种计算机系统接口,主要用于硬碟和CD-ROM,本意为“把控制器与盘体集成在一起的硬碟”。数年以前PC主机使用的硬碟,大多数都是IDE兼容的,只需用一根电缆将它们与主机板或适配器连起来就可以了,而目前主要接口为SATA接口。而在SATA技术日益发展下,没有ATA的主机板已经出现,而且Intel在新型的晶片组中已经不默认支持ATA接口,主机版厂商需要另加晶片去对ATA作出支持(通常是为了兼容旧有硬碟和光碟驱动器)。
SATA(Serial ATA)于2002年推出后,原有的ATA改名为PATA(并行ATA配置,Parallel ATA)。2013年12月29日,西部数据正式停止PATA硬碟供应,而希捷科技则已停售产多年,这意味着1986年设计的PATA接口在经历27年后正式退出历史舞台。
小型计算机系统接口
小型计算机系统接口(SCSI,SmallComputerSystemInterface)是一种用于计算机及其周边设备之间(硬碟、软碟机、光碟机、印表机、扫瞄器等)系统级接口的独立处理器标準。SCSI标準定义命令、通信协定以及实体的电气特性(换成OSI的说法,就是占据物理层、连结层、套接层、套用层),最大部分的套用是在存储设备上(例如硬碟、磁带机);但,其实SCSI可以连线的设备包括有扫瞄器、光学设备(像CD、DVD)、印表机……等等,SCSI命令中有条列出支持的设备SCSI周边设备。理论上,SCSI不可能连线所有的设备,所以有“1Fh - unknown or no device type”这个参数存在。
参见
- 数据残留