В этой статье отсутствует информация о дисках SMR (похожая проблема зоны только для добавления). ( Апрель 2020 г. ) |
Команда TRIM (известная как TRIM в наборе команд ATA и UNMAP в наборе команд SCSI ) позволяет операционной системе сообщать твердотельному накопителю (SSD), какие блоки данных больше не считаются «используемыми» и, следовательно, могут быть стерты внутренне. [1]
Trim был представлен вскоре после появления SSD. Поскольку низкоуровневые операции SSD существенно отличаются от жестких дисков, традиционный способ, которым операционные системы обрабатывают операции хранения, такие как удаление и форматирование, привел к непредвиденному прогрессирующему снижению производительности операций записи на SSD. [2] Trimming позволяет SSD более эффективно обрабатывать сборку мусора , что в противном случае замедлило бы будущие операции записи в задействованные блоки. [3]
Хотя инструменты для «сброса» некоторых дисков до нового состояния уже были доступны до введения обрезки, они также удаляют все данные на диске, что делает их непрактичными для использования для постоянной оптимизации. [4] По состоянию на 2024 год многие SSD-накопители имели внутренние механизмы сбора мусора для определенных файловых систем (таких как FAT32 , NTFS , APFS ), которые работали независимо от обрезки. Хотя это успешно поддерживало их срок службы и производительность даже в операционных системах, которые не поддерживали обрезку, это имело связанные с этим недостатки, такие как повышенное усиление записи и износ ячеек флэш-памяти. [5]
TRIM также используется на некоторых жестких дисках с черепичной магнитной записью (SMR). [6]
Из-за того, как многие файловые системы обрабатывают операции удаления, помечая блоки данных как «не используемые», [7] [8] носители данных (SSD, а также традиционные жесткие диски) обычно не знают, какие секторы/страницы действительно используются, а какие можно считать свободным пространством. В отличие от (например) операции перезаписи, удаление не будет включать в себя физическую запись в сектора, содержащие данные. Поскольку обычный SSD не имеет сведений о структурах файловой системы, включая список неиспользуемых блоков/секторов, носитель данных остается в неведении о том, что блоки стали доступны. Хотя это часто позволяет инструментам восстановления восстанавливать файлы с электромеханических жестких дисков , [8] [9] несмотря на то, что файлы сообщаются операционной системой как «удаленные», это также означает, что когда операционная система позже выполняет операцию записи в один из секторов, который она считает свободным пространством, это фактически становится операцией перезаписи с точки зрения носителя данных. Для магнитных дисков перезапись существующих данных ничем не отличается от записи в пустой сектор, но из-за особенностей работы некоторых твердотельных накопителей на самом низком уровне перезапись приводит к значительным накладным расходам по сравнению с записью данных на пустую страницу, что может привести к снижению производительности записи. [8] [10]
SSD хранят данные в ячейках флэш-памяти, которые сгруппированы в страницы, как правило, от 4 до 16 КБ , сгруппированных вместе в блоки, как правило, от 128 до 512 страниц. Пример: блоки по 512 КБ, которые группируют 128 страниц по 4 КБ каждая. [7] [11] Ячейки флэш-памяти NAND могут быть напрямую записаны только тогда, когда они пусты. Если они содержат данные, их содержимое должно быть стерто перед операцией записи. Операция записи SSD может быть выполнена на одну страницу, но из-за аппаратных ограничений команды стирания всегда затрагивают целые блоки; [11] следовательно, запись данных на пустые страницы на SSD выполняется очень быстро, но значительно замедляется, когда необходимо перезаписать ранее записанные страницы. Поскольку перед повторной записью необходимо стереть ячейки на странице, а стереть можно только целые блоки, перезапись инициирует цикл «чтение-стирание-изменение-запись»: [7] [12] содержимое всего блока сохраняется в кэше, затем весь блок стирается с SSD, затем перезаписанная страница(ы) записывается в кэшированный блок, и только после этого весь обновленный блок может быть записан на флэш-носитель. Это явление известно как усиление записи . [13] [14]
Команда TRIM позволяет операционной системе уведомлять SSD о страницах, которые больше не содержат допустимых данных. Для операции удаления файла операционная система помечает сектора файла как свободные для новых данных, а затем отправляет команду TRIM на SSD. После обрезки SSD не сохраняет содержимое блока при записи новых данных на страницу флэш-памяти, что приводит к меньшему усилению записи (меньше записей), более высокой пропускной способности записи (нет необходимости в последовательности чтение-стирание-модификация), тем самым увеличивая срок службы диска.
Различные SSD-накопители реализуют команду несколько по-разному, поэтому производительность может различаться. [3] [9]
TRIM сообщает SSD о необходимости пометить регион LBA как недействительный, и последующие чтения в регионе не вернут никаких значимых данных. В течение очень короткого времени данные могут все еще находиться во флэш-памяти внутри. Однако после выдачи команды TRIM и выполнения сборки мусора восстановление данных может стать затруднительным или невозможным в зависимости от реализации команды в прошивке накопителя. [15]
Команда TRIM полезна только в том случае, если диск ее реализует и операционная система ее запрашивает. В таблице ниже указаны все известные операционные системы и первая версия, поддерживающая команду. Кроме того, старые твердотельные накопители, разработанные до добавления команды TRIM в стандарт ATA, потребуют обновления прошивки, в противном случае новая команда будет игнорироваться. Однако не каждый диск можно обновить для поддержки обрезки.
Поддержка TRIM также зависит от возможностей конкретного драйвера файловой системы в операционной системе, поскольку только программа, понимающая, какие части диска являются свободным пространством, может безопасно выполнить эту команду, а на системном уровне эта возможность, как правило, заложена в самом драйвере файловой системы.
Операционная система | Поддерживается с | Примечания |
---|---|---|
DragonFly BSD | 2011-05Май 2011 [16] | |
FreeBSD | 2010-078.1 – июль 2010 г. [17] | Поддержка была добавлена на уровне блочных устройств в 8.1. Поддержка файловой системы была добавлена в FreeBSD 8.3 и FreeBSD 9, начиная с UFS . [18] Поддержка обрезки ZFS была добавлена в FreeBSD 9.2. [19] [20] FreeBSD 10 поддерживает обрезку в конфигурациях программного RAID . [21] |
NetBSD | 2012-10Октябрь 2012 г. [22] | |
линукс | 2008-12-252.6.28–25 декабря 2008 г. [23] | Первоначальная поддержка операций сброса была добавлена для флэш-устройств FTL NAND в версии 2.6.28. Поддержка команды ATA TRIM была добавлена в версии 2.6.33. [24] Не все файловые системы используют trim. Среди файловых систем, которые могут автоматически выдавать запросы на обрезку, находятся ext4 , [25] Btrfs , [26] FAT , GFS2 , JFS , [27] XFS , [28] ZFS , [29] и NTFS-3G . Однако в некоторых дистрибутивах это отключено по умолчанию из-за проблем с производительностью [30] в пользу запланированной обрезки на поддерживаемых SSD. [31] Ext3 , NILFS2 и OCFS2 предлагают ioctl для выполнения офлайн-обрезки. Спецификация TRIM требует поддержки списка диапазонов обрезки, но с версии ядра 3.0 trim вызывается только с одним диапазоном, который медленнее. [32] Во многих новых дистрибутивах Linux systemd предоставляет единицу |
macOS | 2011-06-2310.6.8–23 июня 2011 г. [35] | Хотя драйвер блочного устройства AHCI получил возможность отображать, поддерживает ли устройство операцию TRIM в версии 10.6.6 (10J3210), [36] сама функциональность оставалась недоступной до версии 10.6.8, когда операция TRIM была представлена через IOStorageFamily и была добавлена поддержка файловой системы (HFS+). [ требуется ссылка ] До версии 10.10.4 Mac OS X изначально включала TRIM только для SSD-накопителей под брендом Apple; для других марок доступны сторонние утилиты, позволяющие включить его. Старые сторонние драйверы TRIM перестали работать с обновлением Yosemite. [37] Теперь существуют обновленные драйверы, которые работают с OS X Yosemite. [38] [39] В обновлении Mac OS X 10.10.4 Apple добавила утилиту командной строки, trimforce , которую можно использовать для включения TRIM на сторонних SSD-накопителях. [40] |
Майкрософт Виндоус | 2009–10Windows 7 и Windows Server 2008 R2 – октябрь 2009 г. [41] [42] | Windows 7 изначально поддерживала TRIM только для дисков семейства AT Attachment, включая Parallel ATA и Serial ATA , и не поддерживала эту команду для любых других устройств, включая твердотельные накопители Storport PCI-Express, даже если само устройство принимало команду. [43] Подтверждено, что с собственными драйверами Microsoft команда TRIM работает в Windows 7 в режимах AHCI и legacy IDE / ATA. [44] Windows 8 и более поздние операционные системы Windows поддерживают команду unmap для устройств, использующих стек драйверов SCSI, включая протокол USB Attached SCSI (UASP). Windows 8.1 и более поздние операционные системы Windows поддерживают команду TRIM для твердотельных накопителей NVM Express . Microsoft выпустила обновление для Windows 7, которое добавляет поддержку NVM Express, включая TRIM для твердотельных накопителей PCIe. [45] [46] Известно, что TRIM поддерживается для ReFS и NTFS , обе из которых реализуют переключатель DisableDeleteNotify для его отключения. [47] Источники расходятся во мнениях относительно того, существует ли поддержка TRIM для других файловых систем. |
OpenSolaris | 2010-07Июль 2010 [48] | |
андроид | 2013-74.3 [49] – 24 июля 2013 г. [50] | Запускается fstrim автоматически каждые 24 часа, если устройство не использовалось в течение как минимум часа и заряжено как минимум на 80% (30%, если подключено к зарядному устройству). [49] |
По состоянию на январь 2017 года [обновлять]поддержка команды TRIM не реализована в большинстве аппаратных технологий RAID . Однако программные реализации RAID часто включают поддержку TRIM.
Windows 10 предлагает поддержку TRIM в томах SSD ID с помощью параметра «оптимизировать диски» при настройке тома RAID.
Драйвер RAID macOS не поддерживает TRIM. Это справедливо для всех версий Mac OS X от 10.7 до macOS 10.12.x.
TRIM поддерживается для томов RAID (0,1,4,5 и 10) при использовании стороннего приложения SoftRAID®, включая поддержку TRIM с устройствами SSD сторонних производителей. (Примечание: TRIM для устройств SSD сторонних производителей необходимо включить с помощью команды терминала «sudo trimforce enable».)
TRIM доступен с томами RAID в версиях ядра Linux dmraid , выпущенных после января 2011 года, в которых реализована поддержка «поддельного аппаратного RAID» с помощью BIOS, и которая теперь пропускает любые запросы TRIM из файловой системы, расположенной в массиве RAID. [51]
Не путать с dmraid, универсальная программная RAID-система Linux, mdraid , имеет экспериментальную поддержку пакетной (а не живой, при удалении файлов ) TRIM на массивах RAID 1, когда системы настроены на периодический запуск утилиты mdtrim на файловых системах (даже таких, как ext3 без собственной поддержки TRIM). [52] В более поздних версиях Linux, например, Red Hat Enterprise Linux 6.5 и выше, mdraid фактически поддерживает передачу команд TRIM в реальном времени, а не просто как пакетное задание. [53]
Однако Red Hat не рекомендует использовать программные уровни RAID 1, 4, 5 и 6 на SSD с большинством технологий RAID, поскольку во время инициализации большинство утилит управления RAID (например, mdadm в Linux ) записывают данные во все блоки на устройствах, чтобы гарантировать правильную работу контрольных сумм (или проверок от диска к диску в случае RAID 1 и 10), заставляя SSD полагать, что все блоки, кроме резервной области, используются, что значительно снижает производительность. [54]
С другой стороны, Red Hat рекомендует использовать RAID 1 или RAID 10 для LVM RAID на SSD, поскольку эти уровни поддерживают TRIM («discard» в терминологии Linux), а утилиты LVM не записывают данные во все блоки при создании тома RAID 1 или RAID 10. [53]
В течение короткого времени в марте 2010 года пользователи были убеждены, что драйверы Intel Rapid Storage Technology (RST) 9.6 (и более поздние версии) в Windows 7 поддерживают TRIM на томах RAID, но позже Intel пояснила, что TRIM поддерживается для настроек BIOS в режиме AHCI и режиме RAID, но не в том случае, если диск является частью тома RAID. [55]
По состоянию на август 2012 года Intel подтверждает, что чипсеты 7-й серии с драйверами Rapid Storage Technology (RST) 11.2 поддерживают TRIM для RAID 0 в Microsoft Windows 7. [56] Хотя Intel не подтвердила поддержку чипсетов 6-й серии, энтузиасты оборудования продемонстрировали работу TRIM на томах RAID 0 на чипсетах Z68, P67 и X79 с модифицированным ПЗУ RAID . [57] Предполагается, что отсутствие официальной поддержки чипсетов 6-й серии связано со стоимостью проверки [58] или попыткой побудить потребителей к обновлению, [59] а не с техническими причинами.
Исключением из необходимости использования модифицированного дополнительного ПЗУ на материнских платах с чипсетом X79 является случай, когда производитель добавил переключатель ПЗУ; это подразумевает, что и ПЗУ RST, и ПЗУ RST-E находятся внутри BIOS/UEFI. Это позволяет использовать ПЗУ RST вместо ПЗУ RST-E, позволяя TRIM функционировать. [60] Intel отмечает, что наилучшей производительности можно добиться, используя драйвер той же версии, что и ПЗУ; например, если в BIOS/UEFI есть дополнительное ПЗУ 11.0.0.0m, следует использовать драйвер версии 11.x. [61]
Если файловая система автоматически не поддерживает TRIM, некоторые утилиты могут отправлять команды обрезки вручную. Обычно они определяют, какие блоки свободны, а затем передают этот список в виде серии команд обрезки на диск. Эти утилиты доступны от различных производителей (например, Intel, [62] G.Skill [63] ), или как общие утилиты (например, hdparm "wiper" Linux начиная с версии 9.17, [64] [65] или mdtrim, как упоминалось выше). И hdparm, и mdtrim находят свободные блоки, выделяя большой файл в файловой системе и решая, какому физическому расположению он был назначен.
Независимо от операционной системы, диск может определить, когда компьютер записывает все нули в блок, и освободить (обрезать) этот блок вместо записи блока нулей. Если чтение освобожденного блока всегда возвращает нули, этот ярлык прозрачен для пользователя, за исключением более быстрой записи (и чтения) блоков из всех нулей, в дополнение к обычному преимуществу более быстрой записи в неиспользуемые области. Операционные системы не записывают все нули, чтобы «стереть» файлы или освободить место, но некоторые утилиты делают это.
Спецификация команды TRIM [66] была стандартизирована как часть стандарта интерфейса AT Attachment (ATA), возглавляемого Техническим комитетом T13 Международного комитета по стандартам информационных технологий (INCITS). [67] TRIM реализована в команде DATA SET MANAGEMENT (код операции 06h) проекта спецификации ACS-2. [68] Стандарт ATA поддерживается как параллельным (IDE, PATA), так и последовательным (SATA) оборудованием ATA.
Недостатком оригинальной команды ATA TRIM является то, что она была определена как не подлежащая очереди команда и поэтому не могла легко смешиваться с обычной рабочей нагрузкой очередных операций чтения и записи. SATA 3.1 представила поставленную в очередь команду TRIM, чтобы исправить это. [69]
Существуют различные типы TRIM, определяемые словами SATA 69 и 169, возвращаемыми командой ATA IDENTIFY DEVICE:
В SATA Word 105 есть дополнительная информация, описывающая максимальное количество 512-байтовых блоков на команду DATA SET MANAGEMENT, которые может поддерживать диск. Обычно это значение по умолчанию равно 8 (или 4 кБ), но многие диски уменьшают его до 1, чтобы соответствовать аппаратным требованиям Microsoft Windows для TRIM, то есть время выполнения команды не должно превышать 20 мс или 8 мс × (количество записей диапазона LBA), в зависимости от того, что больше, и всегда должно быть меньше 600 мс. [70]
Отдельный диапазон LBA называется LBA Range Entry и представлен восемью байтами. LBA выражается первыми шестью байтами LBA Range Entry, а Range Length — это счетчик с нулевой базой (например, 0=0 и 1=1), представленный оставшимися двумя байтами. Если двухбайтовая длина диапазона равна нулю, то LBA Range Entry будет отброшена как заполнение. [71] Это означает, что для каждого 512-байтового блока диапазонов TRIM, поддерживаемых устройством, максимум составляет 64 диапазона по 32 МБ или 2 ГБ. Если устройство поддерживает SATA Word 105 на уровне 8, то оно должно иметь возможность обрезать 16 ГБ за одну команду TRIM (DATA SET MANAGEMENT).
SCSI предоставляет команду UNMAP (полный аналог TRIM) и команду WRITE SAME (варианты 10 и 16) с установленным флагом UNMAP. [72]
Команда MultiMediaCard и SD ERASE (CMD38) обеспечивает схожую функциональность с командой ATA TRIM, хотя она требует, чтобы стертые блоки были перезаписаны нулями или единицами. Подоперация DISCARD дополнительно определена в eMMC 4.5 и опционально в картах SDHC и SDXC, что более близко соответствует ATA TRIM в том, что содержимое сброшенных блоков можно считать неопределенным (т. е. «неважно»).
Набор команд NVM Express имеет общий набор команд Dataset Management для указания намерения хоста устройству хранения на наборе диапазонов блоков. Одна из его операций, DEALLOCATE, выполняет обрезку. Он также имеет команду WRITE ZEROES, которая предоставляет подсказку DEALLOCATE и позволяет диску обрезать и возвращать нули.
Эти устройства занесены в черный список в libata-core.c ядра Linux для принудительной отправки на эти диски команд TRIM, не поставленных в очередь ( ATA_HORKAGE_NO_NCQ_TRIM ), вместо поставленных в очередь команд TRIM: [80]
Этот файл также заносит SuperSSpeed S238 в черный список для TRIM в целом из-за того, что он приводит к потере данных неправильными блоками при выдаче TRIM. [80] [81]
libata-core.c также имеет белый список для перечисления SSD, которые надежно известны сопровождающим подсистемы для правильной реализации флагов DRAT и RZAT ( ATA_HORKAGE_ZERO_AFTER_TRIM
), а не игнорируют их, как делают многие диски. Белый список дисков следующий: [80]
Microsoft добавила эту функцию в обновление Windows 7, известное как KB2990941.