Назад | Перейти на главную страницу

Ssd TRIM / DISCARD подробности

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

С другой стороны, если я не использую TRIM для пустых блоков, которые ранее использовались файловой системой (скажем, частей файла, содержащих только нули), будут ли какие-либо накладные расходы при записи значимых данных в эти блоки? Другими словами, достаточно ли «умен» SSD, чтобы не выполнять цикл чтения-изменения-записи, поскольку блок уже находится в «основном» состоянии?

Зависит ли этот контроллер (меня больше всего волнует новый Sandforce)?

Что ж, TRIM как команда просто сообщает контроллеру SSD, что блок больше не требуется файловой системе и что контроллер может больше не беспокоиться о блоке, когда он собирает мусор для свободного флеш-пространства. В противном случае SSD должен был бы перемещать блок [теперь удален] во время сборки мусора. Обрезка больших блоков нулей не должна увеличивать износ диска, как раз наоборот, контроллеров с правильной реализацией TRIM. Тем не менее, точное поведение зависит от контроллера, но для целей вашего использования я бы не стал беспокоиться об ОБРЕЗКЕ больших областей нулевого блока, во всяком случае, вы спасете SSD от необходимости копировать блоки нулей, пока он GC. Я не специалист по протоколу SATA, но это кажется довольно ясным выводом из чтения http://en.wikipedia.org/wiki/Write_amplification , особенно http://en.wikipedia.org/wiki/Write_amplification#TRIM .

Ответ Джастина Линна совершенно правильный. Я просто хотел ответить на другую часть вашего вопроса.

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

РЕДАКТИРОВАТЬ: На вопрос о том, что происходит, когда SSD необходимо записать в блок, заполненный единицами, ответить сложнее. Даже если в блоке нет данных, которые необходимо стереть, все равно могут быть метаданные, которые необходимо удалить. Если это не так и блок полностью доступен для записи, это зависит от реализации GC на SSD.

Другая возможность заключается в том, что SSD достаточно умен, чтобы при записи на него LBA с нулевым заполнением он понимал, что нет необходимости записывать данные в NAND. Вместо этого он просто отключает отображение LBA и при запросе данных возвращает нули по умолчанию для немартированных LBA. Я не удивлюсь, если диски SandForce сделают это, поскольку они уже выполняют сжатие и дедупликацию данных. Я не знаю, делают ли это другие SSD.

Я понимаю, что в моем ответе есть много возможностей, возможно, и не знаю, но нет никаких общих правил по этому поводу, которым должен следовать производитель SSD, поэтому решать отдельные производители. Люди, знакомые с этими решениями, не могут говорить о них, поскольку конкретные реализации этих алгоритмов сборки мусора очень важны для производительности SSD.