Вопрос может показаться странным: понятно ведь, что кэш (caсhe) — один из уровней (tiers) хранения, на котором временно размещаются данные и к которому организован наиболее скоростной доступ. Значительно более скоростной, чем к основному массиву хранения, будь тот даже выстроен как all-flash. Тем не менее, в свете новейших технологических достижений в области хранения — 3D Xpoint, NVDIMM и пр. — граница между кэшем и прочими уровнями ощутимо размывается. Где же она проходит сегодня, и имеет ли смысл само её существование в перспективе?
Подальше положишь — поближе возьмёшь
Наиболее близкий к рядовому пользователю пример кэширования данных при записи являет самый обыкновенный жёсткий диск в составе настольного ПК или ноутбука. Диск этот располагает несколькими (или несколькими десятками, в зависимости от объёма) мегабайтами внутренней памяти DRAM: энергозависимой, зато крайне высокоскоростной. Кэш обеспечивает контроллеру HDD возможность упорядочивать запись и чтение данных, поскольку сама по себе пачка бешено вертящихся пластин, над которыми мечется коромысло с магнитными головками, не является, строго говоря, устройством прямого доступа к данным в словарном смысле этого слова. Вот в сочетании с кэшем — дело другое.
В системах хранения данных, от наиболее серьёзных NAS до виртуальных ленточных библиотек и all-flash arrays (AFA), кэш также используется в качестве промежуточного звена между внешними источниками информации и собственно средой хранения. Но располагаются в этом кэше чаще всего не только фрагменты записываемых/считываемых данных, но и метаданные: служебные сведения об организации логических томов, о реализованной в данной системе многоуровневой структуре хранения, о действующих процедурах репликации и т. п. Именно с использованием метаданных контроллер СХД имеет возможность с наивысшей возможной эффективностью управлять обменом внушительными потоками информации между высокоскоростными внешними интерфейсами и внутренними (нередко более медленными) средами хранения.
В последнее время, с развитием AFA, в особенности организуемых на основе NVMe-oF, внешние по отношению к СХД системы начинают получать фактически полноценный, без ощутимых дополнительных задержек, доступ к полупроводниковым накопителям в составе AFA — как если бы те были подключены прямо в NVMe-слот на материнской плате той самой внешней системы. Что порождает закономерный вопрос: а нужен ли, собственно, выделенный в качестве кэша дополнительный уровень хранения в составе высокоскоростной современной СХД?
Кэширование хранящихся в системе данных эффективнее всего проявляет себя на операциях последовательного чтения: алгоритм микроконтроллера распознаёт их и заблаговременно размещает в кэш-памяти данные, которые клиент ещё даже не успел запросить. Если же выборка данных с СХД производится в случайном порядке (что случается на практике значительно чаще), кэш выходит едва ли не бесполезен. С одной существенной оговоркой: в случае организации даже в AFA RAID-массива с распределённой чётностью (уровни 5 и 6, 50 и 60) кэш играет чрезвычайно важную роль — даже если не ускоряет фактически ни считывание. ни запись. В отсутствие оптимизации, возможной только при наличии кэша, независимых обращений к носителям данных центральный процессор будет производить слишком много, и система заработает с заметно пониженной производительностью.
Техническая детализация
Кэш в составе СХД практически всегда предназначен для реализации такой важнейшей функции, как копирование переносимых извне на внутренние накопители данных. Принципиальная важность этой функции — в обеспечении сохранности информации, отправленной в систему хранения, в случае аварийной потери питания или иного аппаратного сбоя. Именно поэтому сквозная запись (write-through), в ходе которой информация одновременно записывается и в кэш, и на постоянный носитель уровнем ниже, с точки зрения систем хранения настолько существенна.
Для одиночного HDD режим сквозной записи полностью эквивалентен записи без кэширования. Для системы же накопителей в составе СХД сквозная запись — гарантия целостности доверенных системе хранения данных. Служебная команда, подтверждающая факт реализации записи, будет отправлена на внешний источник данных в режиме write-through лишь после того, как информация фактически окажется записанной и в кэш, и на логический том на следующем, более низком уровне хранения. Безусловно, такой подход отрицательно сказывается на латентности операций записи и, в целом, на производительности системы.
Однако в случае уже упоминавшихся массивов AFA с NVMe-oF задержки при прямой записи на SSD в составе системы хранения настолько ничтожны, что применение кэша в режиме сквозной записи повышает надёжность СХД практически безо всяких гандикапов. Для гибридных или полностью укомплектованных магнитными дисками систем более выигрышным в плане минимизации задержек оказывается режим обходной записи (write-around): данные, минуя кэш (условный нулевой уровень хранения), сразу же попадают на первый уровень. Пока информация лишь записывается на систему хранения в течение продолжительного времени, это вполне себя оправдывает. Однако если только что отправленные на запись данные вдруг снова потребовались внешнему клиенту, в скоростном кэше их не окажется, — и тогда задержка при обращении к основному уровню хранения может оказаться чрезмерно долгой.
Кэширование с отложенной записью (write-back) обеспечивает снижение латентности обращений к СХД за счёт менее надёжной сохранности сохраняемых данных. Информация попадает в высокоскоростной кэш, тот рапортует внешнему источнику об успешно завершённой операции, а затем уже переправляет полученные данные на следующей уровень хранения. Как раз на этом участке возможна потеря информации вследствие различных аппаратных сбоев — зато в плане скорости схема с отложенной записью никаких нареканий не вызывает.
Что имеем, сохраним
Итак, отличительные признаки кэша — это, во-первых, относительно небольшой его объём по сравнению с другими уровнями хранения, а во-вторых, эфемерность и принципиальная вторичность размещаемых там данных. Кэш СХД хранит информацию недолго — чаще всего, ровно столько времени, сколько требуется на запись её на логический том следующего уровня. К тому же ради ускорения операций с кэшем адресация в его пределах производится на уровне отдельных байтов, тогда как более основательные, долгосрочные и ёмкие уровни хранения оперируют данными в довольно крупных блоках.
Разница же между различными уровнями хранения скорее количественная, чем качественная. Скоростные флэш-накопители лучше использовать для размещения часто обновляемых и активно востребованных данных. Виртуальные ленточные библиотеки на базе жёстких дисков — для хранения реже востребованной, но объёмистой информации. Наконец, со старой доброй магнитной лентой и оптическими дисками по показателю эффективности архивного хранения (имеется в виду стоимость размещения 1 Тб данных с гарантированной доступностью на протяжении десятилетий) не сравнится никакой другой цифровой накопитель.
Считанные годы назад цена на сверхвысокоскоростные флэш-накопители с интерфейсами PCIe или NVMe была настолько высока, что вопрос о формировании из них сколько-нибудь значимого по объёму уровня хранения даже не поднимался. Сегодня ситуация принципиально иная, и в этой связи вопрос, вынесенный в заголовок статьи, становится по-настоящему актуальным. Если накопитель, по своим скоростным характеристикам прежде использовавшийся лишь для кэширования данных, теперь может послужить основой для построения верхнего уровня системы хранения — есть ли тогда смысл вообще проводить границу между кэшем и прочими уровнями?
Ответ, как выясняется, зависит от дополнительных условий задачи. Если высокоскоростная среда хранения подключается напрямую к главной коммуникационной шине компьютерной системы, будь то через внутренний интерфейс PCIe или же извне по NVMe-oF, но при этом остаётся достаточно ёмким накопителем (либо массивом накопителей) с блоковой адресацией, то это, безусловно, полноценный уровень (tier), а никакой не кэш.
Однако в последнее время всё большее распространение получает «память класса СХД», или же «хранилище как класс памяти» (Storage Class Memory, SCM). Решения такого класса на базе технологий постоянной памяти (persistent memory, PM) сочетают в себе атрибуты как накопителя данных, так и оперативной памяти. По латентности они вплотную приближаются к модулям DRAM, они допускают побайтную адресацию (один из основных признаков как ОЗУ, так и кэша) и даже подключение по шине DDR, но остаются при этом энергонезависимыми на манер флэш-накопителей.
Фактически, SCM располагается между средами хранения на основе DRAM и NAND по таким показателям, как цена, долговечность и производительность. Память этого типа исходно рассматривалась как кэш для высокопроизводительных СХД, но в перспективе, и особенно с развитием операционных систем нового поколения, явные преимущества побайтовой адресации PM могут вовсе привести к отказу от выделенных подсистем ОЗУ/ПЗУ и к переходу на единый (пусть и дополненный на периферии более медленными уровнями хранения) массив рабочей памяти, с которым ОС и приложения будут взаимодействовать напрямую.
Разительное отличие валовой производительности компьютера такой архитектуры от привычных сегодня решений трудно даже толком оценить, поскольку прямая адресация в отсутствие необходимости непрерывного обмена данными между ПЗУ и ОЗУ самым существенным образом разгружает центральный процессор и внутреннюю шину данных, мобилизует ресурсы системы для выполнения собственно вычислений. Приложения финтеха, аналитика больших данных, задачи машинного обучения и многие другие получают невиданный прежде прирост производительности — продолжая притом основываться фактически на сегодняшней же элементной базе, что особенно важно с точки зрения объёмов инвестиций, требуемых для создания подобных систем.
И вот для действующих вычислителей на базе постоянной памяти само понятие кэша действительно потеряет актуальность — поскольку операции с данными будут производиться непосредственно в едином массиве высокоскоростной, но притом энергонезависимой памяти, служащем как для долгосрочного размещения данных, так и для выполнения операций над ними. При этом в СХД на основе SCM по-прежнему останутся более медленные и ёмкие уровни хранения. Вот только передача данных на эти уровни из основного массива памяти уже не будет требовать дополнительных гарантий целостности либо добавочного ускорения — задач, которые в сегодняшних системах хранения принимает на себя кэш.