You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

libfabric verbs/DRMA客户端能否指定源端口及代码问题排查

关于libfabric指定源端口的问题解答

1. verbs/RDMA中能否指定源端口?

可以,但分场景:

  • 基于IP的RDMA实现(如RoCEv2、IPoIB):这类实现依赖UDP协议,支持指定UDP源端口,对应你代码中sockaddr_in的端口字段。
  • 原生InfiniBand(非IP封装):这类场景下不使用TCP/UDP端口,而是用LID(本地标识符)和GID(全局标识符)标识端点,“源端口”的概念不适用。

2. 你的代码存在的问题

  • 内存清零错误:memset(src_addr, 0, sizeof(src_addr));中sizeof(src_addr)计算的是指针本身的大小(通常8字节),而非sockaddr_in结构体的大小,导致地址结构体未被正确初始化,可能出现随机值干扰。
  • 资源泄漏:用new分配的src_addr没有释放,会造成内存泄漏。
  • hint参数的局限性:部分libfabric provider(包括verbs)不会直接使用hint中的src_addr绑定端口,fi_getinfo主要用于获取可用的endpoint信息,而非直接设置源地址。
  • 地址格式匹配问题:若provider不支持FI_SOCKADDR_IN格式,会忽略源地址设置。

3. 实现指定源端口的额外步骤

要成功指定源端口,需在fi_getinfo之后,通过fi_bind显式绑定源地址到endpoint,具体修正如下:

修正后的代码示例

...
auto _hint = fi_allocinfo();
std::shared_ptr<fi_info> hint(_hint, std::bind(&fi_freeinfo, std::placeholders::_1));
hint->ep_attr->type = FI_EP_MSG;
hint->caps = FI_MSG;
hint->domain_attr->mr_mode = FI_MR_BASIC;
hint->mode = FI_LOCAL_MR;

// 用栈分配结构体避免内存泄漏
struct sockaddr_in src_addr{};
memset(&src_addr, 0, sizeof(src_addr)); // 正确获取结构体大小
src_addr.sin_family = AF_INET;
src_addr.sin_addr.s_addr = htonl(INADDR_ANY);
src_addr.sin_port = htons(8899); // 指定源端口

// 获取endpoint信息
int ret = fi_getinfo(OFI_VERSION, address.c_str(), input.c_str(), 0, hint.get(), &_info);
if (ret) {
    std::cout << "connect():fi_getinfo failed" << std::endl;
    return nullptr;
}

// 创建domain(省略错误检查)
struct fid_domain *domain = nullptr;
ret = fi_domain(_info->fabric, _info, &domain, nullptr);

// 创建endpoint(省略错误检查)
struct fid_ep *ep = nullptr;
ret = fi_endpoint(domain, _info, &ep, nullptr);

// 显式绑定源地址到endpoint
ret = fi_bind((fid_t)ep, (const void*)&src_addr, FI_SOCKADDR_IN);
if (ret) {
    std::cout << "fi_bind source address failed" << std::endl;
    // 资源清理逻辑
    return nullptr;
}

// 后续connect/listen等操作
...

额外注意事项

  • provider选择:确保使用支持IP-based RDMA的provider(如verbs provider配置为RoCEv2模式),原生IB provider不支持UDP端口。
  • 端口占用检查:指定的端口(8899)需未被其他进程占用,可通过ss -ulpn命令检查。
  • 权限问题:若使用1024以下的特权端口,需以root权限运行应用。

内容的提问来源于stack exchange,提问作者Ajin Pradeep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:23:21