Trim (computing)

From Infogalactic: the planetary knowledge core
Jump to: navigation, search

<templatestyles src="Module:Hatnote/styles.css"></templatestyles>

<templatestyles src="Module:Hatnote/styles.css"></templatestyles>

A Trim command (known as TRIM in the ATA command set, and UNMAP in the SCSI command set) allows an operating system to inform a solid-state drive (SSD) which blocks of data are no longer considered in use and can be wiped internally.[1]

Trim was introduced soon after SSDs were introduced. Because low-level operation of SSDs differs significantly from hard drives, the typical way in which operating systems handle operations like deletes and formats resulted in unanticipated progressive performance degradation of write operations on SSDs.[2] Trimming enables the SSD to handle garbage collection overhead, which would otherwise significantly slow down future write operations to the involved blocks, in advance.[3]

Although tools to "reset" some drives to a fresh state were already available before the introduction of trimming, they also delete all data on the drive, which makes them impractical to use for ongoing optimization.[4] By 2014, many SSDs had internal idle/background garbage collection mechanisms that work independently of trimming; although this successfully maintains their performance even under operating systems that do not support Trim, it has the associated drawbacks of increased write amplification and wear of the flash cells.[5]

Flash drive specific issues

Because of the way that many file systems handle delete operations, by flagging data blocks as "not in use",[6][7] storage media (SSDs, but also traditional hard drives) generally do not know which sectors/pages are truly in use and which can be considered free space. Contrary to, for example an overwrite operation, a delete will not involve a physical write to the sectors that contain the data. Since a common SSD has no knowledge of the file system structures, including the list of unused blocks/sectors, the storage medium remains unaware that the blocks have become available. While this often enables undelete tools to recover files from electromechanical hard disks,[7][8] despite the files being reported as "deleted" by the operating system, it also means that when the operating system later performs a write operation to one of the sectors, which it considers free space, it effectively becomes an overwrite operation from the point of view of the storage medium. For magnetic disks this is no different from writing an empty sector, but because of how some SSDs function at the lowest level, an overwrite produces significant overhead compared to writing data into an empty page, potentially crippling write performance.[7][9]

SSDs store data in flash memory cells that are grouped into pages typically of 4 to 16 kB, grouped together into blocks of typically 128 to 512 pages, e.g., 512 kB per block with 4 kB pages in 128-page blocks.[6][10] NAND flash memory cells can only be directly written to when they are empty. If they may contain data, the contents must be erased before a write operation. An SSD write operation can be done on a single page but, due to hardware limitations, erase commands always affect entire blocks;[10] consequently writing data to empty pages on an SSD is very fast, but slows down considerably once previously written pages need to be overwritten. Since an erase of the cells in the page is needed before it can be written again, but only entire blocks can be erased, an overwrite will initiate a read-erase-modify-write cycle:[6][11] the contents of the entire block are stored in cache, then the entire block is erased from the SSD, then the overwritten page is written to the cached block, and only then can the entire updated block be written to the flash medium. This phenomenon is known as write amplification.[12][13]

Operation

The Trim command is designed to enable the operating system to notify the SSD which pages no longer contain valid data due to erases either by the user or operating system itself. During a delete operation, the OS will mark the sectors as free for new data and send a Trim command to the SSD to mark them as not containing valid data. After that the SSD knows not to preserve the contents of the block when writing a page, resulting in less write amplification with fewer writes to the flash, higher write speed, and increased drive life.

Different SSDs implement the Trim command somewhat differently, so performance can vary.[3][8]

Trim irreversibly deletes from the SSD the data Trim affects. Recovery of data deleted by Trim is not possible. This is unlike a magnetic drive from which deleted data may often be recovered.[14]

Implementation

Operating system support

Trimming is only effective on operating systems which support it. The table below identifies each notable operating system and the first version supporting the command. Additionally, older solid-state drives designed before the addition of the Trim command to the ATA standard will need firmware updates, otherwise the new command will be ignored. However, not every drive can be upgraded to support Trimming.

Operating System Supported since Notes
DragonFly BSD 2011-05May 2011[15]
FreeBSD 2010-078.1 - July 2010[16] Support was added at the block device layer in 8.1. Filesystem support was added in FreeBSD 8.3 and FreeBSD 9, beginning with UFS.[17] ZFS trimming support was added in FreeBSD 9.2.[18][19] FreeBSD 10 supports trimming on software RAID configurations.[20]
NetBSD 2012-10October 2012[21]
Linux 2008-12-252.6.28–25 December 2008[22] Initial support for discard operations was added for FTL NAND flash devices in 2.6.28. Support for the ATA Trim command was added in 2.6.33.[23]

Not all filesystems make use of Trim. Among the filesystems that can issue Trim requests automatically are Ext4,[24] Btrfs,[25] FAT, GFS2,[26] JFS,[27] and XFS.[27] However, this is disabled by default due to performance concerns,[28] in favor of scheduled TRIMming on supported SSDs.[29] Ext3, NILFS2 and OCFS2 offer ioctls to perform offline trimming. The Trim specification calls for supporting a list of trim ranges, but as of kernel 3.0 trim is only invoked with a single range that is slower.[30]

Mac OS X 2011-06-2310.6.8–23 June 2011[31] Although the AHCI block device driver gained the ability to display whether a device supports the Trim operation in 10.6.6 (10J3210),[32] the functionality itself remained inaccessible until 10.6.8, when the Trim operation was exposed via the IOStorageFamily and filesystem (HFS+) support was added.[citation needed] Until 10.10.4, Mac OS X natively enabled Trim only for Apple-branded SSDs; third-party utilities are available to enable it for other brands. Old third party TRIM drivers stopped working as of the Yosemite update.[33] Updated drivers now exist that work with OS X Yosemite.[34][35] In Mac OS X update 10.10.4, Apple added a command line utility, trimforce, that can be used to enable TRIM on third-party SSDs.[36]
Microsoft Windows 2009-10Windows 7 and Windows Server 2008 R2 - October 2009[37][38] Windows 7 only supports trim for drives in the AT Attachment family including Parallel ATA and Serial ATA, and does not support this command for any other devices including Storport PCI-Express SSDs even if the device itself would accept the command.[39] It is confirmed that with native Microsoft drivers the Trim command works in AHCI and legacy IDE / ATA Mode.[40] Windows 8 and later Windows operating systems support trim for PCI Express SSDs based on NVMe, and the unmap command which is a full analog of the trim command from Serial ATA for devices that use the SCSI driver stack.
OpenSolaris 2010-07July 2010[41]
Android 2013-74.3[42] - 24 July 2013[43] Runs fstrim automatically up to once every 24 hours if the device has been idle for at least an hour and is at least 80% charged (30% if connected to a charger).[42]

RAID issues

As of January 2012, support for the TRIM command had not been implemented in most hardware-based RAID technologies. However, software RAID implementations often do include support for TRIM. For example, when using the third-party SoftRAID application, TRIM has been supported on Mac OS X RAID volumes since 2011, including support for all non-Apple SSD devices. (While Mac OS 10.10 disabled support for TRIM on third-party devices as part of its extensions security enhancements, as of July 1, 2015, the Mac OS 10.10.4 update officially allows users to enable TRIM for third party SSD devices using the command line. However, the built-in software RAID in OS X still does not support TRIM, so the SoftRAID application is necessary for TRIM in this configuration.)

Another case where it has been implemented is in post-January-2011 releases of the Linux kernel's dmraid, which implements BIOS-assisted "fake hardware RAID" support, and which now passes through any TRIM requests from the filesystem that sits on the RAID array.[44]

Not to be confused with dmraid, Linux's general-purpose software RAID system, mdraid, has experimental support for batch-based (rather than live, upon file deletion) TRIM on RAID 1 arrays when systems are configured to periodically run the mdtrim utility on filesystems (even those like ext3 without native TRIM support).[45] In later versions of Linux, e.g. Red Hat Enterprise Linux 6.5 and beyond, mdraid supports actually passing through TRIM commands in real-time, rather than just as a batch job.[46]

However, note that as of RHEL 6, and continuing with 7, Red Hat recommends against using software RAID levels 1, 4, 5, and 6 on SSDs with most RAID technologies, because during initialization, most RAID management utilities (e.g. Linux's mdadm) write to all blocks on the devices to ensure that checksums (or drive-to-drive verifies, in the case of RAID 1 / 10) operate properly, causing the SSD to believe that all blocks other than in the spare area are in use, significantly degrading performance.[47]

On the other hand, Red Hat can recommend the use of RAID 1 or RAID 10 for LVM RAIDs on SSDs, as these levels support TRIM ("discard" in Linux terminology), and the LVM utilities do not write to all blocks when creating a RAID 1 or RAID 10 volume.[46]

For a short time in March 2010, users were led to believe that the Intel Rapid Storage Technology (RST) 9.6 drivers supported TRIM on RAID volumes, but Intel later clarified that TRIM was supported for the BIOS settings of AHCI mode and RAID mode, but not if the drive was part of a RAID volume.[48]

As of August 2012, Intel confirms that 7-series chipsets with Rapid Storage Technology (RST) 11.2 drivers support TRIM for RAID 0 in Microsoft Windows 7.[49] While Intel did not confirm support for 6-series chipsets, TRIM on RAID 0 volumes has been shown to work on Z68, P67, and X79 chipsets by hardware enthusiasts with a modified RAID option ROM.[50] It is speculated that the lack of official support for 6-series chipsets is due to validation costs[51] or an attempt to encourage consumers to upgrade,[52] rather than for technical reasons.

An exception to the need for a modified option ROM on motherboards with an X79 chipset is if the manufacturer has added a ROM switch; this entails both the RST and RST-E ROMs being inside the BIOS/UEFI. This allows the RST ROM to be used instead of the RST-E ROM, allowing TRIM to function.[53] Intel notes that best performance can be achieved by using a driver with same version as the ROM; for example, if the BIOS/UEFI has an 11.0.0.0m option ROM, an 11.x version driver should be used.[54]

Enabling unsupported filesystems

Where the filesystem does not automatically support TRIM, some utilities can send trimming commands manually. Usually they determine which blocks are free and then pass this list as a series of trimming commands to the drive. These utilities are available from various manufacturers (e.g. Intel,[55] G.Skill[56]), or as general utilities (e.g. Linux's hdparm since v9.17,[57][58] or mdtrim, as mentioned above).

Hardware support

ATA

The TRIM command specification[59] has been standardized as part of the AT Attachment (ATA) interface standard, led by Technical Committee T13 of the International Committee for Information Technology Standards (INCITS).[60] TRIM is implemented under the DATA SET MANAGEMENT command (opcode 06h) the draft ACS-2 specification.[61] The ATA standard is supported by both parallel (IDE, PATA) and serial (SATA) ATA hardware.

A drawback of the original ATA TRIM command is that it was defined as a non-queueable command and therefore could not easily be mixed with a normal workload of queued read and write operations. SATA 3.1 introduced a queued TRIM command to remedy this.[62]

There are different types of TRIM defined by SATA Words 69 and 169 returned from an ATA IDENTIFY DEVICE command:

  • Non-deterministic TRIM: Each read command to the Logical block address (LBA) after a TRIM may return different data.
  • Deterministic TRIM (DRAT): All read commands to the LBA after a TRIM shall return the same data, or become determinate.
  • Deterministic Read Zero after TRIM (RZAT): All read commands to the LBA after a TRIM shall return zero.

There is additional information in SATA Word 105 that describes the Maximum number of 512-byte blocks per DATA SET MANAGEMENT command that a drive can support. Typically this defaults to 8 (or 4 kB) but many drives reduce this to 1 to meet the Microsoft Windows Hardware Requirements for TRIM, that command completion time shall not exceed 20 ms or 8 ms × (number of LBA range entries), whichever is greater, and shall always be less than 600 ms.[63]

An individual LBA range is called an LBA Range Entry and is represented by eight bytes. The LBA is expressed by the LBA Range Entry's first six bytes and the Range Length is a zero-based counter (e.g., 0=0 and 1=1) represented by the remaining two bytes. If the two-byte range length is zero, then the LBA Range Entry shall be discarded as padding.[64] This means that for each 512-byte block of TRIM ranges that a device supports, the maximum is 64 ranges of 32 MB, or 2 GB. If a device supports SATA Word 105 at 8 then it should be able to trim 16 GB in a single TRIM (DATA SET MANAGEMENT) command.

SCSI

SCSI provides the UNMAP command (a full analog of TRIM), and the WRITE SAME command (10 and 16 variants) with the UNMAP flag set.[65]

SD/MMC

The MultiMediaCard and SD ERASE (CMD38) command provides similar functionality to the ATA TRIM command, although it requires that erased blocks be overwritten with either zeroes or ones. eMMC 4.5 further defines a "discard" sub-operation that more closely matches ATA TRIM in that the contents of discarded blocks can be considered indeterminate (i.e., "don't care").

Shortcomings

  • When encryption is in use, using the TRIM command reveals information about which blocks are in use and which are not.[66]
  • The original version of the TRIM command has been defined as a non-queued command by the T13 subcommittee, and consequently can incur massive execution penalty if used carelessly, e.g., if sent after each filesystem delete command. The non-queued nature of the command requires the driver to first wait for all outstanding commands to be finished, issue the TRIM command, then resume normal commands. TRIM can take a lot of time to complete, depending on the firmware in the SSD, and may even trigger a garbage collection cycle.[citation needed] This penalty can be minimized in solutions that periodically do a batched TRIM, rather than trimming upon every file deletion, by scheduling such batch jobs for times when system utilization is minimal. This TRIM shortcoming has been overcome in Serial ATA revision 3.1 with the introduction of the Queued TRIM Command.[67][68]
  • Queued TRIM commands have been linked to serious data corruption in several devices, most notably Micron's M500,[69] Crucial's M500,[69] and Samsung 8** series.[70] The data corruption has been confirmed for the Linux operating system on these devices as of July 1, 2015.[71]

These devices are blacklisted in the Linux kernel's libata-core.c to force sending non-queued TRIM commands to these drives instead of queued TRIM commands:[72]

  • Micron M500 using all firmware versions (only those prior to MU07 have the issue, but Linux hasn't caught up)
  • Crucial M500 using all firmware versions including factory recertified SSDs (only those prior to MU07 have the issue, but Linux hasn't caught up)
  • Micron M510 using firmware version MU01
  • Micron M550 using firmware version MU01
  • Crucial M550 using firmware version MU01
  • Crucial MX100 using firmware version MU01
  • Samsung SSD 8** series SSDs using all firmware versions

This file also blacklists the SuperSSpeed S238 against TRIM in general due to freeing the wrong blocks when TRIM is issued.[72][73]

libata-core.c also has a whitelist to list SSDs that are reliably known to the subsystem's maintainers to correctly implement the DRAT and RZAT flags, rather than ignoring them, as many drives do. The whitelisted drives are as follows:[72]

  • Crucial SSDs
  • Intel SSDs excluding the Intel SSD 510
  • Micron SSDs
  • Samsung SSDs
  • Seagate SSDs[74]

See also

References

  1. Lua error in package.lua at line 80: module 'strict' not found.
  2. Lua error in package.lua at line 80: module 'strict' not found.
  3. 3.0 3.1 Shimpi, Anand Lal. (2009-03-18). p. 10.
  4. Shimpi, Anand Lal. (2009-03-18). p. 11.
  5. Lua error in package.lua at line 80: module 'strict' not found.
  6. 6.0 6.1 6.2 Lua error in package.lua at line 80: module 'strict' not found.
  7. 7.0 7.1 7.2 Shimpi, Anand Lal. (2009-03-18). p. 7.
  8. 8.0 8.1 Lua error in package.lua at line 80: module 'strict' not found.
  9. Lua error in package.lua at line 80: module 'strict' not found.
  10. 10.0 10.1 Shimpi, Anand Lal. (2009-03-18). p. 5.
  11. Shimpi, Anand Lal. (2009-03-18). p. 8.
  12. Lua error in package.lua at line 80: module 'strict' not found.
  13. Lua error in package.lua at line 80: module 'strict' not found.
  14. Lua error in package.lua at line 80: module 'strict' not found.
  15. Lua error in package.lua at line 80: module 'strict' not found.
  16. Lua error in package.lua at line 80: module 'strict' not found.
  17. Lua error in package.lua at line 80: module 'strict' not found.
  18. Lua error in package.lua at line 80: module 'strict' not found.
  19. Lua error in package.lua at line 80: module 'strict' not found.
  20. Lua error in package.lua at line 80: module 'strict' not found.
  21. Lua error in package.lua at line 80: module 'strict' not found.
  22. Lua error in package.lua at line 80: module 'strict' not found.
  23. Lua error in package.lua at line 80: module 'strict' not found.
  24. Lua error in package.lua at line 80: module 'strict' not found.
  25. Lua error in package.lua at line 80: module 'strict' not found.
  26. Lua error in package.lua at line 80: module 'strict' not found.
  27. 27.0 27.1 Lua error in package.lua at line 80: module 'strict' not found.
  28. Lua error in package.lua at line 80: module 'strict' not found.
  29. Lua error in package.lua at line 80: module 'strict' not found.
  30. Lua error in package.lua at line 80: module 'strict' not found.
  31. Lua error in package.lua at line 80: module 'strict' not found.
  32. Lua error in package.lua at line 80: module 'strict' not found.
  33. Lua error in package.lua at line 80: module 'strict' not found.
  34. Lua error in package.lua at line 80: module 'strict' not found.
  35. Lua error in package.lua at line 80: module 'strict' not found.
  36. Lua error in package.lua at line 80: module 'strict' not found.
  37. Lua error in package.lua at line 80: module 'strict' not found.
  38. Lua error in package.lua at line 80: module 'strict' not found.
  39. Geoff Gasior (2012) OCZ's RevoDrive 3 X2 240GB solid-state drive
  40. Lua error in package.lua at line 80: module 'strict' not found.
  41. Lua error in package.lua at line 80: module 'strict' not found.
  42. 42.0 42.1 Lua error in package.lua at line 80: module 'strict' not found.
  43. "Android 4.3 announced, rolling out to Nexus devices today".The Verge. 24 July 2013. Retrieved 24 July 2013.
  44. Lua error in package.lua at line 80: module 'strict' not found.
  45. Lua error in package.lua at line 80: module 'strict' not found.
  46. 46.0 46.1 Lua error in package.lua at line 80: module 'strict' not found.
  47. Lua error in package.lua at line 80: module 'strict' not found.
  48. Lua error in package.lua at line 80: module 'strict' not found.
  49. Lua error in package.lua at line 80: module 'strict' not found.
  50. Lua error in package.lua at line 80: module 'strict' not found.
  51. Lua error in package.lua at line 80: module 'strict' not found.
  52. Lua error in package.lua at line 80: module 'strict' not found.
  53. Lua error in package.lua at line 80: module 'strict' not found.
  54. Lua error in package.lua at line 80: module 'strict' not found.
  55. Lua error in package.lua at line 80: module 'strict' not found.
  56. Lua error in package.lua at line 80: module 'strict' not found.
  57. Lua error in package.lua at line 80: module 'strict' not found.
  58. Lua error in package.lua at line 80: module 'strict' not found.
  59. Lua error in package.lua at line 80: module 'strict' not found. (draft specification T13/e07154r6)
  60. Lua error in package.lua at line 80: module 'strict' not found.
  61. Lua error in package.lua at line 80: module 'strict' not found.
  62. Lua error in package.lua at line 80: module 'strict' not found.
  63. Lua error in package.lua at line 80: module 'strict' not found.
  64. Lua error in package.lua at line 80: module 'strict' not found.
  65. Lua error in package.lua at line 80: module 'strict' not found.
  66. Lua error in package.lua at line 80: module 'strict' not found.
  67. http://www.sata-io.org/technology/6Gbdetails.asp
  68. Lua error in package.lua at line 80: module 'strict' not found.
  69. 69.0 69.1 Lua error in package.lua at line 80: module 'strict' not found.
  70. Lua error in package.lua at line 80: module 'strict' not found.
  71. Lua error in package.lua at line 80: module 'strict' not found.
  72. 72.0 72.1 72.2 Lua error in package.lua at line 80: module 'strict' not found.
  73. Lua error in package.lua at line 80: module 'strict' not found.
  74. Lua error in package.lua at line 80: module 'strict' not found.

External links