提高使用 PSM3 的 MPI 应用的性能

本页面介绍了建议您在 H4D 计算实例上运行的 MPI 应用中使用 Cloud RDMA 时使用的 PSM3 配置参数。

如需了解所有可用的 PSM3 配置参数,请参阅 Intel Ethernet Fabric Suite 主机软件用户指南

针对数据流突发或 UD 流量大的应用的建议

如果应用突然出现流量高峰或严重依赖不可靠的数据报 (UD) 模式,可能会使网络接口过载,导致源端丢包。

  • 解决方案:配置基于信用的反压力系统,以调节传输突发并防止传输层丟包。一个 Compute Engine H4D 实例总共提供 256 个积分。我们建议您为每个 vCPU 分配至少 1 个固定积分,并将所有剩余容量放入共享池中。
  • 建议的配置(每个节点 192 个 rank 的示例):对于每个节点 192 个 rank 的操作,如果每个 vCPU 获得 1 个固定积分,则共享池将为 256 - 192 = 64。

    IRDMA_SHARED_UD_CREDITS=64
    IRDMA_TRANSPARENT_UD_QD_OVERRIDE=1
    

如果总信用数超出建议的限额,可能会导致源端传输丢包。虽然过度订阅(将总信用额度设置为高于可用信用额度)可以提高具有稳定低密度流量模式的工作负载的性能,但通常会降低以突发流量或大量 UD 流量为特征的工作负载的性能。

您可以使用以下环境变量来调整 Cloud RDMA 性能:

  • IRDMA_SHARED_UD_CREDITS:指定可供单个节点上的所有进程使用的全局 UD 信用池的大小。如果值为 64,则表示有一个 64 个积分的共享储备,任何进程都可以使用。
  • IRDMA_TRANSPARENT_UD_QD_OVERRIDE:限制 irdma 驱动程序中使用 UD 的队列对 (QP) 的队列深度。设置为 1 时,它会与 IRDMA_SHARED_UD_CREDITS 搭配使用,以强制执行传输层反压,并防止在多进程高负载下出现传输队列溢出。

针对具有高可靠性或高内存要求的应用的建议

为确保接收端 UD 数据包的可靠性,您的 RDMA 应用必须分配足够的接收缓冲区,并在完成队列 (CQ) 中保持可用槽位。

  • 高可靠性标准建议:使用以下环境变量来指定更高的队列深度,尽最大努力避免接收队列 (RX) UD 数据包丢弃。

    PSM3_NUM_RECV_WQES=32767
    PSM3_NUM_RECV_CQES=65536
    
  • 高内存需求情况下的例外情况:如果您的应用面临内存不足 (OOM) 问题,请减小队列大小,但保持这两个值之间的比例不变。

    高性能共轭梯度 (HPCG) 等应用对内存有极高的要求。使用高可靠性标准建议的设置可能会导致 OOM 错误。PSM3_NUM_RECV_WQES 用于指定每个本地端点分配的接收工作队列条目 (WQE) 和急切反弹缓冲区数量。值越大,内存开销就越大。

您可以使用以下环境变量来提高可靠性或内存利用率:

  • PSM3_NUM_RECV_WQES:设置要分配的 RX WQE 数量。UD QP 的大小为 PSM3_NUM_RECV_WQES + 1032 WQEs。此形参还会设置为每个本地端点分配的 UD 接收急切反弹缓冲区数量(每个缓冲区的大小为 PSM3_MTU)。

  • PSM3_NUM_RECV_CQES:控制用于接收操作的完成队列条目 (CQE) 数量。此参数可确保完成队列中始终有可用的 slot,从而有助于确保接收端 UD 数据包的可靠性。较高的队列深度(例如 65536)有助于避免 RX UD 数据包丢弃,但会使用内存,并可能导致内存密集型应用出现 OOM 错误。

不重复使用缓冲区的应用的建议

某些应用(例如 High-performance LINPACK [HPL])会频繁分配和释放临时通信缓冲区,而不是保留和重复使用这些缓冲区。这种不断请求和释放内存的循环会迫使系统不断注册和注销内存页,从而造成严重的性能瓶颈。

  • 解决方案:作为解决方法,请使用自定义内存分配器(如 jemalloc)。 jemalloc 是一款高性能通用内存分配器 (malloc),旨在强调并发伸缩并避免内存碎片。通过强制高效回收大型通信缓冲区(大于 128 KB),此解决方案可绕过昂贵的内核重新分配周期并恢复 PSM3 性能。

  • 推荐的配置

    1. 安装 jemalloc。例如,在 Rocky Linux 上,您可以运行以下命令,这些命令使用 Extra Packages for Enterprise Linux (EPEL) 代码库:

      sudo dnf install epel-release
      sudo dnf install jemalloc
      
    2. 在运行应用之前,预加载 jemalloc 并应用优化的缓存限制:

      LD_PRELOAD="/usr/lib64/libjemalloc.so.2"
      export MALLOC_CONF="dirty_decay_ms:-1,muzzy_decay_ms:-1,lg_tcache_max:26"
      

配置命令使用以下设置:

  • LD_PRELOAD:指定在启动进程之前要加载的共享库。
  • MALLOC_CONF:为 jemalloc 配置内存分配行为。
  • dirty_decay_ms:-1muzzy_decay_ms:-1:指示 jemalloc 永远不要将未使用的内存返回给操作系统。这样可使页面永久注册,以便立即重复使用。
  • lg_tcache_max:26:将每个线程的内存缓存限制增加到 64 MB,从而确保积极缓存大型通信缓冲区。

后续步骤