Почва для появления Quad-Level Cell была подготовлена ускоренной эволюцией NAND. Одна ячейка смогла вместить два, три и вот уже четыре бита. Это потребовало незаурядных усилий, потому что шаг в сторону уплотнения информации (16 состояний дают 4 бита на ячейку) обусловлен использованием дискретно-аналоговой обработки сигналов. Чем их больше, тем сложнее их дифференцировать, особенно, при записи, когда нужно точно дозировать уровень и длительность электрического воздействия на ячейку. В итоге, усложнение технологии приводит к ухудшению скоростных характеристик QLC, но компенсируется низкой ценой NAND-матрицы и ростом ее объема.
Тренируемся на SATA-дисках
Изначальным полигоном для Quad-Level Cell стали SATA-диски. Теоретический предел в 600MBPS позволяет максимально эффективно использовать небыстрые четырехуровневые ячейки в SSD SATA. Что, впрочем, не закрывает дорогу QLC и в серверный сегмент NVMe-устройств: Intel днями анонсировал такие накопители в форм-факторах U.2 и EDSFF («ruler»), емкостью от 15 до 30 терабайт, доказав, что на основе QLC можно проектировать устройства экстремально большого объема, реализующие эффективную политику двухуровневого кэширования (DRAM + SLC). Снижение надежности хранения при этом компенсируется кодами коррекции ошибок.

Оценим таланты QLC по SSD-накопителю ASU630SS-480GQ производства ADATA Technology. Дирижирует там всем MAS0902, реализующий интерфейс между запоминающей матрицей и SATA-шиной, разработанный опытной командой Maxiotek, дочернего предприятия JMicron. Как водится, документации на чип нет, информация об особенностях MAS0902 тоже весьма скудна. Известно, что контроллер обходится без внешнего DRAM, что совсем не означает отсутствие буфера обмена. Нет в его работе и алгоритмов сжатия. Зато в духе времени в обязательном порядке реализовано SLC-кэширование.

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

Как видим, результаты последовательных операций близки к теоретическому пределу. Фрагментированный блочный обмен по 4К «все расставляет на свои места», выявляя первую аномалию: чтение становится впятеро медленнее записи.
Нативный Java-тест
Разобраться в этом парадоксе попытаемся с помощью NIOBench. Он облегчит интерпретацию неочевидных процессов, происходящих как внутри контроллера Maxiotek MAS0902, так и в запоминающих ячейках 3D NAND с QLC-архитектурой. Хотя в природе есть много кастомизируемых бенчмарок, способных построить любой сценарий тестирования, в случае NIOBench при дефолтных (или близких к дефолтным) настройках можно эффективно выявить особенности SSD-накопителя.
Уже после серии экспериментов было принято решение опубликовать ряд промежуточных результатов, иллюстрирующих реакцию SATA-накопителя ADATA SU630 на изменение тестовой нагрузки.

Вариативность скорости записи вскрывается при углублении тестирования ADATA SU630. Если на 10 итерациях производительность устройства релевантна результатам, полученным в последовательном тесте AS SSD (463MBPS против 449MBPS), удвоение количества измерительных циклов в NIOBench снижает скорость записи втрое, до 135MBPS. Полная глубина исследования дает еще более реальную картину: для QLC в составе SU630 предел возможностей — чуть более 100MBPS.

Поскольку в сценарии теста Unbuffered Native операции чтения и записи чередуются, логично предположить, что тестируемый накопитель ADATA SU630, как видно, после некоторого количества итераций уже не успевает подготовить SLC-кэш — его заполнение происходит быстрее освобождения. Важный вопрос: почему не успевает? Из-за того, что QLC банально медленнее или из-за недоработанной микропрограммы? Изменится ли количество итераций, после которого происходит спад, в результате обновления прошивки?
Огромное значение имеет объем кэширующей области и стратегия ее использования в контексте акселерации чтения и записи. Если регионы NAND-матрицы выделяются под SLC-кэш динамически (одни и те же ячейки могут взаимно переопределяться из SLC в QLC), то обновление прошивки может изменить ситуацию.
Возможно ADATA в сотрудничестве с Maxiotek намеренно манипулирует этим параметром, позиционируя устройства в разные ценовые ниши. Реализуется это не сложно — в ячейке, способной хранить 4 бита, можно использовать только два состояния, выбрав их наиболее разумным способом. По критерию устойчивости чтения логично использовать пару крайних состояний, максимально избегая взаимного влияния. Энергосбережение записи требует двух смежных состояний. Выбор будет трудным компромиссом, детали которого нам неизвестны.
Парадокс блочного чтения
Возвращаясь к обмену блоками по 4K, который в AS SSD продемонстрировал скорость чтения худшую, чем скорость записи, можно осторожно выстроить гипотезу этого парадокса. В данном сценарии теста осуществляется доступ к фрагментированным данным. На момент получения запроса часть блоков запоминающей матрицы может быть занята длительными операциями, прерывать которые невозможно или нежелательно — это операции стирания и записи. Ожидание их завершения, как мы видим по производительности записи в NIOBench, многократно увеличивает время обработки запроса. Даже одно «невезение», связанное с необходимостью обращения к занятому блоку, на серию из тысячи запросов приведет к заметному падению скорости чтения.
Почему такого «невезения» не случается при записи? Даже в условиях перегрузки SLC-кэширования накопитель может сохранить записанные данные в первый свободный блок, компенсируя такую релокацию внесением изменений в адресные таблицы, расписание операций отложенной записи и другие структуры. При чтении места для маневра нет — нужно обратиться конкретно к тому блоку, который хранит искомые данные. А если он занят, приходится ждать.
Фундаментальный факт: при чтении подмена адресуемого блока невозможна, при записи возможна, делает операцию записи более «маневренной» для спекулятивных алгоритмов, реализуемых firmware накопителя.
Квант оптимизма
Очевидно, проектирование любого технического устройства является компромиссом. Увеличение плотности хранения, реализованное в запоминающих устройствах на основе QLC NAND достигнуто ценой некоторого снижения скоростных характеристик физических носителей информации. Один из основных путей преодоления этого противоречия, в частности SLC-акселерация, состоит в использовании интеллектуальных алгоритмов, реализуемых в прошивке накопителя.
Увы, устройство не содержит дискретных микросхем DRAM, а точные сведения о внутреннем ОЗУ интерфейсного контроллера отсутствуют. Логично предположить, что его характеристики скромны, и в этом контексте следует в первую очередь говорить о рабочем ОЗУ встроенного процессора, а не о кэшировании данных. Могут ли скоростные показатели устройства улучшиться с обновлением firmware? Небольшой повод для оптимизма в ответе на этот вопрос дает динамическое SLC-кэширование, алгоритмы и численные параметры которого не фиксированы аппаратным дизайном и находятся во власти внутренней микропрограммы накопителя.