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

У твердотельного накопителя другая геометрия

Внутри SSD нет понятия соседних дорожек. Хост обращается по логическим адресам, а контроллер держит таблицу трансляции, которая ставит каждому логическому блоку в соответствие физическую страницу в одном из кристаллов флеш-памяти. Соответствие меняется при каждой перезаписи: обновить страницу на месте нельзя, стирание идёт целыми блоками, поэтому новая версия данных пишется в свободное место, а старая помечается недействительной.

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

Что делает дефрагментация с флеш-памятью

Дефрагментатор не переставляет данные, он их переписывает. Чтобы собрать файл в непрерывный диапазон логических адресов, программа читает фрагменты и пишет их заново, а затем правит метаданные файловой системы. Для накопителя это поток обычных операций записи, каждая из которых расходует ресурс.

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

Настоящий аналог — TRIM и сборка мусора

Твердотельному накопителю нужна не перестановка данных, а информация о том, какие блоки больше не нужны. Файловая система знает, что файл удалён, но накопитель без подсказки продолжает считать его страницы валидными и честно переносит их при сборке мусора. Команда TRIM (в SCSI-мире UNMAP) сообщает контроллеру, что диапазон адресов свободен. После этого страницы помечаются недействительными, блок можно стереть целиком, и запас готовых к записи блоков восстанавливается.

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

Когда фрагментация всё-таки мешает

Полный отказ от темы был бы неточным. Фрагментация вредит и твердотельному накопителю, но по другой причине — через файловую систему, а не через физику носителя. Каждый фрагмент файла — это запись в списке экстентов. Когда фрагментов становятся сотни тысяч, обслуживание такого списка нагружает драйвер файловой системы и раздувает метаданные; у некоторых файловых систем есть жёсткий предел на число экстентов, при достижении которого запись в файл просто прекращается. Такое встречается на томах с моментальными снимками, у гипервизоров с растущими образами дисков и в базах данных с длительной интенсивной дозаписью.

Это лечится не полной дефрагментацией тома, а точечной обработкой конкретного файла либо его пересозданием. Разница принципиальна: обрабатываются единицы объектов, а не весь объём.

Свободное место значит больше, чем порядок

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

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