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

Ячейка хранит несколько бит, и это стоит времени

Флеш-ячейка удерживает заряд, а контроллер интерпретирует уровень заряда как записанное значение. Если различаются всего два уровня, ячейка хранит один бит, а запись сводится к грубому «зарядить или нет» — быстро и с большим запасом по помехоустойчивости. Если уровней восемь или шестнадцать, та же ячейка хранит три или четыре бита, но контроллеру приходится подводить заряд к узкому окну, проверять результат и при необходимости добавлять импульсы. Это итеративная процедура, и каждый лишний бит на ячейку удлиняет её кратно.

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

Что происходит на тридцатой секунде

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

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

Почему объём накопителя влияет на провал

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

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

Роль буфера трансляции

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

Именно поэтому один и тот же накопитель может показывать пристойный результат при копировании фильма и неприятно проседать при распаковке архива с десятками тысяч мелких файлов — механизмы торможения разные.

Когда падение перестаёт быть нормой

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

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