Реализация команд InfiniBand состоит примерно из четырех компонентов:
- модуль ядра конкретного поставщика (например,
ib_mthca
для устройств Mellanox)
- модуль ядра, который разрешает доступ к командам из пользовательского пространства (
ib_uverbs
)
- библиотека драйверов поставщика пользовательского пространства (например,
libmthca
)
- связующий компонент между двумя предыдущими (
libibverbs
)
InfiniBand в целом поддерживает две семантики — работу на основе пакетов и удаленный доступ к памяти. Независимо от режима работы оба реализуют нулевое копирование путем прямого чтения и записи в буфер(ы) приложения. Это делается (как уже объяснил haggai_e) путем фиксации буфера в физической памяти (также называемой регистрацией), таким образом не позволяя диспетчеру виртуальной памяти выгружать его на диск или перемещать в физической ОЗУ. Очень приятной особенностью InfiniBand является то, что каждый HCA имеет собственный механизм преобразования виртуальных адресов в физические, который позволяет передавать указатели пользовательского пространства непосредственно на оборудование.
Причина использования драйвера пользовательского уровня заключается в том, что глаголы напрямую раскрывают аппаратные регистры HCA пользовательскому пространству, а каждый HCA имеет различный набор регистров, поэтому необходим промежуточный уровень пользовательского пространства. Конечно, его можно было бы полностью реализовать в ядре, а затем можно было бы использовать единую независимую от поставщика библиотеку пользовательского пространства, но InfiniBand очень старается обеспечить как можно более низкую задержку, и каждый раз проходить через ядро будет очень дорого. Тот факт, что устройства RDMA могут транслировать виртуальные адреса самостоятельно, означает, что библиотеке пользовательского пространства не нужно проходить через ядро, чтобы получить физический адрес буфера при создании записей в рабочих очередях (часть механизма, используемого глаголами для отправки и получения данных).
Обратите внимание, что в основном есть две библиотеки поставщиков — одна в ядре и одна в пользовательском пространстве. Первый предоставляет функциональность глаголов для других модулей ядра, таких как файловые системы (например, Lustre) или драйверы сетевых протоколов (например, IP-over-InfiniBand), а второй предоставляет эту функциональность в пользовательском пространстве. Некоторые операции не могут быть выполнены полностью в пользовательском пространстве, например. регистрация памяти или открытие/закрытие контекстов устройства, и они прозрачно передаются модулю ядра с помощью libibverbs
.
Хотя технически RDMA через конвергентный Ethernet (RoCE, реализованный в пользовательском пространстве как librxe
) не является InfiniBand на аппаратном уровне, стек OpenFabrics разработан таким образом, чтобы поддерживать оборудование с поддержкой RDMA, отличное от HCA InfiniBand, включая адаптеры RoCE и iWARP.
См. эту сводку от Intel по теме доступ к InfiniBand в Linux для получения более подробной информации.
person
Hristo Iliev
schedule
27.06.2014