Сегодня SSD стоят почти в любом компьютере. По себе знаю, что люди часто видят диск как просто пространство для файлов и не думают о том, как он внутри работает. А о том, как он справляется с удалениями и записями, и подавно. Тем не менее, хотелось бы знать, что помогает SSD быть быстрее и служить дольше. 

В этой статье я расскажу основные особенности очистки памяти и рассмотрю, как она взаимосвязана с командой TRIM. Детали под катом.

Введение

Годами мы привыкли оценивать диски по двум параметрам — скорости и объёму. Всё остальное воспринималось как второстепенное. При этом к устройствам хранения обычно есть ещё пара негласных требований. Они должны быть компактными, тихими и экономными, особенно если речь про ноутбуки и портативные накопители. И главное — они должны оставаться доступными по цене, иначе массового применения не будет.

Если смотреть на работу дисков глазами обычного пользователя, то кажется, что SSD и HDD делают одно и то же. Сохранили файл, удалили файл — какая разница, кроме скорости? Но, конечно, всё устроено куда сложнее. Принципиально разное устройство накопителей — это понятно, а вот логика их работы куда интереснее. Вот какая разница в алгоритмах.

Я постараюсь кратко объяснить основное, чтобы стало понятнее, почему удаление на SSD — не то же самое, что на HDD.

На обычном жёстком диске (HDD) всё прозрачно. При записи данные сохраняются на диске, а их расположение — в специальной таблице. Когда вы удаляете файл, из таблицы удаляется только адрес этого файла. Сами биты остаются на месте до тех пор, пока какие-то новые данные их не перезапишут. Поэтому программы восстановления могут найти «следы» старых файлов и вернуть их.

SSD работает не так. В основе большинства SSD лежит флеш-память с архитектурой NAND. Понимание устройства ячеек NAND — ответ, почему SSD ведут себя иначе и почему удаление и запись данных устроены так, как устроены. Простыми словами, это последовательное соединение транзисторов, каждый из которых хранит заряд на плавающем затворе. 

Суть в следующем: наличие или отсутствие заряда (и его уровень) меняет пороговое напряжение транзистора. Во время чтения подается проверочное напряжение. Если транзистор открывается (пропускает ток), то на битовой линии фиксируется одно значение бита (например, ноль), если остается закрытым — другое значение (например, единица). Благодаря такой схеме можно компактно объединять множество транзисторов, а запись данных осуществляется методом туннелирования FN (Фаулера-Нордхайма).

Архитектура NAND. Источник.
Архитектура NAND. Источник.

Данные в нём лежат не в одном большом массиве, а по мелким блокам памяти. Минимальная единица записи — это страница (page), в современных SSD-шниках она обычно от 4 КБ до 16 КБ. Эти страницы объединяются в более крупные блоки. У них есть свое название, блоки стирания (erase blocks), размер у них обычно около 512 КБ, хотя в современных накопителях встречаются блоки размером 1 МБ и даже 2 МБ. 

И тут важный нюанс. Нельзя взять и перезаписать отдельные данные внутри блока: чтобы записать новую страницу, сначала нужно стереть весь блок целиком. Поэтому управление записью и удалением на SSD требует дополнительных алгоритмов и команд.

То есть, для записи в уже использованный блок данных контроллер SSD сначала должен скопировать все действительные данные (которые ещё используются) и записать их в пустые страницы другого блока, очистить все страницы в текущем блоке (от живых и мёртвых данных). Только после такой очистки контроллер начинает запись новых данных в уже освобождённый блок.

Пространство, занимаемое удалёнными данными, получает что-то вроде метки «невалидное» и больше не используются. Пока не выполнена специальная очистка, контроллер не записывает новые данные поверх таких участков.

Что такое TRIM

Так мы и подошли к термину — TRIM (англ. to trim — подрезать). Это команда интерфейса стандарта ATA (Advanced Technology Attachment), которая позволяет операционной системе уведомить твердотелку о том, какие блоки данных или страниц не несут полезной нагрузки и их можно не хранить физически.

Проще говоря, TRIM (в терминах SCSI её аналог — UNMAP) сообщает SSD, какие данные можно удалить. Когда вы удаляете файлы, создаёте или форматируете разделы, ОС формирует список логических адресов (LBA). Их она объявляет незанятыми, и отправляет этот список контроллеру SSD, помечая эти блоки как свободные для повторного использования. 

Благодаря этому SSD не тратит лишние ресурсы на запись в «мусорные» области, а встроенный механизм сборки мусора (garbage collection) эффективнее объединяет свободное пространство. 

Когда контроллер получает команду TRIM, он помечает указанные LBA как свободные. Но это не значит, что данные тут же стираются физически — и именно в этом суть TRIM, а заодно и причина, почему многие неправильно представляют себе работу механизма. Всё остальное, например, какие именно данные контроллер вернёт при обращении к этим ячейкам — зависит от прошивки, внутренней архитектуры и заводских настроек накопителя.

Запись данных на пустой и уже заполненный диски. Источник.
Запись данных на пустой и уже заполненный диски. Источник.

TRIM играет ключевую роль в управлении хранилищем. Даже после удаления файлов они некоторое время физически занимают место на диске. Пока это пространство не очищено, эффективность работы накопителя может падать, а доступный объём — уменьшаться.

Так команда TRIM влияет на долговечность твердотельного накопителя. Если данные постоянно записываются и стираются из одних и тех же ячеек NAND, эти ячейки теряют целостность. Для оптимального срока службы каждая ячейка должна использоваться примерно с той же интенсивностью, что и другие ячейки.

Это называется выравниванием износа или wear leveling. То есть постоянное перемещение данных между разными ячейками, чтобы все ячейки изнашивались равномерно. И только сам контроллер знает, где именно в данный момент лежит конкретный фрагмент файла. ОС не имеет доступа к этой карте и не может управлять размещением блоков.

Что же происходит после получения TRIM

TRIM сам по себе — это всего лишь список адресов блоков, которые ОС считает свободными или уже неиспользуемыми. Когда вы удаляете файл или выполняете «дефрагментацию» на SSD — начинается самое интересное: что с этими блоками делает контроллер, зависит от множества факторов.

Он может стереть их сразу, а может подождать, пока накопится определённое количество освобождённых блоков или появится момент простоя. Иногда он просто обновляет карту валидных блоков, иногда сразу записывает нули, а иногда даже переключает ячейку в другой режим, чтобы ускорить будущие записи.

На поведение контроллера влияют модель и поколение контроллера, версия прошивки, наличие и загрузка динамического pSLC-кэша, алгоритмы Garbage Collection, степень износа ячеек, приоритет фоновой очистки и текущая нагрузка на накопитель. Вариантов на самом деле очень много, и предсказать их все невозможно.

Для обычного пользователя и даже для специалиста по восстановлению данных важен один факт: после TRIM, почти всегда, если вы попытаетесь прочитать эти блоки, контроллер вернёт нули — даже если физически данные ещё не удалены. Это работает для подавляющего большинства современных SSD — как SATA, так и NVMe.

Нашел еще вот такую визуализацию работы TRIM. Источник.
Нашел еще вот такую визуализацию работы TRIM. Источник.

Поддержка SSD TRIM 

Microsoft 

Microsoft Windows, начиная с версии 7 и выше, поддерживает функцию Trim. Она запускается автоматически в фоновом режиме, если вы её не отключили. Вы можете запустить её вручную или проверить, включена ли функция Trim. 

Для этого просто пропишите в командной строке, запущенной от имени администратора:

fsutil behavior query DisableDeleteNotify
  • DisableDeleteNotify = 0 означает, что Trim включён (функция уведомления об удалении не отключена).

  • DisableDeleteNotify = 1 означает, что Trim отключён. 

Системы Windows XP и Vista Trim-функцию не поддерживают. 

Apple 

В MacOS с твердотельными накопителями Apple встроены функции Trim и Active Garbage Collection. Некоторые версии MacOS поддерживают твердотельные накопители сторонних производителей с дополнительным программным обеспечением или требуют активации через команду sudo trimforce enable в терминале. Чтобы проверить наличие поддержки Trim, выберите меню Apple, удерживая клавишу Option. В разделе «Информация о системе» найдите название вашего интерфейса хранилища в разделе «Оборудование». В поле «Поддержка TRIM» будет указано «Да» или «Нет».

RAID-массивы

Большинство RAID-массивов (избыточных массивов независимых дисков) не поддерживают функцию Trim, хотя ситуация меняется. С каждым поколением всё больше RAID-программ поддерживают Trim, поэтому уточните, какое именно программное обеспечение подходит именно вам.

Если вы используете Ubuntu версии 14.04 и выше, то включать функцию TRIM дополнительно не требуется. В данной системе она работает по умолчанию.

Как проверить поддержку TRIM 

Всё-таки если вам захотелось проверить, то протестировать работу TRIM несложно. Достаточно иметь доступ к компьютеру с Linux. Этот метод стирает данные, так что позаботьтесь заранее о своих мемах с котиками критических данных. 

Мы записываем на диск небольшой кусочек данных, потом посылаем команду TRIM и смотрим, что осталось на месте этих данных.

Для начала подключаем диск напрямую и делаем так:

1. Записываем известную сигнатуру в определённый сектор (например, 512 байт):

echo "TESTDATA1234567890" | dd of=/dev/sdX bs=512 seek=1000 count=1

2. Проверяем, что запись прошла успешно:

dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C

3. Отправляем команду TRIM (discard) на этот сектор (/dev/sdX меняем на адрес накопителя):

blkdiscard -o $((1000*512)) -l 512 /dev/sdX

4. Снова читаем сектор и смотрим результат:

dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C

Если после TRIM-сектор очищен (данные ушли, обычно возвращаются нули), значит команда работает.

Ещё один вариант, это проверить, как TRIM ведёт себя через блокиратор записи. Это такая штука, которая применяется в компьютерной криминалистике для защиты улик от изменений.

После прочтения вам может стать интересно, действительно ли блокиратор записи умеет блокировать не только запись, но и команду TRIM, это можно проверить. Опять же, на диске, на котором нет никаких важных данных. 

Сначала убедитесь, что TRIM вообще работает, сначала выполнив предыдущую последовательность. Затем мы проверим поведение через блокиратор. Повторите шаги записи сигнатуры и проверки её наличия из первого сценария, используя новую строку:

echo "TESTTRIM1234567890" | dd of=/dev/sdX bs=512 seek=1000 count=1
dd if=/dev/sdX bs=512 skip=1000 count=1 | hexdump -C

Теперь переподключите диск через блокиратор, смонтируйте его снова и выполните команду TRIM на том же секторе:

blkdiscard -o $((1000*512)) -l 512 /dev/sdX

После этого проверьте содержимое сектора ещё раз (используя команду dd из первого примера). И если вернутся нули, значит, команда TRIM срабатывает даже через защитное устройство.

Заключение

Функция продлевает срок службы накопителя, так как flash-память ограничена по числу циклов записи и при постоянной очистке многократное использование одних и тех же блоков невозможно. Кроме того, сам SSD будет работать гораздо быстрее.

Прямой связи между скоростью записи и использованием TRIM нет. Главное, что влияет на скорость, это количество свободных блоков во flash-памяти, которые контроллер уже очистил и готов использовать для записи новых данных.

Иначе говоря, если на диске осталось свободное место, обычно около 30-35% от общей ёмкости, контроллер эффективно управляет этой областью и поддерживает высокую скорость записи. Если же диск почти заполнен, то даже при активном TRIM скорость записи будет ниже, так как накопителю приходится сначала очищать блоки перед записью.

Что вы думаете по этому поводу? Делитесь мнением в комментариях.

© 2025 ООО «МТ ФИНАНС»

Комментарии (25)


  1. useribs
    22.11.2025 13:27

    Не хватает раздела с Linux, а именно про разные файловые системы. Где-то это реализовано по таймеру fstrim, где-то как sync/async discard. Ну и у хостеров, например, как и для чего используется TRIM внутри гостевых ОС (при thin provisioning сообщить виртуализации storage что это место свободно, при отсутствии trim занятое место будет расти до победного)


  1. MountainGoat
    22.11.2025 13:27

    HDD не так просты. Shingled HDD имеют буферную зону, куда пишут новый файл сначала, а потом при простое переносят его в основную. Копия в буферной зоне при этом физически не стирается конечно. И сомневаюсь, что всякие secure delete могут её стереть.

    TRIM таким HDD тоже нужен, потому что они постоянно в себе что-то шебуршат, реорганизуют и упаковывают. Так что пусть хотя бы не шебуршит заведомым мусором.


    1. useribs
      22.11.2025 13:27

      Точно? Не видел ниразу SMR и какие флаги они поддерживают, но думал что разница между SMR и новомодными zoned HDDs что как раз только последние рассказывают ОС про свое внутреннее устройство.


      1. VADemon
        22.11.2025 13:27

        Честно говоря, наблюдал похожее поведение на "обычных" 10-12 ТБ WD white label HDD, где первые сколько-то гигов шли плавно, на кэш ОС не похоже. Но до твердых чисел не дошел. Поэтому предлагаю держать в голове как гипотезу.


  1. Ava256
    22.11.2025 13:27

    После прочтения вам может стать интересно, действительно ли ваш блокиратор записи умеет блокировать не только запись, но и команду TRIM, это можно проверить. Опять же, на диске, на котором нет никаких важных данных.
    Сначала убедитесь, что TRIM вообще работает, сначала выполнив предыдущую последовательность. Затем мы проверим поведение через блокиратор. Повторите шаги записи сигнатуры и проверки её наличия из первого сценария, используя новую строку.

    Сначала было все нормально, потом из неоткуда появился какой-то блокиратор.
    Так и пишите что это перевод.


    1. ganzmavag
      22.11.2025 13:27

      Кажется там примерно вот такой перевод: https://habr.com/ru/articles/967428/

      Я с начала текста заподозрил неладное, он и по смыслу странный и фразы там какие-то не человеческие, типа

      При записи система не прячет файлы — она сохраняет их координаты в специальной таблице.

      Надо же, а я всегда думал, что смысл записи на жесткий - спрятать файлы.

      Ребят, если это реально нейросеть - остановитесь, пожалуйста. Ну зачем?


      1. nnutts
        22.11.2025 13:27

        А меня стригерило слово "твердотелка". Цитируя упомянутую вами статью, после которой действительно невозможно развидеть слоп:

        Живые копирайтеры обычно не придумывают слова, а если и придумывают — то делают это осознанно в формате "назовем этот эффект Х". <...> ЛЛМ-ка комбинирует токены, у нее нет понимания что придумывать новое нехорошо, для нее придумывание предложений близко к придумыванию слов.


      1. vvzvlad
        22.11.2025 13:27

        Кажется там примерно вот такой перевод: https://habr.com/ru/articles/967428/

        Так автор как бы намекает :)


    1. 15432
      22.11.2025 13:27

      О, многие SATA-USB адаптеры с поддержкой защиты от записи вообще не блокируют никакие команды, а тупо выставляют бит "Read Only" для операционки. При этом команды записи как SCSI, так и ATA Pass Through успешно проходят


  1. magnificentbat
    22.11.2025 13:27

    Статья интересная, но хотелось бы узнать в дополнение - как работает утилита chkdsk на SSD?

    Ведь если на контроллер SSD влиять невозможно, как я понимаю, может возникнуть такая ситуация, что он захочет записать данные в раннее помеченный ОС битый сектор SSD?


    1. VADemon
      22.11.2025 13:27

      Помеченный чем и как? У NTFS есть своя таблица битых блоков.


    1. useribs
      22.11.2025 13:27

      ОС вроде нынче не помечает секторы как битые, а если и пытается, то всеравно все управление резервными блоками и их перераспределение за контроллером ssd/hdd


    1. vvzvlad
      22.11.2025 13:27

      как я понимаю, может возникнуть такая ситуация, что он захочет записать данные в раннее помеченный ОС битый сектор SSD?

      нет, не может. ОС вообще не имеет доступа к raw-секторам. Она просто пишет в "виртуальные" сектора, а трансляцией виртуальные-реальные занимается контроллер и он постоянно эту таблицу модифицирует для выравнивания износа или для CoW, да. В то же время контроллер понятия не имеет, что именно там ОС пишет, что не пишет, куда она пишет, он оперирует просто командами "считать-записать", это касается и данных и таблицы разделов.
      А TRIM это как раз способ сказать контроллеру ссд "вот эти данные ОС не нужны, их можно стирать". Если накопитель не триммить, то он не будет знать, какие данные уже удалены на уровне ОС, и будет пытаться их сохранять (для него все данные однозначны), тратя ресурс ячеек и уменьшая скорость (потому что для скорости надо иметь запас в 20% емкости чтобы CoW был быстрым), пока ОС не перепишет этот виртуальный сектор новыми данными.
      На уровнь ОС битые сектора не попадают вообще (или попадают когда их количество выходит за пределы блоков автокоррекции), их можно получить только через SMART, потому что у ссд есть запас памяти на случай выхода из строя ячеек (ну, точнее, блоков). Причем контроллер умеет определять износ ячеек, и еще до потери данных помечает ячейку как исчерпавшую свой ресурс и записывает ее адрес в специальную таблицу у себя в памяти, чтобы не записывать туда данные.


      1. magnificentbat
        22.11.2025 13:27

        На уровень ОС битые сектора не попадают вообще

        Но ведь тем не менее для SSD chkdsk не только не отключен, но и как раз, как я понимаю, логически помечает битые сектора (https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/chkdsk?tabs=ssd%2Cevent-viewer):

        How chkdsk performs on different media (SSD) - Marking clusters bad is logical, not physical remapping.

        Например если логически утилита пометила битый сектор, то на уровне контроллера он будет считаться просто "не пустым" и, следовательно, не подверженным TRIM? А, например, если будет выполнено быстрое форматирование диска - то данные о том что сектор битый удалятся или нет... В общем с диагностикой и исправлением ошибок на SSD сейчас больше вопросов чем ответов, как мне кажется)


        1. vvzvlad
          22.11.2025 13:27

          А вот тут хз, непонятно как он работает и какой смысл помечать виртуальный сектор плохим. А если он пробрасывает куда-то на уровень контроллера — тоже непонятно, нафига, контроллер это сделает гораздо лучше, у него есть диагностики ячеек, а у ОС нету..


      1. vvzvlad
        22.11.2025 13:27

        Del


  1. chnav
    22.11.2025 13:27

    Вопрос к знатокам. Имеется SSD HP (Samsung) SLC, который не поддерживает TRIM и, тем более, Secure Erase и, тем более, Sanitize.

    Каким паттерном можно заполнить диск, чтобы он был, условно говоря, в "заводском" состоянии - 0x00 или 0xFF ? Я заполнял 0xFF, но теперь не уверен, хранятся ли данные в NAND в прямом или инверсном виде.

    PS: только что пришло в голову сделать Sanitize какому-нибудь более свежему MLC диску, записать один сектор 512 байт и потом считать 16 KB...

    (добавлено) нули отдаёт. Перемудрил )))


    1. VADemon
      22.11.2025 13:27

      Нельзя писать статику, а то контроллер дедуплицировать может. /dev/random довольно медленные, но сойдет. Иначе badblocks в режиме записи как пример, которая рандом из сида генерит.


    1. AlexanderS
      22.11.2025 13:27

      Можно викторией сделать низкоуровневый тест записи выбирая запись номера LBA. Заодно получается статистика по времени доступа к секторам и график скорости. Если взять видавший жизнь SSD и прогнать такой тест, то получается график-расчёска с порой немалыми просадками по скорости, а если прогнать второй раз, то график становится очень даже ровненький.


      1. useribs
        22.11.2025 13:27

        Не факт что виктория "виновата" в таком поведении. Если взять давно не включавшийся ssd, контроллер будет пытаться перезаписать (освежить) все ячейки, так как вообще говоря сохранность данных в выключенном состоянии гарантируется лишь сколько-то месяцев, и чем дольше он без питания, тем больше риск условного bit flip


        1. AlexanderS
          22.11.2025 13:27

          Я к тому что викторией можно "освежить" диск, полностью очистив его в профилактических целях. Так-то понятно что блок в виктории мало общего имеет с блоками, с которыми контроллер SSD работает.


      1. KN_Dima
        22.11.2025 13:27

        На каком типе SSD и какой версии Виктории это сработало?
        Пробовал версию 5.37 примерно на десятке разных SSD, но эффекта восстановления при тесте поверхности - не обнаружил.


        1. AlexanderS
          22.11.2025 13:27

          Victoria 5.37. Samsung 980 500Gb, SATA.


          1. KN_Dima
            22.11.2025 13:27

            У меня лучше работает другой способ - удаляю все разделы с SSD (если данные нужны - делаю копию на другой диск)
            Создаю разделы заново, или восстанавливаю с копии.
            Скорость снова становится как у нового.


    1. vvzvlad
      22.11.2025 13:27

      Каким паттерном можно заполнить диск, чтобы он был, условно говоря, в "заводском" состоянии - 0x00 или 0xFF ? Я заполнял 0xFF, но теперь не уверен, хранятся ли данные в NAND в прямом или инверсном виде.

      Кажется, никаким. Насколько я понимаю, там почти везде щас есть слой шифрования, и secure erase часто заключается в генерации нового ключа шифрования, после чего все данные теряют смысл.
      Но вообще изначально шифрование там для того, чтобы в данных не было длинных последовательности 0/1, а было бы равномерное распределение битов, чтобы износ был равномерным. Поэтому любой паттерн запиши, все одно будет плюс-минус случайные данные на низком уровне