Intel i oat что это такое

Обновлено: 04.07.2024

Драйвер ioat rawdev предоставляет драйвер режима опроса (PMD) для технологии Intel® QuickData, являющейся частью технологии ускорения ввода-вывода Intel® (Intel I/OAT). Этот PMD при использовании на поддерживаемом оборудовании позволяет ускорить копирование данных, например клонирование пакетных данных, аппаратным обеспечением, а не программным обеспечением, высвобождая циклы ЦП для других задач.

4.1. Требования к оборудованию

В Linux наличие оборудования с технологией Intel® QuickData можно определить, проверив выходные данные команды lspci, где оборудование часто будет указано как «Crystal Beach DMA» или «CBDMA». Например, в системе с ЦП Intel® Xeon® E5-2699 v4 @2,20 ГГц lspci показывает:

В системе с процессором Intel® Xeon® Gold 6154 с частотой 3,00 ГГц lspci показывает:

4.2. Компиляция

Для сборок, выполненных с помощью make , компиляция драйвера включается параметром конфигурации сборки CONFIG_RTE_LIBRTE_PMD_IOAT_RAWDEV. Это включено по умолчанию в сборках для платформ x86 и отключено в других конфигурациях.

Для сборок с использованием meson и ninja драйвер будет собран, когда целевая платформа основана на x86.

4.3. Настройка устройства

Для использования аппаратные устройства Intel® QuickData Technology должны быть привязаны к драйверу ввода-вывода пользовательского пространства. Сценарий dpdk-devbind.py, входящий в состав DPDK, можно использовать для просмотра состояния устройств и их привязки к подходящему драйверу ядра, поддерживаемому DPDK. При запросе состояния устройств они будут отображаться в категории «Разные (rawdev) устройства», т. е. для просмотра состояния только этих устройств можно использовать команду dpdk-devbind.py --status-dev misc.< /p>

4.3.1. Проверка устройства и инициализация

После привязки к подходящему драйверу устройства ядра устройства HW будут найдены в ходе сканирования PCI, выполняемого во время инициализации приложения. Для создания или инициализации устройства не требуется передавать параметры vdev.

После успешного зондирования устройство будет отображаться как rawdev , т. е. «необработанный тип устройства» внутри DPDK, доступ к которому можно получить с помощью API из библиотеки rte_rawdev.

4.4. Использование устройств IOAT Rawdev

Чтобы использовать устройства из приложения, можно использовать API rawdev вместе с определениями, взятыми из заголовочного файла rte_ioat_rawdev.h для конкретного устройства. Этот заголовок необходим для получения определения параметров структуры, используемых некоторыми API-интерфейсами rawdev для устройств IOAT rawdev, а также для предоставления ключевых функций для использования устройства для копирования памяти.

4.4.1. Получение информации об устройстве

Основную информацию о каждом устройстве rawdev можно запросить с помощью API rte_rawdev_info_get(). Для большинства приложений этот API потребуется для проверки того, что рассматриваемый rawdev относится к ожидаемому типу. Например, следующий фрагмент кода можно использовать для идентификации устройства IOAT rawdev для использования приложением:

При вызове API rte_rawdev_info_get() для устройства IOAT rawdev поле dev_private в структуре rte_rawdev_info должно иметь значение NULL или указывать на структуру типа rte_ioat_rawdev_config , и в этом случае размер настроенного устройства кольцо ввода будет возвращено в этой структуре.

4.4.2. Конфигурация устройства

Настройка устройства IOAT rawdev выполняется с помощью API rte_rawdev_configure(), который принимает те же параметры структуры, что и упомянутый ранее API rte_rawdev_info_get(). Основное отличие состоит в том, что, поскольку параметр используется как ввод, а не вывод, элемент структуры dev_private не может иметь значение NULL и должен указывать на допустимую структуру rte_ioat_rawdev_config, содержащую размер кольца, который будет использоваться устройством. Размер кольца должен быть степенью двойки от 64 до 4096.

Следующий код показывает, как устройство настроено в test_ioat_rawdev.c:

После настройки устройство можно подготовить к использованию, вызвав API rte_rawdev_start().

4.4.3. Выполнение копирования данных

Для выполнения копирования данных с помощью устройств IOAT rawdev следует использовать функции rte_ioat_enqueue_copy() и rte_ioat_do_copies(). Как только копирование будет завершено, об этом будет сообщено, когда приложение вызовет rte_ioat_completed_copies() .

Функция rte_ioat_enqueue_copy() ставит одну копию в очередь на кольцо устройств для последующего копирования. Параметры этой функции включают адреса IOVA как исходного, так и целевого буферов, а также два «дескриптора», которые должны быть возвращены пользователю после завершения копирования. Эти дескрипторы могут быть произвольными значениями, но предусмотрено два, чтобы библиотека могла отслеживать дескрипторы как для источника, так и для места назначения от имени пользователя, например. виртуальные адреса для буферов или указатели mbuf, если данные пакета копируются.

Несмотря на то, что функция rte_ioat_enqueue_copy() ставит в очередь операцию копирования на кольце устройств, фактически копирование не будет выполняться до тех пор, пока приложение не вызовет функцию rte_ioat_do_copies().Эта функция информирует оборудование устройства об элементах, находящихся в очереди на кольце, и устройство начинает их обрабатывать. Ожидается, что из соображений эффективности пакет операций будет поставлен в очередь на устройство с помощью нескольких вызовов постановки в очередь между вызовами функции rte_ioat_do_copies().

Следующий код из test_ioat_rawdev.c демонстрирует, как поставить пакет копий в очередь на устройство и запустить их аппаратную обработку:

Для получения информации о завершенных копиях следует использовать API rte_ioat_completed_copies(). Этот API возвращает приложению набор дескрипторов завершения, переданных при постановке соответствующих копий в очередь.

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

Intel I/OAT — это набор технологий для повышения производительности ввода-вывода. В этом посте специально показано, как использовать технологию Intel QuickData, которая позволяет копировать данные набором микросхем, а не ЦП, для более эффективного перемещения данных и обеспечения высокой пропускной способности.

Использование Linux DMA Engine

I/OAT (в частности, технология QuickData) реализован в виде модуля ядра ioatdma в Linux и интегрирован в подсистему прямого доступа к памяти Linux. Поскольку он управляется подсистемой Linux DMA, у него нет собственного интерфейса, но доступ к нему должен осуществляться через API ядра Linux DMA 2 .

Примеров много, особенно для Xilinx AXIDMA; один здесь. Также есть мануал от Xilinx 3.

image

Общая схема программного обеспечения Linux DMA. [Источник]

Здесь нам нужно реализовать драйвер прокси-устройства DMA для предоставления службы DMA процессам пользовательского пространства или драйвер клиентского устройства движка DMA. Руководство для клиента движка DMA находится в [здесь] и [здесь (асинхронная передача)].

1. Выделение подчиненного канала DMA [источник]

Хотя код Xilinx AXIDMA использует dma_request_slave_channel() , рекомендуется использовать dma_request_chan() : он возвращает канал на основе таблицы соответствия dma_slave_map.

Подсистема прямого доступа к памяти Linux внутренне управляет dma_device_list и автоматически находит подходящее устройство прямого доступа к памяти. Лично я использую dma_request_chan_by_mask (не знаю, как использовать dma_request_chan ). Следующий код получает структуру dma_chan для функциональности DMA_MEMCPY.

2. Подготовка передачи DMA

После создания канала мы готовим передачу DMA. Во-первых, сопоставьте страницы/области памяти для DMA, чтобы получить dma_attr_t, который содержит адрес BUS:

Все примеры используют kmalloc() для получения буфера памяти для DMA. Это не обязательно должна быть память ядра (и ограничение по размеру очень низкое); вместо этого мы можем использовать CMA (распределитель непрерывной памяти) 4 или физический адрес устройства (например, используя энергонезависимую память и/или devdax ).

Первый аргумент (struct device *) относится к устройству DMA, а struct dma_chan содержит указатель устройства ( chan->device->dev ), и вы всегда должны использовать его в качестве первого аргумента. Не следует использовать символьное устройство, созданное этим драйвером прокси-устройства.

Последний аргумент — это направление прямого доступа к памяти; вы можете использовать DMA_BIDIRECTIONAL . Хотя это неясно, но я понимаю, что DMA_TO_DEVICE означает, что данные по целевому адресу будут прочитаны устройством DMA, а DMA_FROM_DEVICE означает, что данные по целевому адресу будут записаны устройством прямого доступа к памяти.

После сопоставления буфера мы получаем дескриптор транзакции.

Существует несколько интерфейсов для получения дескриптора, но на данный момент я не уверен, чем они отличаются. Сейчас я использую DMA_MEMCPY, я использую функцию dmaengine_prep_dma_memcpy().

3. Настройка обратного вызова для завершения

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

4. Отправка запроса

Отправка состоит из двух этапов: (1) отправка и (2) выдача ожидающих запросов.

dmaengine_submit() просто помещает запрос в очередь, и механизм DMA не будет обрабатывать его до тех пор, пока он не будет отправлен, что требует второго шага с dma_async_issue_pending() .

где dma_cookie_t используется для проверки активности механизма DMA посредством других вызовов механизма DMA, например:

5. Ожидание завершения

Честно говоря, я не уверен, в чем разница между dma_async_is_tx_complete() и dma_async_is_complete(). Нужно дальнейшее расследование. Я также видел, что в моей ссылке используется wait_for_completion() вместо dma_async_wait() , и я понятия не имею, в чем разница между этими двумя.

Использование SPDK 5 6 7

SPDK (Software Development Performance Kit) поддерживает управление устройствами в пользовательском пространстве и обычно используется для высокопроизводительных устройств NVMe с малой задержкой, но может также использоваться для высокопроизводительных устройств I/OAT DMA за счет устранения контекста ядра и пользовательского пространства. коммутаторы для операций прямого доступа к памяти.

1. Инициализация SPDK и выделение канала I/OAT

Чтобы использовать SPDK, сначала мы должны инициализировать среду SPDK, используя:

Затем используйте spdk_ioat_probe() для проверки устройств I/OAT DMA. Перед его вызовом целевые устройства I/OAT должны быть настроены с помощью UIO/VFIO с помощью scripts/setup.sh src:

spdk_ioat_probe() проверяет все устройства I/OAT и вызывает функцию обратного вызова probe_cb() для каждого проверяемого устройства, а также пытается подключить устройство к пользовательскому процессу с помощью attach_cb() , если соответствующий probe_cb() возвращает значение true для устройство.

probe_cb() возвращает значение true, если нет подключенного канала spdk_ioat_chan. Затем spdk_ioat_probe() вызывает attach_cb() для устройства, для которого probe_cb возвращает значение true, а затем attach_cb() проверяет возможность копирования памяти и прикрепляет его.

2. Передача DMA и настройка обратного вызова завершения

SPDK требует вызвать spdk_ioat_build_copy() для создания запроса DMA, а затем сбросить его на устройство с помощью spdk_ioat_flush() . Вы можете использовать spdk_ioat_submit_copy(), чтобы сделать два сразу для одного запроса.

spdk_ioat_build_copy() и spdk_ioat_submit_copy() получают void *cb_arg и spdk_ioat_req_cb cb_fn — функцию обратного вызова, которую нужно вызвать с заданным указателем аргумента. Функция обратного вызова будет вызываться после завершения запроса, и процесс пользовательского пространства может использовать ее для определения завершения операции. Простая реализация может быть:

Обратите внимание, что целевой буфер (и src, и dst ) должен поддерживать DMA; вы должны использовать spdk_mem_register() :

Поскольку устройство обрабатывается процессом пользовательского пространства, а не ядром, процесс не может получать прерывание, но должен опрашивать завершение, чтобы проверить, завершена ли отправленная операция. spdk_ioat_process_events() — функция для этой цели.

spdk_ioat_process_events() немедленно возвращает количество выполненных запросов. Вы можете использовать возвращаемое значение или переменную copy_done в приведенном выше примере, чтобы проверить, завершена ли операция.

Обратите внимание, что обратный вызов op_done_cb() будет вызываться spdk_ioat_process_events() :

I/OAT (технология ускорения ввода-вывода) – это набор методов, разработанных Intel для повышения пропускной способности сети. Наиболее значительным из них является двигатель DMA. Механизм DMA предназначен для разгрузки ЦП при копировании данных SKB в пользовательские буферы. Это не прием с нулевым копированием, но он позволяет ЦП выполнять другую работу, в то время как операции копирования выполняются механизмом прямого доступа к памяти.

Реализация в Linux

Серия исправлений I/OAT состоит из трех основных областей. Во-первых, он добавляет к ядру подсистему прямого доступа к памяти, которая абстрагирует аппаратное обеспечение механизма прямого доступа к памяти от пользователей. Во-вторых, он добавляет аппаратный драйвер I/OAT, который подключается к подсистеме прямого доступа к памяти и управляет реальным оборудованием. Наконец, реализован ряд модификаций сетевого стека для использования асинхронной разгрузки копий.

Модификации сетевого стека

Изменения сетевого стека, поскольку они затрагивают очень важный код, подверглись наибольшему анализу. Существенные изменения:

tcp_recvmsg() : добавлен код для закрепления памяти пользовательского буфера при входе. Добавлен код ожидания завершения асинхронного копирования и открепления памяти перед выходом.

tcp_rcv_installed() : добавлен код для запуска асинхронных копий, если это возможно. dma_try_early_copy() добавлен в tcp.c.

Заплатки

Обновлено до последней версии ioat-1.7 и netdev git (20060508)

Статус принятия ядра

Компания Intel представила техническую информацию на OLS 2005 (но без кода). Весь код, кроме аппаратного драйвера, был опубликован для обзора в ноябре 2005 г. Опубликовано обновленное исправление с аппаратным драйвером 3 марта 2006 г., и снова учтены отзывы сообщества разработчиков 29 марта 2006 г.

I/OAT поставлен в очередь для версии 2.6.18.

Данные об эффективности

Это исходные данные, которые мы разместили в netdev 16 марта 2006 г.

Это больше данные Chariot, но также включает результаты с включенной проверкой данных, таким образом, касаясь данных. Разрыв ЦП меньше (особенно на 8 портах), но все же заслуживает внимания.

Эти данные показывают, что I/OAT действительно выигрывает от увеличения размера буфера приложения. При разрешении 2K наблюдается всплеск загрузки ЦП, но также увеличивается и пропускная способность. Это можно устранить, увеличив sysctl tcp_dma_copybreak («cat 4096 > /proc/sys/net/ipv4/tcp_dma_copybreak»), который отключает I/OAT при размере буфера приложения или ниже этого размера.

Это показывает производительность netperf. Обратите внимание, что мы используем меньше клиентов, чем тесты Chariot. Небольшая экономия ЦП при больших размерах буфера приложения, но менее заметная, чем у Chariot.

Эти данные показывают 6 отдельных запусков Tbench, показывая снижение загрузки ЦП на 7–10%.

Результаты SPECWeb.Поскольку это тест TX, I/OAT не должен влиять на производительность, и это указывает на то, что это не так.

Эти данные показывают результаты с разным количеством портов. Он включает в себя как стандартные данные netperf, так и результаты с использованием новой опции, присутствующей только в репозитории netperf SVN, которая затрагивает данные после их получения.

creayt

Возьмите Dell R620, биос которого поддерживает функцию под названием "i/oat dma engine", которая, как показал быстрый поиск в Google, по утверждению некоторых людей, сильно влияет на производительность, но *для работы требуется, чтобы ваш полный стек была Intel/совместима, а не только ваша материнская плата.

Кто-нибудь из вас использовал это? Знаете, как я могу определить, полностью ли его поддерживает мой R620?

Из Википедии
Технология ускорения ввода-вывода (I/OAT) — это механизм прямого доступа к памяти (встроенный контроллер прямого доступа к памяти) от Intel, поставляемый в комплекте с высокопроизводительными серверными материнскими платами, который разгружает копии памяти из основного процессора, выполняя прямое доступ к памяти (DMA). Обычно используется для ускорения сетевого трафика, но поддерживает любые виды копий.
Использование I/OAT для ускорения сети поддерживается Microsoft Windows с момента выпуска Scalable Networking Pack для Windows Server 2003 SP1.[1] Она использовалась ядром Linux, начиная с 2006 года[2], но впоследствии эта функция была отключена из-за возможности повреждения данных[3]

.

Я просмотрел его техпаспорт и нашел несколько связанных вещей. Я думаю, это связано с тем, что H700 1 ГБ поддерживает SSD-кэш??

™

"Контроллеры системы хранения данных
Dell предлагает высокопроизводительные варианты RAID для обеспечения безопасности ваших данных. Варианты RAID-контроллеров
Dell предлагают впечатляющие улучшения производительности, включая следующие функции:
 FastPath Ввод/вывод: эта функция может помочь повысить производительность при работе с твердотельными накопителями."

"4.2 CacheCade
CacheCade обеспечивает экономичное масштабирование производительности для профилей приложений типа базы данных в среде RAID на базе хоста
за счет расширения кэш-памяти контроллера PERC RAID за счет добавления квалифицированных Dell
Корпоративные твердотельные накопители.
CacheCade определяет часто используемые области в наборе данных и копирует эти данные на сертифицированный Dell корпоративный твердотельный накопитель (SATA или SAS), что позволяет сократить время отклика, направляя популярные
случайные операции чтения. запросы к твердотельному накопителю CacheCade, а не к базовому жесткому диску.
Поддерживая до 512 ГБ расширенного кэша, все твердотельные накопители CacheCade должны иметь один и тот же интерфейс (SATA или
SAS) и размещаться на сервере или хранилище, в котором находится массив RAID.
Твердотельные накопители CacheCade не будут частью массива RAID.
CacheCade является стандартной функцией и доступна только в PERC H700/H800 1 ГБ NV Cache < br />RAID-контроллер.
Твердотельные накопители CacheCade можно настроить с помощью PERC BIOS Configuration Utili. или OpenManage."

4.3 Сквозной ввод-вывод
Cut-Through IO (CTIO) — это ускоритель ввода-вывода для массивов SSD, который увеличивает пропускную способность устройств,
подключенных к контроллеру PERC. Он включается путем отключения кэша с обратной записью (включить
кеш со сквозной записью) и отключения упреждающего чтения.

creayt

™

Я просмотрел его техпаспорт и нашел несколько связанных вещей. Я думаю, это связано с тем, что H700 1 ГБ поддерживает SSD-кэш??

http://i.dell.com/sites/content/shared-content/data-sheets/en/Documents/dell-poweredge -r620-technical-guide.pdf

"Контроллеры системы хранения данных
Dell предлагает высокопроизводительные варианты RAID, которые гарантируют безопасность ваших данных. Варианты контроллеров RAID
от Dell обеспечивают впечатляющее повышение производительности. , включая следующие функции:
 FastPath I/O: эта функция может помочь повысить производительность при работе с твердотельными накопителями."

Интересно. Я знаю, что на этом сервере есть технология под названием CacheCade, при которой вы запускаете в основном HDDS, а затем добавляете один SSD до 512 ГБ, который он может использовать в качестве кеша, аналогично тому, как работают гибриды / FusionDrives. Спасибо за информацию.

Читайте также: