Сообщение от rubel
|
Вопрос стоял в том, бывают ли SSD где контроллер автоматом очищает старые ячейки, которые остаются при перезаписи файлов. Ведь в таком случае от ОС должна передаваться информация о том, копируется ли файл(ячейка) либо перезаписывается... А оно ему надо(контроллеру SSD)? знать все эти подробности
|
Контроллер SSD может стирать ячейки автоматом только тогда, когда он знает, что они не содержат актуальной информации.
А это происходит в двух случаях:
1) ОС производит запись по логическому адресу, по которому она уже запись производила, контроллер SSD для скорости записал полученные данные в заранее стертые блоки по другому физическому адресу, а ранее соответствовавшие данному логическому адресу блоки - пометил как свободные.
2) ОС передала контроллеру SSD команду управления с атрибутом TRIM, сообщив, что данные по такому-то логическому адресу больше не нужны, опять же накопитель помечает физические блоки, соответствующие данному логическому адресу, как свободные (разумеется, и контроллер SSD и драйвер файловой системы ОС должны поддерживать этот самый атрибут TRIM).
В обоих случаях во время простоя контроллер SSD ищет блоки, помеченные "свободными", но физически еще не стертые, и выполняет их физическое стирание, в результате чего они снова доступны для быстрой записи.
Если TRIM не поддерживается или отключен, то из-за того, что драйвер ФС рассчитан на работу с HDD, и не стесняется при перезаписи файлов каждый раз записывать их "на новое место" (то есть по новым логическим адресам), а большой новый файл записать не фрагментами на появившиеся ранее свободные места между другими файлами, а на подходящий свободный участок (в том числе никогда ранее не использовавшийся), у SSD постепенно появляется много блоков, которые контроллер обязан считать содержащими актуальную информацию (хотя с точки зрения драйвера ФС эти блоки ее не содержат - файл давно стерт или перезаписан по другим логическим адресам), так как они связаны с логическими адресами по которым ранее была запись.
В итоге при очередной команде записи от драйвера "чистых" блоков у контроллера нет, и он начинает действовать как контроллер HDD - записывать информацию строго по тем физическим адресам, которые уже ранее связаны с требуемыми логическими, и каждый раз для того, чтобы записать - сначала стирает блок. Что и приводит к падению скорости, а также усиленной деградации блоков, принадлежащих часто перезаписываемым логическим адресам.
Именно в этом случае, кстати, рецепт Индюка (оставлять некоторую часть диска неразмеченной) реально работает: к логическим адресам неразмеченной области драйвер ФС по понятным причинам не обращается, и у контроллера SSD всегда есть "буферный резерв" в размере этой области, гарантированно
не занятый данными, неактуальными с точки зрения драйвера ФС, но актуальными (привязанными к логическому адресу) с точки зрения контроллера SSD, чтобы при очередной записи переносить "привязку" логического адреса на ранее стертые свободные физические адреса блоков, и "автоматом" очищать блоки, ранее привязанные к тому же логическому адресу.
А если TRIM поддерживается и включен, то все неактуальные "сектора" и так будут очищаться, и достаточно просто поддерживать небольшой процент объема SSD свободным.