Иногда в сети InfiniBand Fabric (т. е. наборе конечных узлов, физически подключенных к коммутаторам и маршрутизаторам с помощью кабелей) необходимо обеспечить изоляцию между конкретными узлами и создать «виртуальную фабрику», с которой могут взаимодействовать только они. В Ethernet это называется виртуальной локальной сетью (VLAN), которая определяет широковещательный домен. Однако InfiniBand не поддерживает широковещательные рассылки, поэтому обеспечивает лишь виртуальную изоляцию. Это называется разделением. И это немного мощнее, чем VLAN
Разделы представляются (и реализуются) с помощью ключа раздела (P_Key), который представляет собой 16-битное значение, состоящее из двух частей:
Взаимодействовать могут только QP, настроенные для нахождения в одном разделе, и по крайней мере один из QP должен быть полноправным членом раздела. Мы обсудим это подробно ниже
Зонирование обеспечивает изоляцию между фабриками InfiniBand и не зависит от границ подсети.
Таблица P_Key — это таблица P_Key, которая существует в каждом порту конечного узла. Размер таблицы является атрибутом порта и его можно найти в port_attr.pkey_tbl_len. Эта таблица настраивается диспетчером разделов (PM), который обычно является частью диспетчера подсети (SM). В таблице имеется по крайней мере один действительный P_Key (P_Key, часть ключа которого (младшие 15 бит) не равна нулю). P_Key по умолчанию равен 0xFFFF.
Таблица P_Key может содержать несколько значений, то есть быть членом нескольких разделов, в некоторых из которых она может быть полным членом, а в некоторых — частичным членом. Он может даже быть полным и частичным членом одного и того же раздела.
Каждый QP настроен с использованием индекса в таблице P_Key. Вызов ibv_modify_qp() во время установления соединения может установить индекс в таблице P_Key порта, связанного с QP. Значения в таблице P_Key не постоянны, они могут меняться, поэтому приложение должно быть к этому готово.
Публикация SR в QP инициирует отправку пакета. Каждый пакет несет значение P_Key. При отправке пакета данных этот QP проверит P_Key сообщения.
Значение P_Key любого входящего пакета будет сравниваться со значением P_Key, настроенным в QP получателя. Будут проведены следующие проверки:
Если хотя бы одна из вышеперечисленных проверок не пройдена, пакет будет считаться нарушением P_Key и пакет будет автоматически отброшен. Если устройство поддерживает его (атрибут IBV_DEVICE_BAD_PKEY_CNTR, установленный в dev_cap.device_cap_flags), счетчик плохих ключей раздела port_attr.bad_pkey_cntr будет увеличивать. Но статус QP получателя не изменится
Важны значения P_Key, а не их положение в таблице P_Key. Определенное значение P_Key может быть найдено по другому индексу на другом порту в подсети.
Как видно из приведенного выше теста, участники с ограниченной ответственностью не могут принимать трафик от других участников с ограниченной ответственностью, и связь разрешена между всеми другими комбинациями типов участников, т. е. хотя бы одна сторона должна быть полноправным участником.
Например, каждая из следующих пар очередей A, B, C и D связана с P_Key.
QPA и QPB могут взаимодействовать (поскольку они оба являются членами раздела 0x0001, а QPA является полноправным членом)
QPA и QPC могут взаимодействовать (поскольку они оба являются членами раздела 0x0001, а QPA является полноправным членом)
QPB и QPC не могут обмениваться данными (поскольку они оба являются членами раздела 0x0001, но не являются полноправными членами).
QPD в примере и любой другой QP не могут взаимодействовать (поскольку они не являются членами одного и того же раздела).
P_Key по умолчанию — это специальное значение (0xFFFF), которое обеспечивает полное членство в разделе по умолчанию.
Неверный ключ раздела: это специальное значение, указывающее, что запись таблицы ключей раздела не содержит допустимого ключа.
Таблица P_Key настраивается SM, и SM может ее изменить, но в большинстве случаев не может. Если вы кэшируете значения таблицы P_Key, вам следует обновить значения при возникновении события IBV_EVENT_PKEY_CHANGE.
Автор: Дотан Барак, 30 апреля 2014 г., 13 октября 2018 г.
ibv_query_pkey()July 27, 2012In "General"
Working with IPoIBApril 21, 2015In "General"
IP over InfiniBand (IPoIB) architectureFebruary 16, 2015In "General"
RDMAmojo Ключ раздела: https://www.rdmamojo.com/2014/04/30/partition-key-p_key/
Ключ запроса раздела: https://www.rdmamojo.com/2012/07/27/ibv_query_pkey/
блог: https://cloud.tencent.com/developer/user/5060293/articles | https://logread.cn | https://blog.csdn.net/ssbandjl | https://www.zhihu.com/people/ssbandjl/posts
https://cloud.tencent.com/developer/column/101987