Значимые показатели производительности требуют глубокого понимания различных потенциальных узких мест, которые могут возникнуть в современных серверах и инфраструктурах центров обработки данных, в которых они находятся.
Обзор стандартной платформы под NVMe-накопители
Системы хранения данных во многом используют стандартные серверные платформы x86, и RAIDIX — не исключение. Поэтому с точки зрения производительности мы рассмотрим обычный сервер, который поддерживает NVMe-накопители. Как правило, используются двухсокетные платформы на процессорах Intel или односокетные на процессорах AMD. Блок-схема платформы на базе сервера Intel Xeon показана на рисунке ниже, а места потенциальных узких мест производительности обведены кружками и пронумерованы.
Разберем возможные узкие места платформы на базе PCIe 3.0, так как эти платформы менее сбалансированы с точки зрения пропускной способности компонентов и NVMe-накопителей. Общие же принципы останутся неизменными и для платформ с PCIe 4.0, хотя они и изначально более оптимизированы для использования NVMe-накопителей и высокоскоростных сетевых интерфейсов.
Типичный сервер на базе процессоров Intel Scalable Gen 2 представляет собой двухсокетную систему с межпроцессорными соединениями. Каждый сокет обычно обеспечивает 48 линий PCIe 3.0, а все ядра совместно используют когерентный кэш L3. Такая архитектура называется NUMA («неравномерного доступа к памяти»). В процессорах Intel два сокета соединены каналами Ultra Path Interconnect (UPI), которые передают любой трафик, адресованный PCIe, DRAM или кэш-памяти, связанной с другим сокетом. Интерконнект AMD называется AMD Infinity Fabric, но, так как у процессоров AMD значительно больше PCIe-линий (128), то чаще используются однопроцессорные платформы.
Правда, чаще всего на накопители и слоты для плат расширения отводится примерно 40 линий PCIe 3.0 c одного сокета, так как часть линий используется для интегрированных на материнскую плату устройств, таких как сетевые адаптеры, BMC/IPMI и т.п. На схеме выше из 80 доступных линий PCIe 3.0 две сетевые карты используют 32 линии, оставляя 48 для обслуживания 24 NVMe-накопителей. Поскольку enterprise NVMe-накопители обычно имеют по четыре линии PCIe, для подключения 96 линий NVMe (24x4) к процессорам требуются коммутаторы PCIe. Как показано на рисунке выше, каждый CPU подключается к одной из двух сетевых карт и половине NVMe-накопителей. Команды, поступающие на одну сетевую карту, но направленные на накопители, связанные с другим сокетом, должны будут пройти по каналу UPI.
Основные узкие места NVMe-платформ
Пропускная способность для каждого из пронумерованных элементов блок-схемы двухпроцессорной платформы с NVMe-накопителями приведена в таблице ниже, и каждый из них рассматривается подробно.
№ | Элемент | Теоретический максимум пропускной способности (кол-во каналов – пропускная способность) | Фактический максимум |
1 | 100GbE | 1 – 12.5GB/s | 1 – 11.4GB/s |
2 | Подключения сетевой карты к PCIe 3.0 x16 | 32GB/s | |
3 | UPI (dual 10.4GT\s) | 2 – 41.6GB/s | 2 – 41.6GB/s |
4 | CPU | Зависит от используемого ПО | Зависит от используемого ПО |
5 | PCI switch PCIe 3.0 x16 | 16 – 16GB/s | 16GB/s |
6 | SSD Interface PCIe 3.0 x4 | 4 – 4GB/s | 4GB/s |
7 | Flash SSD | Зависит от диска | Зависит от диска |
Таблица 1.
Узкое место №1: сеть
Сетевые карты, используемые в серверах с NVMe-накопителями, чаще всего представляют собой одно- или двухпортовые 100GbE. Могут быть и другие, но Ethernet и Infiniband сейчас имеют самые высокие скорости, но так как Ethernet распространен больше, то будем рассматривать именно его. 100 GbE имеет чистую полезную нагрузку около 11,4 ГБ/с на порт, поэтому двухпортовая сетевая карта номинально способна работать со скоростью 22,8 ГБ/с.
Сетевые протоколы 3-4 уровня (например RoCE v2 или TCP/IP) накладывают ограничения на производительность сверх того, что представляет собой уровень канала передачи данных (Ethernet), и они могут быть весьма существенными. В таблице 1 учтены накладные расходы протокола, которые утилизируют пропускную способность канала. Но важно отметить, что она не включает дополнительные затраты на пропускную способность, связанные со временем, необходимым сетевому стеку для обработки каждого пакета. Это время может быть значительным и зависит от конкретного выбора сетевой карты и коммутационного оборудования, а также от выбранного протокола.
RoCE v2 — это RDMA-протокол, использующий zero-copy архитектуру, то есть при передаче данных с помощью RoCE v2 исключаются лишние копирования между приложением и буферами операционной системы. RoCE v2 обычно обеспечивает пропускную способность, близкую к значениям, указанным в таблице.
Реализации TCP/IP сильно различаются — компромисс между разгрузкой и нагрузкой, а также выбор того, где должен быть реализован драйвер — в ядре или в пространстве пользователя (kernel-bypass технологии, такие как DPDK и др.) — все это влияет на производительность, что затрудняет обобщения. В настоящее время TCP/IP заметно менее производителен, так как требует больше ресурсов процессора, чем RoCE v2, хотя со временем разрыв будет сокращаться по мере того, как производители сетей будут добавлять аппаратную разгрузку (off-load) для TCP/IP.
Последний потенциально значимый фактор, который не включен в данный анализ — влияние перегруженности сети и стоимость восстановления пропускной способности после ошибок сети (например потери пакетов).
Узкое место №2: подключение сетевой карты
Многие сетевые карты 100 GbE имеют разъем PCIe 3.0 x16. Для однопортовых сетевых карт на PCIe 3.0 пропускная способность сети и слот подключения достаточно хорошо сбалансированы — 11,4 и 14,5 ГБ/с соответственно. Однако для двухпортовых карт подключение к шине PCIe 3.0 x16 становится ограничением пропускной способности, поскольку упирается в шину и способно работать в полудуплексном режиме только со скоростью 14,5 ГБ/с.
Узкое место №3: процессор
Лучшим преимуществом NVMe является то, что он обеспечивает высочайшую производительность за счет устранения узкого места SAS HBA путем прямого подключения к центральному процессору. Но на производительность NVMe влияет количество ядер и частота процессора. Так, по результатам тестов NVMe-накопителей, наилучшая производительность достигается при соотношении двух вычислительных ядер на один NVMe-накопитель при частоте центрального процессора не менее 2.5ГГц.
Узкое место №4: межпроцессорные соединения
Современные серверные процессоры обычно проектируются с архитектурой памяти Non-Uniform Memory Architecture (NUMA). Это означает, что задержка доступа к определенным ячейкам памяти и каналам ввода-вывода неодинакова для всех ядер, поскольку часть трафика должна проходить через межпроцессорные соединения, будь то Intel Ultra Path Interconnect или AMD Infinity Fabric.
Как показано в таблице 1, каналы NUMA спроектированы с очень высокой пропускной способностью по отношению к возможностям ввода-вывода, как со стороны сетевых интерфейсов, так и со стороны NVMe-накопителей. Но, тем не менее, рекомендуется давать нагрузку на дисковую подсистему с того же процессора, к которому подключена сетевая карта.
Узкое место №5: PCIe-коммутатор
Двухсокетные серверные процессоры на базе Intel обычно не имеют достаточного количества линий PCIe 3.0 в процессорах, чтобы обслуживать полный набор из 24 или более NVMe-дисков. Платформы на базе этих процессоров часто включают два внутренних PCIe-коммутатора, которые работают как расширители PCIe.
На примере показана платформа, на которой 12 дисков NVMe x4 подключаются через PCIe-коммутатор к 16 линиям PCIe. Такое подключение делает платформу сбалансированной с точки зрения прохождения IO от клиентов до NVMe-накопителей, так как и сетевые карты, и 12 NVMe-накопителей подключены к PCIe 3.0 x16. Часто эти два места определяют общий предел пропускной способности платформы.
Узкое место №6: подключение NVMe-накопителя
Большинство твердотельных enterprise-накопителей PCIe Gen3 NVMe имеют четыре линии для подключения к хосту. Такой интерфейс обеспечивает теоретическую пропускную способность около 3,6 ГБ/с в каждом направлении, чего более чем достаточно для работы и не будет являться узким местом.
Узкое место №7: NVMe-накопитель
В отличие от других компонентов платформы, рассмотренных в статье, NVMe-накопитель имеет принципиально разные характеристики производительности при чтении и записи. Плашка флэш-памяти разделена на две или четыре части, каждая из которых может одновременно обрабатывать одну операцию чтения, записи или удаления. Производительность твердотельного накопителя зависит от его конструкции, свободного пространства и емкости.
Как правило, сам NVMe-накопитель не будет узким местом в производительности, но несколько устройств будут вынуждены делить пропускную способность PCIe коммутатора, что может повлиять на итоговую производительность.
Заключение
Мы рассмотрели семь узких мест, которые определяют итоговую производительность серверной платформы на NVMe-накопителях. В каждом из пунктов мы разобрали проблемы, которые помогут понять, на что обращать внимание в серверах для того, чтобы получить максимум эффективности от NVMe-накопителей.