Практическая производительность RAID
Выбор уровня RAID — это упражнение в балансировании множества факторов, включая стоимость, надёжность, ёмкость и, конечно, производительность. Производительность RAID может быть сложна для понимания, особенно когда разные уровни RAID используют разные методы и в некоторых случаях ведут себя весьма по-разному. В этой статье я хочу рассмотреть распространённые уровни RAID 0, 5, 6 и 10, чтобы посмотреть, как различается их производительность.
Для целей этой статьи RAID 1 будет считаться подмножеством RAID 10. Это нередко удобный способ думать о RAID 1 — как просто о массиве RAID 10 с единственной зеркальной парой. Поскольку RAID 1 по сути является однопарным RAID 10 и ведёт себя соответствующим образом, это прекрасно работает для упрощения понимания производительности RAID, поскольку просто вписывается в кривую производительности RAID 10.
Существует два типа производительности для всех видов хранилищ: чтение и запись. С точки зрения RAID чтение крайне просто, а запись достаточно сложна. Производительность чтения фактически стабильна для всех типов RAID. Однако запись — нет.
Чтобы упростить обсуждение производительности, нам необходимо определить несколько терминов, поскольку мы будем работать с некоторыми формулами. В наших обсуждениях мы будем использовать N для обозначения общего количества дисков, часто называемых «шпинделями», в нашем массиве, и X для обозначения производительности каждого диска в отдельности. Это позволяет нам говорить об относительной производительности как коэффициенте от производительности диска, что позволяет абстрагироваться от массива RAID и не думать в единицах абсолютных IOPS. Это важно, поскольку IOPS зачастую очень сложно определить, но мы можем осмысленно сравнивать производительность, рассуждая о ней в контексте отдельных дисков в массиве.
Также важно помнить, что мы говорим только о производительности самого массива RAID, а не всей подсистемы хранения. Такие элементы, как кэши памяти и твердотельные кэши, будут делать удивительные вещи для изменения общей производительности подсистемы хранения, но не изменяют фундаментально производительность самого массива RAID под капотом. Не существует простой формулы для определения того, как различные варианты кэша повлияют на общую производительность, но достаточно сказать, что это влияние может быть очень значительным — хотя оно сильно зависит не только от выбора кэша, но и от рабочей нагрузки. Даже самые большие, быстрые и надёжные варианты кэша не могут изменить долгосрочную устойчивую производительность массива.
RAID — это сложная технология, и на конечную производительность влияет множество факторов. Один из них — реализация самой системы RAID. Плохая реализация может вызывать задержки или не использовать доступные шпиндели (например, когда массив RAID 1 читает только с одного диска вместо обоих одновременно!). Нет простого способа учесть недостатки конкретных реализаций RAID, поэтому мы должны предположить, что все они работают в пределах ограничений спецификации — что и делает любая корпоративная система RAID. Прежде всего любительские и потребительские системы RAID этого не делают.
Некоторые типы RAID также имеют значительные вычислительные накладные расходы, тогда как другие нет. Главным образом паритетные уровни RAID требуют интенсивной обработки для выполнения операций записи, причём разные уровни требуют разного объёма вычислений для каждой операции. Это вводит задержку, но не снижает пропускную способность. Эта задержка, однако, будет варьироваться в зависимости от реализации уровня RAID, а также от вычислительных возможностей системы. Аппаратный RAID использует для этого что-то вроде процессора общего назначения (часто процессор Power или ARM RISC) или специализированную микросхему ASIC, тогда как программный RAID перекладывает это на собственный CPU сервера. Зачастую CPU сервера на самом деле быстрее, но потребляет системные ресурсы. Специализированные микросхемы ASIC могут быть очень быстрыми, но дороги в производстве. Эта задержка влияет на производительность хранилища, но её очень сложно предсказать, и она может варьироваться от незначительной до существенной. Поэтому я упомяну относительное влияние задержки для каждого уровня RAID, но не буду пытаться его измерить. В большинстве расчётов производительности RAID эта задержка игнорируется, но важно понимать, что она присутствует и может, в зависимости от конфигурации массива, заметно влиять на рабочую нагрузку.
Стоит упомянуть, что операции чтения имеют незначительное влияние на производительность из-за особенностей расположения данных на диске. Паритетный RAID требует наличия на дисках данных, бесполезных при обычной операции чтения и не способных ускорить её. Это в действительности делает чтение чуть медленнее. Но это влияние ничтожно мало и обычно не измеряется, поэтому им можно пренебречь.
Такие факторы, как размер страйпа, конечно, тоже влияют на производительность, но поскольку это настраиваемый параметр, а не неотъемлемый артефакт какого-либо уровня RAID, я не буду его рассматривать здесь. Это не фактор при выборе уровня RAID, а лишь при его настройке после выбора.
Последний фактор, который я хочу упомянуть, — это соотношение операций чтения и записи для хранилища. Некоторые массивы RAID будут использоваться почти исключительно для чтения, другие — почти только для записи, но большинство использует их сочетание — вероятно, что-то вроде восьмидесяти процентов чтения и двадцати процентов записи. Это соотношение очень важно для понимания производительности вашего конкретного массива RAID и понимания того, как каждый уровень RAID повлияет на вас. Я называю это смешанной нагрузкой чтения/записи (read/write blend).
Мы измеряем производительность хранилища прежде всего в IOPS. IOPS расшифровывается как Input/Output Operations Per Second (операции ввода/вывода в секунду). Я также использую термины RIOPS для операций чтения, WIOPS для операций записи и BIOPS для смешанных IOPS с соотношением 80/20 или любым другим. Многие люди говорят о производительности хранилища, используя одно число IOPS. В этом случае они обычно имеют в виду смешанные IOPS при соотношении 50/50. Однако практически ни одна рабочая нагрузка не работает в соотношении 50/50, поэтому это число может быть крайне вводящим в заблуждение. Для понимания производительности необходимы два числа — RIOPS и WIOPS — и эти два числа вместе можно использовать для нахождения любого нужного смешения IOPS. Например, смешение 50/50 просто: (RIOPS * 0,5) + (WIOPS * 0,5). Более распространённое смешение 80/20: (RIOPS * 0,8) + (WIOPS * 0,2).
Теперь, когда мы установили некоторые критерии и базовое понимание, мы углубимся в сами уровни RAID и посмотрим, как различается производительность между ними.
Для всех уровней RAID число Read IOPS рассчитывается по формуле NX. Это, конечно, не учитывает незначительные накладные расходы, о которых я упоминал выше. Это число «наилучшего случая», но реальное значение настолько близко к нему, что практически удобно просто использовать эту формулу. Берём количество шпинделей (N) и умножаем на производительность отдельного диска (X). Помните, что диски часто имеют разную производительность чтения и записи, поэтому обязательно используйте рейтинг Read IOPS диска или протестированную скорость для расчёта Read IOPS и рейтинг Write IOPS или протестированную скорость для расчёта Write IOPS.
RAID 0
RAID 0 — самый простой для понимания уровень RAID, поскольку здесь фактически нет накладных расходов, не потребляется ресурсов для его поддержки, и как чтение, так и запись получают полную выгоду от каждого шпинделя всё время. Таким образом, для RAID 0 формула производительности записи очень проста: NX. RAID 0 всегда является наиболее производительным уровнем RAID.
Пример: массив RAID 0 из восьми шпинделей. Если отдельный диск массива обеспечивает 125 IOPS, то наш расчёт: N = 8 и X = 125, то есть 8 * 125 = 1000 IOPS. Поскольку IOPS чтения и записи здесь одинаковы, всё очень просто: мы получаем 1K RIOPS, 1K WIOPS и 1K при любом смешении. Если мы не знаем абсолютных IOPS отдельного шпинделя, можно сказать, что восьмишпиндельный RAID 0 обеспечивает 8X смешанных IOPS.
RAID 10
RAID 10 имеет второй по простоте расчёт уровня RAID. Поскольку RAID 10 — это страйп RAID 0 из зеркальных наборов, накладных расходов от страйпа нет, но каждое зеркало должно записывать одни и те же данные дважды для создания зеркалирования. Это вдвое снижает производительность записи по сравнению с массивом RAID 0 того же количества дисков. Это даёт нам формулу производительности записи: NX/2, или 0,5NX.
Следует отметить, что при одинаковой ёмкости — а не одинаковом количестве шпинделей — RAID 10 имеет ту же производительность записи, что и RAID 0, но вдвое большую производительность чтения, поскольку для достижения той же ёмкости требует вдвое больше шпинделей.
Таким образом, для массива RAID 10 из восьми шпинделей: N = 8 и X = 125, и наш расчёт даёт (8 * 125)/2 = 500 WIOPS, или 4X WIOPS. Смешение 50/50 даст 750 смешанных IOPS (1000 Read IOPS и 500 Write IOPS).
Эта формула применима к RAID 1, RAID 10, RAID 100 и RAID 01 одинаково.
Нестандартные варианты, такие как тройное зеркалирование в RAID 10, изменят этот штраф записи. Например, RAID 10 с тройным зеркалированием: NX/3.
RAID 5
Хотя RAID 5 устарел и никогда не должен использоваться в новых массивах, я включаю его здесь, поскольку это хорошо известный и широко используемый уровень RAID, производительность которого необходимо понимать. RAID 5 — наиболее базовый из современных паритетных уровней RAID. RAID 2, 3 и 4 больше не встречаются в производственных системах, поэтому мы не будем рассматривать их производительность здесь. RAID 5, хотя и не рекомендуется для использования сегодня, является основой других современных паритетных уровней RAID и поэтому важен для понимания.
Паритетный RAID добавляет несколько сложную необходимость проверять и перезаписывать чётность при каждой записи на диск. Это означает, что массив RAID 5 должен будет читать данные, читать чётность, записывать данные и, наконец, записывать чётность. Четыре операции на каждую эффективную. Это даёт нам штраф записи RAID 5, равный четырём. Таким образом, формула производительности записи RAID 5: NX/4.
Следуя примеру с восемью шпинделями, где IOPS записи отдельного шпинделя равны 125, мы получаем: (8 * 125)/4 = 2X Write IOPS = 250 WIOPS. При смешении 50/50 это даст 625 смешанных IOPS.
RAID 6
RAID 6, после RAID 10, вероятно, является наиболее распространённым и полезным уровнем RAID, используемым сегодня. Однако RAID 6 основан на RAID 5 и имеет ещё один уровень чётности. Это делает его значительно более надёжным, чем RAID 5, что очень важно, но также накладывает значительный штраф записи, поскольку каждая операция записи требует от дисков читать данные, читать первую чётность, читать вторую чётность, записывать данные, записывать первую чётность и, наконец, записывать вторую чётность. Это даёт шестикратный штраф записи, что весьма значительно. Таким образом, наша формула: NX/6.
Продолжая наш пример, получаем (8 * 125)/6 ≈ 167 Write IOPS, или 1,33X. При смешении 50/50 это даёт производительность 583,5 смешанных IOPS. Как видите, паритетные записи вызывают очень быстрое снижение производительности записи и заметное падение смешанной производительности.
RAID 7 (он же RAID 5.3 или RAID 7.3)
RAID 7 — несколько нестандартный уровень RAID с тройной чётностью, основанный на единственной чётности RAID 5 и двойной чётности RAID 6. Единственная текущая реализация RAID 7 — это RAIDZ3 в ZFS. Поскольку RAID 7 содержит все накладные расходы как RAID 5, так и RAID 6 плюс дополнительные накладные расходы третьего компонента чётности, мы имеем ошеломляющий восьмикратный штраф записи. Таким образом, наша формула для нахождения производительности записи RAID 7: NX/8.
В нашем примере (8 * 125)/8 = 125 Write IOPS, или 1X. То есть при восьми дисках в массиве мы получаем только производительность записи одного отдельного диска. Это значительные накладные расходы. Наши смешанные IOPS 50/50 составят всего 562,5.
Сложный RAID
Сложные или вложенные уровни RAID, такие как RAID 50, 60, 61, 16 и другие, можно рассчитать с помощью приведённой выше информации, разложив RAID на составляющие и применив к каждой приведённые формулы. Для этих уровней нет простой формулы, поскольку они имеют переменные конфигурации. Необходимо разложить их на составляющие и применять формулы несколько раз.
RAID 60 из двенадцати дисков, двух наборов по шесть дисков, где каждый диск имеет 150 IOPS, будет выполнен с двумя RAID 6. Это будет NX RAID 0, где N = 2 (два массива RAID 6), а X — результирующая производительность каждого RAID 6. Каждый набор RAID 6: (6 * 150)/6. Таким образом, полный массив: 2((6 * 150)/6) = 300 Write IOPS.
Тот же пример, но настроенный как RAID 61, зеркальная пара массивов RAID 6, будет иметь ту же производительность на каждый массив RAID 6, но применённую к формуле RAID 1 — NX/2 (где X — результирующая производительность каждого массива RAID). Таким образом, итоговая формула: 2((6 * 150)/6)/2 = 150 Write IOPS от двенадцати дисков.
Производительность как функция ёмкости
Когда мы составляем формулы производительности RAID, мы думаем о них в терминах количества шпинделей — что невероятно разумно. Это очень полезно для определения производительности предполагаемого или существующего массива, где измерение невозможно, и позволяет сравнивать относительную производительность между различными предлагаемыми вариантами. Именно в этих терминах мы повсеместно думаем о производительности RAID.
Однако это не всегда лучший подход, поскольку обычно мы смотрим на RAID как на функцию ёмкости, а не производительности или количества шпинделей. Было бы очень редким, но вполне возможным случаем рассмотрение восьмидискового массива RAID 6 против восьмидискового массива RAID 10. Иногда это случается из-за ограничений корпуса или по другим аналогичным причинам. Но как правило, массивы RAID рассматриваются с точки зрения общей ёмкости массива (т.е. используемой ёмкости), а не количества шпинделей, производительности или любого другого фактора. Поэтому странно, что мы затем переключаемся на рассмотрение производительности RAID как функции количества шпинделей.
Если мы изменим точку зрения и опираемся на ёмкость как на общий фактор, при этом по-прежнему предполагая, что ёмкость и производительность отдельного диска (X) остаются постоянными между сравниваемыми вариантами, то мы придём к совершенно другой картине производительности. При таком подходе мы видим, например, что RAID 0 уже не является наиболее производительным уровнем RAID и что производительность чтения резко варьируется вместо того, чтобы быть постоянной.
Ёмкость — переменная величина, но мы можем свести её к количеству шпинделей, необходимых для достижения нужной ёмкости. Это значительно упрощает обсуждение. Таким образом, наш первый шаг — определить количество шпинделей, необходимое для нужной исходной ёмкости. Если нам нужна ёмкость 10 ТБ и мы используем диски по 1 ТБ, нам понадобится десять шпинделей, например. Или если нам нужно 3,2 ТБ и мы используем диски по 600 ГБ, нам понадобится шесть шпинделей. Мы будем, в отличие от предыдущего подхода, обозначать количество шпинделей как R. Как и прежде, производительность отдельного диска обозначается X. (R используется здесь для обозначения того, что это количество шпинделей для исходной ёмкости (Raw Capacity Count), а не общее количество шпинделей.)
RAID 0 остаётся простым, производительность по-прежнему RX — дополнительных дисков нет. IOPS чтения и записи — просто NX.
RAID 10 имеет RX Write IOPS, но 2RX Read IOPS. Это разительно. Вдруг, при рассмотрении производительности как функции постоянной ёмкости, мы обнаруживаем, что RAID 10 имеет вдвое большую производительность чтения, чем RAID 0!
RAID 5 становится немного сложнее. Write IOPS выражается как ((R + 1) * X)/4. Read IOPS выражается как ((R + 1) * X).
RAID 6, как и ожидается, следует той же схеме, что и RAID 5. Write IOPS для RAID 6: ((R + 2) * X)/6. Read IOPS: ((R + 2) * X).
RAID 7 вписывается в ту же схему. Write IOPS RAID 7: ((R + 3) * X)/8. Read IOPS: ((R + 3) * X).
Эта точка зрения меняет наш взгляд на производительность: при рассмотрении исключительно производительности чтения RAID 0 становится самым медленным уровнем RAID, а не самым быстрым, и RAID 10 становится самым быстрым как по чтению, так и по записи при любых значениях R и X!
Если взять реальный пример: 10 дисков по 2 ТБ для достижения 20 ТБ используемой ёмкости, каждый диск имеет 100 IOPS, при смешении 50/50, результирующие IOPS будут: RAID 0 — 1000 смешанных IOPS, RAID 10 — 1500 смешанных IOPS (2000 RIOPS / 1000 WIOPS), RAID 5 — 687,5 смешанных IOPS (1100 RIOPS / 275 WIOPS), RAID 6 — 700 смешанных IOPS (1200 RIOPS / 200 WIOPS) и RAID 7 — 731,25 смешанных IOPS (1300 RIOPS / 162,5 WIOPS). RAID 10 — явный победитель.
Задержка и нагрузка на систему при программном RAID
Как я уже говорил ранее, RAID 0 и RAID 10 фактически не имеют накладных расходов на систему. Операция зеркалирования практически не требует вычислительных усилий и, по всем практическим меркам, неизмеримо мала. Паритетный RAID имеет вычислительные накладные расходы, что приводит к задержке на уровне хранилища и потреблению системных ресурсов. Конечно, если мы используем аппаратный RAID, эти ресурсы выделены массиву RAID и не выполняют никакой другой функции. Однако если мы используем программный RAID, то это ресурсы общего назначения (прежде всего CPU), которые потребляются для обработки массива RAID.
Влияние на даже очень небольшую систему с большим объёмом RAID по-прежнему очень мало, но оно измеримо и должно учитываться, пусть и в небольшой степени. Задержка и нагрузка на систему напрямую связаны между собой.
Нет простого способа описать задержку и нагрузку на систему для разных уровней RAID, кроме как так: RAID 0 и RAID 10 фактически не имеют задержки или нагрузки, RAID 5 имеет некоторую задержку и нагрузку, RAID 6 имеет примерно вдвое большую вычислительную задержку и нагрузку, чем RAID 5, а RAID 7 — примерно втрое большую вычислительную задержку и нагрузку, чем RAID 5.
Во многих случаях эта задержка и нагрузка на систему будут настолько малы, что их невозможно измерить стандартными системными инструментами, и по мере того как современные процессоры становятся всё более мощными, задержка и нагрузка на систему будут продолжать уменьшаться. Нагрузка считалась пренебрежимо малой для систем RAID 5 и RAID 6 даже на маломощном серийном оборудовании приблизительно с 2001 года. Но на сильно загруженных системах с большим количеством активности паритетного RAID возможна конкуренция между подсистемой RAID и другими процессами, требующими системных ресурсов.
Источник: The IT Hollow — Understanding the RAID Penalty
Статья первоначально опубликована в блоге StorageCraft — RAID Performance.
