写点什么

技术解析丨加速高性能计算,RDMA 在分布式存储中的性能优化实践

作者:焱融科技
  • 2024-10-28
    北京
  • 本文字数:3763 字

    阅读完需:约 12 分钟

随着 GPU 技术的持续革新和数据集规模的不断扩大,机器学习(ML)系统提供商必须确保其存储解决方案能够满足日益增长的计算需求。在机器学习系统快速变化的时期,一项技术领域的进步往往会激发其他领域产生新的需求。

——MLCommons


9 月 25 日,MLCommons 发布的最新 MLPerf™ Storage v1.0 存储基准测试结果表明,存储系统在 AI 模型训练中发挥着至关重要的作用。焱融科技深度参与了本次基准测试,在此过程中我们发现,为了实现 AI 计算存储的性能需求,存储系统需集成全链路 direct I/O、NUMA 优化、多网络带宽聚合等关键特性。此外,为进一步提升数据传输访问性能,RDMA (Remote Direct Memory Access,远程直接内存访问) 技术也成为一项关键选择。这也验证了 MLConmons 的结论——随着 GPU 的快速迭代和大规模数据集的不断增长,为了确保整体 AI 训练系统的效率,存储网络也需要不断进化,对 RDMA 的需求变得愈发迫切。


凭借低延迟和高吞吐量的优势,RDMA 现已成为 AI 存储系统中的重要技术选项。然而,与传统 TCP socket 通过简单调用 API 即可完成网络通信的方式不同,RDMA 要求用户处理更多通信细节,这无疑增加了其使用的复杂性。如何高效、稳定地利用 RDMA 技术成为充分发挥存储系统性能的重要影响因素。在本篇文章中,我们将分享焱融科技在 RDMA 网络技术支持方面的实践经验,并深入探讨 RDMA 性能调优的实用技巧,为企业存储系统性能提升提供参考。

实现高效 RDMA 传输的 5 点实践经验


  1. 使用 QP 的注意事项

RDMA 通过创建通道(Channel)来提供消息服务,Channel 为两个完全不相连的虚拟地址或不同服务器(Server)之间提供连接。作为 Channel 的末端抽象,QP(Queue Pair)是应用访问网卡的入口,由发送队列(Send Queue)和接收队列(Receive Queue)组成。RDMA 协议要求接收端提前准备好足够的空间来接收发送端的数据,否则会引起接收未就绪(Receive Not Ready,RNR)错误。为避免此类错误,需要注意以下两点:


  • 协商 QP 大小:在建立连接时,接收端与发送端需协商 QP 大小,确保接收端的 Receive Queue Size 大于发送端的 Send Queue Size,以避免因接收端空间不足导致传输失败。但需注意,这一设置不可超过网卡所支持的最大长度。

  • WR(Worker Request)的处理:在传输过程中,确认接收端已经将 WR(Worker Request)从 Receive Queue 中取走后,才可继续发送,否则即使做到了协商 QP 大小,仍然存在 RNR 的风险。


  1. 主动确认(ACK)连接事件

RDMA 连接的建立通常通过 rdma_cm 库完成,这一过程由事件驱动,经由多个事件后完成连接建立。在建立连接的过程中,对于每次收到的事件,需主动调用 rdma_ack_cm_event() 执行 ACK,否则会导致建连阻塞。同样,在断开连接时,通过 rdma_disconnect() 主动发起断开请求,或者等待对端断开连接,收到 DISCONNECT 事件后,需调用 rdma_destroy_id() 来销毁 rdma_id。需要特别注意的是,在调用 rdma_destroy_id() 之前,必须确保对收到的事件已经了执行 ACK,以防止潜在的死锁情况发生。


  1. 合理设置连接超时时间

在通过 rdma_connect() 建立连接时,连接超时时间是硬编码(hardcore)在 rdma_cm 库中的,最长可达 289 秒,具体取决于网络类型(IB/Ethernet)及 rdma cm 版本。在网络故障时,如此长的建连超时时间不可接受。因此,应用层需要根据自身需求设置一个合理的等待时间,在超过设置时长后及时 failover 到另一条链路。需注意,“超时”的连接资源需要等待 rdma_cm 库返回特定事件后再进行释放,否则可能导致访问无效内存。同时,“超时”连接释放时也要注意正确释放资源,以避免多次释放引起异常或少释放引起资源泄漏。


  1. 设置合适的 backlog 参数

RDMA 服务端通过调用 rdma_listen(struct rdma_cm_id *id, int backlog) 启动对客户端发起的建连请求的监听。这里的 backlog 参数定义了服务端能够同时处理的的建连请求的最大数量。若服务端收到的建连请求数量超出此值,RDMA 驱动内部会立刻返回一个错误,并且不会处理这些超出的建连请求 CONNECT_REQUEST 事件(代码示例如下)。而且,在这种情况下,RDMA 驱动并不会向上层应用投递任何相关的事件通知,应用无法感知此错误,这可能导致应用的连接建立过程陷入挂起状态。


static int ucma_connect_event_handler(struct rdma_cm_id *cm_id,                      struct rdma_cm_event *event){    struct ucma_context *listen_ctx = cm_id->context;    struct ucma_context *ctx;    struct ucma_event *uevent;
if (!atomic_add_unless(&listen_ctx->backlog, -1, 0)) return -ENOMEM; ……}
复制代码


因此,为了确保连接建立的顺畅进行,服务端需要根据实际情况来合理设置 backlog 参数的值,并增加相应的异常处理机制,以便在连接请求超出处理能力时能够及时感知并处理这种情况,从而避免连接建立过程被挂起。同时,需注意,backlog 的值不可超过系统参数 net.rdma_ucm.max_backlog 的默认值(默认 1024)。因此,在设置 backlog 时需要修改对应的系统参数,以确保所设置的 backlog 值能够生效。


  1. 使用共享接收队列 SRQ

在上文中,我们已经提及 QP 由发送队列(Send Queue)和接收队列(Receive Queue)组成。每个 QP 可以使用独立的 Receive Queue,也可以使用共享的接收队列(Shared Receive Queue,SRQ)。


在没有 SRQ 的情况下,接收方因无法预知对端发送数据的时间和数量,往往需要预先在接收队列中布置大量的接收工作队列条目(Work Queue Entry,简称 WQE),以应对潜在的数据传输需求。这种做法在业务处于空闲状态时,会造成大量的资源闲置和浪费。尽管可以通过流控机制向对方传达“我这边容量不足”的信息,但这种方式不仅会增加通信延迟,而且其实现过程也相对复杂。相比之下,使用 SRQ 可以解决这一问题。SRQ 允许多个 QP 共享同一组接收 WQE,从而实现资源的更有效利用。



RDMA 性能调优实用技巧


基于上述的实践经验,我们能够有效地规避 RDMA 网络传输中的常见问题。然而,要全面挖掘并发挥 RDMA 的性能潜力,还需持续开展针对性的调优工作。特别是在 AI 应用场景下,随着数据规模和复杂度的不断攀升,进一步提升 RDMA 网络的效率对于优化数据传输速度具有重要意义。接下来,我们将介绍几种 RDMA 性能调优的实用技巧。


  1. 全路径零拷贝

RDMA 的零拷贝技术使得网卡能够直接与应用内存相互传输数据,消除了应用内存与内核之间的数据复制过程,从而显著降低了网络传输延迟。然而,值得注意的是,即便是在 RDMA 的零拷贝基础上,应用内部仍可能存在内存拷贝,例如副本分发、EC 计算等,这可能成为制约性能提升的因素。因此,为了进一步提升性能,应用内部也应实现零拷贝,确保整个 IO 路径上都实现零拷贝,即全路径零拷贝。


2. 内存池化

在使用 RDMA 时,需要提前申请内存并注册一个内存区域 MR(Memory Region)。为了避免在 IO 过程中或建立连接时进行内存申请及注册 MR 导致的建连失败和耗时风险,推荐采用更加高效的内存池化的方法,一次完成内存的申请和 MR 的注册,并在后续使用中复用这些内存和 MR。同时,申请内存池时应使用连续大内存以提高性能,并考虑内存池、线程及 NUMA 的关系以避免跨 NUMA 访问。


3. 智能切换完成事件的通知模式

网卡处理完一个请求后会产生一个 CQE(Completion Queue Entry),并将其放入 CQ (Completion Queue) 中。为了让应用及时获取 CQE,需建立一个合适的通知机制。中断和轮询是当前两种常用的通知机制。中断方式在网卡完成请求后会发送一个中断给 CPU,CPU 处理中断,取出 CQE 给应用层。轮询方式则是周期性地检查 CQ 中是否有 CQE,若有则取出。这种通知机制可以降低延迟,但在业务空闲时会额外消耗 CPU 资源。因此,企业需要根据业务的负载智能地切换中断与轮询机制——业务空闲时使用中断机制,繁忙时使用轮询机制,高效平衡延迟和 CPU 资源消耗。


4. 批量确认 CQE

在处理 CQE 时,如果每发起一次请求就立即获取对应的 CQE,会造成高频的 ibv_poll_cq() 调用。为了减少高频调用带来的消耗,可以批量获取 CQE,在高吞吐量环境下提升性能。


5. 分开处理控制消息与数据消息

RDMA 消息服务支持 SEND/RECV 及 RDMA_READ/RDMA_WRITE 语义。前者更适合小数据传输(例如小于 8KiB),适合传输控制消息,例如 message header 等;后者适合大数据传输(大于 8KiB),适用于大块数据消息传输。将控制消息与数据消息分开处理可以优化资源利用和传输效率。


在 AI 大模型技术迅猛发展的今天,如何高效地实现 RDMA 数据传输并不断推进性能优化,是提升整体存储系统性能及上层业务效率的关键。希望本文分享的内容能够对企业更好利用 RDMA 技术优化存储系统性能提供一定的参考和启发。


焱融科技作为国内专业的 AI 存储解决方案提供商,在支持 InfiniBand(IB)、RoCE 等 RDMA 网络协议上具有深厚的技术积累。公司的全闪存储新品——焱融追光全闪存储一体机 F9000X 更是国内首款支持 NVIDIA NDR 400 InfiniBand / 400GbE RoCE 网络的文件存储产品,3 节点存储集群的性能达到了 750 万 IOPS 和 260 GBps 带宽,充分满足 AI 高算力场景下的严苛需求,为用户提供前所未有的数据传输体验。在本次 MLPerf 存储基准测试中,焱融全闪 F9000X 展现了出色的性能,显著提升了 GPU/ML 工作负载的处理速度,再次证明了焱融高性能存储产品具备支持各种 AI 模型训练和高性能计算场景的能力。


用户头像

焱融科技

关注

软件定义的混合云统一文件存储 2020-05-29 加入

焱融科技是一家以软件定义存储技术为核心竞争力的高新技术企业,基于软件定义的混合云统一文件存储为企业客户提供高效存储、数据管理和应用服务,打造面向云+AI 时代的高性能存储。

评论

发布
暂无评论
技术解析丨加速高性能计算,RDMA 在分布式存储中的性能优化实践_AI_焱融科技_InfoQ写作社区