Auto-select first RDMA device only if RoCE is not found, add rocev2->rocev1->ib priority
This commit is contained in:
@@ -68,11 +68,15 @@ but they are not connected to the cluster.
|
|||||||
- Type: string
|
- Type: string
|
||||||
|
|
||||||
RDMA device name to use for Vitastor OSD communications (for example,
|
RDMA device name to use for Vitastor OSD communications (for example,
|
||||||
"rocep5s0f0"). Now Vitastor supports all adapters, even ones without
|
"rocep5s0f0"). If not specified, Vitastor will try to find an RoCE
|
||||||
ODP support, like Mellanox ConnectX-3 and non-Mellanox cards.
|
device matching [osd_network](osd.en.md#osd_network), preferring RoCEv2,
|
||||||
|
or choose the first available RDMA device if no RoCE devices are
|
||||||
|
found or if `osd_network` is not specified.
|
||||||
|
|
||||||
Versions up to Vitastor 1.2.0 required ODP which is only present in
|
Vitastor supports all adapters, even ones without ODP support, like
|
||||||
Mellanox ConnectX >= 4. See also [rdma_odp](#rdma_odp).
|
Mellanox ConnectX-3 and non-Mellanox cards. Versions up to Vitastor
|
||||||
|
1.2.0 required ODP which is only present in Mellanox ConnectX >= 4.
|
||||||
|
See also [rdma_odp](#rdma_odp).
|
||||||
|
|
||||||
Run `ibv_devinfo -v` as root to list available RDMA devices and their
|
Run `ibv_devinfo -v` as root to list available RDMA devices and their
|
||||||
features.
|
features.
|
||||||
@@ -95,15 +99,16 @@ your device has.
|
|||||||
## rdma_gid_index
|
## rdma_gid_index
|
||||||
|
|
||||||
- Type: integer
|
- Type: integer
|
||||||
- Default: 0
|
|
||||||
|
|
||||||
Global address identifier index of the RDMA device to use. Different GID
|
Global address identifier index of the RDMA device to use. Different GID
|
||||||
indexes may correspond to different protocols like RoCEv1, RoCEv2 and iWARP.
|
indexes may correspond to different protocols like RoCEv1, RoCEv2 and iWARP.
|
||||||
Search for "GID" in `ibv_devinfo -v` output to determine which GID index
|
Search for "GID" in `ibv_devinfo -v` output to determine which GID index
|
||||||
you need.
|
you need.
|
||||||
|
|
||||||
**IMPORTANT:** If you want to use RoCEv2 (as recommended) then the correct
|
If not specified, Vitastor will try to auto-select a RoCEv2 IPv4 GID, then
|
||||||
rdma_gid_index is usually 1 (IPv6) or 3 (IPv4).
|
RoCEv2 IPv6 GID, then RoCEv1 IPv4 GID, then RoCEv1 IPv6 GID, then IB GID.
|
||||||
|
|
||||||
|
A correct rdma_gid_index for RoCEv2 is usually 1 (IPv6) or 3 (IPv4).
|
||||||
|
|
||||||
## rdma_mtu
|
## rdma_mtu
|
||||||
|
|
||||||
|
|||||||
@@ -71,12 +71,16 @@ RDMA может быть нужно только если у клиентов е
|
|||||||
- Тип: строка
|
- Тип: строка
|
||||||
|
|
||||||
Название RDMA-устройства для связи с Vitastor OSD (например, "rocep5s0f0").
|
Название RDMA-устройства для связи с Vitastor OSD (например, "rocep5s0f0").
|
||||||
Сейчас Vitastor поддерживает все модели адаптеров, включая те, у которых
|
Если не указано, Vitastor попробует найти RoCE-устройство, соответствующее
|
||||||
нет поддержки ODP, то есть вы можете использовать RDMA с ConnectX-3 и
|
[osd_network](osd.en.md#osd_network), предпочитая RoCEv2, или выбрать первое
|
||||||
картами производства не Mellanox.
|
попавшееся RDMA-устройство, если RoCE-устройств нет или если сеть `osd_network`
|
||||||
|
не задана.
|
||||||
|
|
||||||
Версии Vitastor до 1.2.0 включительно требовали ODP, который есть только
|
Vitastor поддерживает все модели адаптеров, включая те, у которых
|
||||||
на Mellanox ConnectX 4 и более новых. См. также [rdma_odp](#rdma_odp).
|
нет поддержки ODP, то есть вы можете использовать RDMA с ConnectX-3 и
|
||||||
|
картами производства не Mellanox. Версии Vitastor до 1.2.0 включительно
|
||||||
|
требовали ODP, который есть только на Mellanox ConnectX 4 и более новых.
|
||||||
|
См. также [rdma_odp](#rdma_odp).
|
||||||
|
|
||||||
Запустите `ibv_devinfo -v` от имени суперпользователя, чтобы посмотреть
|
Запустите `ibv_devinfo -v` от имени суперпользователя, чтобы посмотреть
|
||||||
список доступных RDMA-устройств, их параметры и возможности.
|
список доступных RDMA-устройств, их параметры и возможности.
|
||||||
@@ -101,15 +105,17 @@ Control) и ECN (Explicit Congestion Notification).
|
|||||||
## rdma_gid_index
|
## rdma_gid_index
|
||||||
|
|
||||||
- Тип: целое число
|
- Тип: целое число
|
||||||
- Значение по умолчанию: 0
|
|
||||||
|
|
||||||
Номер глобального идентификатора адреса RDMA-устройства, который следует
|
Номер глобального идентификатора адреса RDMA-устройства, который следует
|
||||||
использовать. Разным gid_index могут соответствовать разные протоколы связи:
|
использовать. Разным gid_index могут соответствовать разные протоколы связи:
|
||||||
RoCEv1, RoCEv2, iWARP. Чтобы понять, какой нужен вам - смотрите строчки со
|
RoCEv1, RoCEv2, iWARP. Чтобы понять, какой нужен вам - смотрите строчки со
|
||||||
словом "GID" в выводе команды `ibv_devinfo -v`.
|
словом "GID" в выводе команды `ibv_devinfo -v`.
|
||||||
|
|
||||||
**ВАЖНО:** Если вы хотите использовать RoCEv2 (как мы и рекомендуем), то
|
Если не указан, Vitastor попробует автоматически выбрать сначала GID,
|
||||||
правильный rdma_gid_index, как правило, 1 (IPv6) или 3 (IPv4).
|
соответствующий RoCEv2 IPv4, потом RoCEv2 IPv6, потом RoCEv1 IPv4, потом
|
||||||
|
RoCEv1 IPv6, потом IB.
|
||||||
|
|
||||||
|
Правильный rdma_gid_index для RoCEv2, как правило, 1 (IPv6) или 3 (IPv4).
|
||||||
|
|
||||||
## rdma_mtu
|
## rdma_mtu
|
||||||
|
|
||||||
|
|||||||
+26
-14
@@ -48,11 +48,15 @@
|
|||||||
type: string
|
type: string
|
||||||
info: |
|
info: |
|
||||||
RDMA device name to use for Vitastor OSD communications (for example,
|
RDMA device name to use for Vitastor OSD communications (for example,
|
||||||
"rocep5s0f0"). Now Vitastor supports all adapters, even ones without
|
"rocep5s0f0"). If not specified, Vitastor will try to find an RoCE
|
||||||
ODP support, like Mellanox ConnectX-3 and non-Mellanox cards.
|
device matching [osd_network](osd.en.md#osd_network), preferring RoCEv2,
|
||||||
|
or choose the first available RDMA device if no RoCE devices are
|
||||||
|
found or if `osd_network` is not specified.
|
||||||
|
|
||||||
Versions up to Vitastor 1.2.0 required ODP which is only present in
|
Vitastor supports all adapters, even ones without ODP support, like
|
||||||
Mellanox ConnectX >= 4. See also [rdma_odp](#rdma_odp).
|
Mellanox ConnectX-3 and non-Mellanox cards. Versions up to Vitastor
|
||||||
|
1.2.0 required ODP which is only present in Mellanox ConnectX >= 4.
|
||||||
|
See also [rdma_odp](#rdma_odp).
|
||||||
|
|
||||||
Run `ibv_devinfo -v` as root to list available RDMA devices and their
|
Run `ibv_devinfo -v` as root to list available RDMA devices and their
|
||||||
features.
|
features.
|
||||||
@@ -64,12 +68,16 @@
|
|||||||
PFC (Priority Flow Control) and ECN (Explicit Congestion Notification).
|
PFC (Priority Flow Control) and ECN (Explicit Congestion Notification).
|
||||||
info_ru: |
|
info_ru: |
|
||||||
Название RDMA-устройства для связи с Vitastor OSD (например, "rocep5s0f0").
|
Название RDMA-устройства для связи с Vitastor OSD (например, "rocep5s0f0").
|
||||||
Сейчас Vitastor поддерживает все модели адаптеров, включая те, у которых
|
Если не указано, Vitastor попробует найти RoCE-устройство, соответствующее
|
||||||
нет поддержки ODP, то есть вы можете использовать RDMA с ConnectX-3 и
|
[osd_network](osd.en.md#osd_network), предпочитая RoCEv2, или выбрать первое
|
||||||
картами производства не Mellanox.
|
попавшееся RDMA-устройство, если RoCE-устройств нет или если сеть `osd_network`
|
||||||
|
не задана.
|
||||||
|
|
||||||
Версии Vitastor до 1.2.0 включительно требовали ODP, который есть только
|
Vitastor поддерживает все модели адаптеров, включая те, у которых
|
||||||
на Mellanox ConnectX 4 и более новых. См. также [rdma_odp](#rdma_odp).
|
нет поддержки ODP, то есть вы можете использовать RDMA с ConnectX-3 и
|
||||||
|
картами производства не Mellanox. Версии Vitastor до 1.2.0 включительно
|
||||||
|
требовали ODP, который есть только на Mellanox ConnectX 4 и более новых.
|
||||||
|
См. также [rdma_odp](#rdma_odp).
|
||||||
|
|
||||||
Запустите `ibv_devinfo -v` от имени суперпользователя, чтобы посмотреть
|
Запустите `ibv_devinfo -v` от имени суперпользователя, чтобы посмотреть
|
||||||
список доступных RDMA-устройств, их параметры и возможности.
|
список доступных RDMA-устройств, их параметры и возможности.
|
||||||
@@ -94,23 +102,27 @@
|
|||||||
`ibv_devinfo -v`.
|
`ibv_devinfo -v`.
|
||||||
- name: rdma_gid_index
|
- name: rdma_gid_index
|
||||||
type: int
|
type: int
|
||||||
default: 0
|
|
||||||
info: |
|
info: |
|
||||||
Global address identifier index of the RDMA device to use. Different GID
|
Global address identifier index of the RDMA device to use. Different GID
|
||||||
indexes may correspond to different protocols like RoCEv1, RoCEv2 and iWARP.
|
indexes may correspond to different protocols like RoCEv1, RoCEv2 and iWARP.
|
||||||
Search for "GID" in `ibv_devinfo -v` output to determine which GID index
|
Search for "GID" in `ibv_devinfo -v` output to determine which GID index
|
||||||
you need.
|
you need.
|
||||||
|
|
||||||
**IMPORTANT:** If you want to use RoCEv2 (as recommended) then the correct
|
If not specified, Vitastor will try to auto-select a RoCEv2 IPv4 GID, then
|
||||||
rdma_gid_index is usually 1 (IPv6) or 3 (IPv4).
|
RoCEv2 IPv6 GID, then RoCEv1 IPv4 GID, then RoCEv1 IPv6 GID, then IB GID.
|
||||||
|
|
||||||
|
A correct rdma_gid_index for RoCEv2 is usually 1 (IPv6) or 3 (IPv4).
|
||||||
info_ru: |
|
info_ru: |
|
||||||
Номер глобального идентификатора адреса RDMA-устройства, который следует
|
Номер глобального идентификатора адреса RDMA-устройства, который следует
|
||||||
использовать. Разным gid_index могут соответствовать разные протоколы связи:
|
использовать. Разным gid_index могут соответствовать разные протоколы связи:
|
||||||
RoCEv1, RoCEv2, iWARP. Чтобы понять, какой нужен вам - смотрите строчки со
|
RoCEv1, RoCEv2, iWARP. Чтобы понять, какой нужен вам - смотрите строчки со
|
||||||
словом "GID" в выводе команды `ibv_devinfo -v`.
|
словом "GID" в выводе команды `ibv_devinfo -v`.
|
||||||
|
|
||||||
**ВАЖНО:** Если вы хотите использовать RoCEv2 (как мы и рекомендуем), то
|
Если не указан, Vitastor попробует автоматически выбрать сначала GID,
|
||||||
правильный rdma_gid_index, как правило, 1 (IPv6) или 3 (IPv4).
|
соответствующий RoCEv2 IPv4, потом RoCEv2 IPv6, потом RoCEv1 IPv4, потом
|
||||||
|
RoCEv1 IPv6, потом IB.
|
||||||
|
|
||||||
|
Правильный rdma_gid_index для RoCEv2, как правило, 1 (IPv6) или 3 (IPv4).
|
||||||
- name: rdma_mtu
|
- name: rdma_mtu
|
||||||
type: int
|
type: int
|
||||||
default: 4096
|
default: 4096
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ static matched_dev match_device(ibv_device **dev_list, addr_mask_t *networks, in
|
|||||||
ibv_port_attr portinfo;
|
ibv_port_attr portinfo;
|
||||||
ibv_gid_entry best_gidx;
|
ibv_gid_entry best_gidx;
|
||||||
int res;
|
int res;
|
||||||
|
bool have_non_roce = false, have_roce = false;
|
||||||
for (int i = 0; dev_list[i]; ++i)
|
for (int i = 0; dev_list[i]; ++i)
|
||||||
{
|
{
|
||||||
auto dev = dev_list[i];
|
auto dev = dev_list[i];
|
||||||
@@ -161,6 +162,11 @@ static matched_dev match_device(ibv_device **dev_list, addr_mask_t *networks, in
|
|||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (gidx.gid_type != IBV_GID_TYPE_ROCE_V1 &&
|
||||||
|
gidx.gid_type != IBV_GID_TYPE_ROCE_V2)
|
||||||
|
have_non_roce = true;
|
||||||
|
else
|
||||||
|
have_roce = true;
|
||||||
if (match_gid(&gidx, networks, nnet))
|
if (match_gid(&gidx, networks, nnet))
|
||||||
{
|
{
|
||||||
// Prefer RoCEv2
|
// Prefer RoCEv2
|
||||||
@@ -186,6 +192,10 @@ cleanup:
|
|||||||
{
|
{
|
||||||
log_rdma_dev_port_gid(dev_list[best.dev], best.port, best.gid, best_gidx);
|
log_rdma_dev_port_gid(dev_list[best.dev], best.port, best.gid, best_gidx);
|
||||||
}
|
}
|
||||||
|
if (best.dev < 0 && have_non_roce && !have_roce)
|
||||||
|
{
|
||||||
|
best.dev = -2;
|
||||||
|
}
|
||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,11 +247,17 @@ msgr_rdma_context_t *msgr_rdma_context_t::create(std::vector<std::string> osd_ne
|
|||||||
nets.push_back(cidr_parse(netstr));
|
nets.push_back(cidr_parse(netstr));
|
||||||
}
|
}
|
||||||
auto best = match_device(dev_list, nets.data(), nets.size(), log_level);
|
auto best = match_device(dev_list, nets.data(), nets.size(), log_level);
|
||||||
if (best.dev < 0)
|
if (best.dev == -2)
|
||||||
|
{
|
||||||
|
best.dev = 0;
|
||||||
|
if (log_level > 0)
|
||||||
|
fprintf(stderr, "No RoCE devices found, using first available RDMA device %s\n", ibv_get_device_name(*dev_list));
|
||||||
|
}
|
||||||
|
else if (best.dev < 0)
|
||||||
{
|
{
|
||||||
if (log_level > 0)
|
if (log_level > 0)
|
||||||
fprintf(stderr, "RDMA device matching osd_network is not found, using first available device\n");
|
fprintf(stderr, "RDMA device matching osd_network is not found, disabling RDMA\n");
|
||||||
best.dev = 0;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -301,10 +317,11 @@ msgr_rdma_context_t *msgr_rdma_context_t::create(std::vector<std::string> osd_ne
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// Prefer IPv4 RoCEv2 GID by default
|
// Prefer IPv4 RoCEv2 -> IPv6 RoCEv2 -> IPv4 RoCEv1 -> IPv6 RoCEv1 -> IB
|
||||||
if (gid_index == -1 ||
|
if (gid_index == -1 ||
|
||||||
gidx.gid_type == IBV_GID_TYPE_ROCE_V2 &&
|
gidx.gid_type == IBV_GID_TYPE_ROCE_V2 && ctx->my_gid.gid_type != IBV_GID_TYPE_ROCE_V2 ||
|
||||||
(ctx->my_gid.gid_type != IBV_GID_TYPE_ROCE_V2 || is_ipv4_gid(&gidx)))
|
gidx.gid_type == IBV_GID_TYPE_ROCE_V1 && ctx->my_gid.gid_type == IBV_GID_TYPE_IB ||
|
||||||
|
gidx.gid_type == ctx->my_gid.gid_type && is_ipv4_gid(&gidx))
|
||||||
{
|
{
|
||||||
gid_index = k;
|
gid_index = k;
|
||||||
ctx->my_gid = gidx;
|
ctx->my_gid = gidx;
|
||||||
|
|||||||
Reference in New Issue
Block a user