Leistung von MPI-Anwendungen mit PSM3 verbessern

Auf dieser Seite werden die PSM3-Konfigurationsparameter beschrieben, die wir für MPI-Anwendungen empfehlen, die auf H4D-Compute-Instanzen und Cloud RDMA ausgeführt werden.

Informationen zu allen verfügbaren PSM3-Konfigurationsparametern finden Sie im Intel Ethernet Fabric Suite Host Software User Guide.

Empfehlungen für Anwendungen mit burstartigen Datenflüssen oder hohem UD-Traffic

Anwendungen, bei denen es zu plötzlichen Traffic-Spitzen kommt oder die stark auf den Modus „Unreliable Datagram“ (UD) angewiesen sind, können die Netzwerkschnittstelle überlasten und zu Paketverlusten an der Quelle führen.

  • Lösung: Konfigurieren Sie das kreditbasierte Backpressure-System, um Übertragungspitzen zu regulieren und Paketverluste auf der Transportschicht zu verhindern. Eine Compute Engine H4D-Instanz bietet insgesamt 256 Credits. Wir empfehlen, jeder vCPU mindestens 1 festen Credit zuzuweisen und die verbleibende Kapazität in einem gemeinsam genutzten Pool zu platzieren.
  • Empfohlene Konfiguration (Beispiel für 192 Ranks pro Knoten): Wenn jede vCPU 1 festen Credit erhält, beträgt der gemeinsame Pool für einen Vorgang mit 192 Ranks pro Knoten 256 – 192 = 64.

    IRDMA_SHARED_UD_CREDITS=64
    IRDMA_TRANSPARENT_UD_QD_OVERRIDE=1
    

Wenn Sie die Gesamtzahl der Credits über die empfohlenen Grenzwerte hinaus erhöhen, kann dies zu Übertragungsverlusten an der Quelle führen. Obwohl die Überschreitung des Kontingents (Festlegen einer höheren Anzahl von Credits als verfügbar) die Leistung für Arbeitslasten mit gleichmäßigen, geringen Traffic-Mustern verbessern kann, verschlechtert sie in der Regel die Leistung für Arbeitslasten, die durch plötzliche Spitzen oder hohen UD-Traffic gekennzeichnet sind.

Die Umgebungsvariablen, die Sie zum Optimieren der Cloud RDMA-Leistung verwenden können, sind folgende:

  • IRDMA_SHARED_UD_CREDITS: gibt die Größe eines globalen Pools von UD-Credits an, die für alle Prozesse auf einem einzelnen Knoten verfügbar sind. Bei einem Wert von 64 bedeutet dies, dass eine gemeinsame Reserve von 64 Credits vorhanden ist, die von jedem Prozess verwendet werden kann.
  • IRDMA_TRANSPARENT_UD_QD_OVERRIDE: begrenzt die Warteschlangentiefe für Warteschlangenpaare (Queue Pairs, QPs) , die UD im irdma Treiber verwenden. Wenn diese Variable auf 1 festgelegt ist, wird sie mit IRDMA_SHARED_UD_CREDITS verwendet, um den Backpressure auf der Transportschicht zu erzwingen und Überläufe der Übertragungswarteschlange bei hoher Last durch mehrere Prozesse zu verhindern.

Empfehlungen für Anwendungen mit hohen Anforderungen an Zuverlässigkeit oder Arbeitsspeicher

Damit die Zuverlässigkeit von UD-Paketen auf der Empfängerseite gewährleistet ist, müssen Ihre RDMA-Anwendungen genügend Empfangspuffer zuweisen und Slots in der Completion Queue (CQ) verfügbar halten.

  • Standardempfehlung für hohe Zuverlässigkeit: Verwenden Sie die folgenden Umgebungsvariablen, um höhere Warteschlangentiefen anzugeben, um UD-Paketverluste in der Empfangswarteschlange (RX) nach Möglichkeit zu vermeiden.

    PSM3_NUM_RECV_WQES=32767
    PSM3_NUM_RECV_CQES=65536
    
  • Ausnahme für hohe Arbeitsspeicheranforderungen: Wenn bei Ihrer Anwendung Probleme mit dem Arbeitsspeicher auftreten (Out of Memory, OOM), reduzieren Sie die Warteschlangengrößen, behalten aber das gleiche Verhältnis zwischen den beiden Werten bei.

    Anwendungen wie High Performance Conjugate Gradients (HPCG) haben massive Arbeitsspeicheranforderungen. Die Verwendung der Einstellungen für die Standardempfehlung für hohe Zuverlässigkeit kann zu OOM-Fehlern führen. PSM3_NUM_RECV_WQES bestimmt die Anzahl der RX-Arbeitswarteschlangeneinträge (Work Queue Entries, WQEs) und der Eager-Bounce-Puffer, die pro lokalem Endpunkt zugewiesen werden. Höhere Werte führen zu einem größeren Arbeitsspeicher-Overhead.

Die Umgebungsvariablen, die Sie zum Verbessern der Zuverlässigkeit oder der Arbeitsspeicherauslastung verwenden können, sind folgende:

  • PSM3_NUM_RECV_WQES: legt die Anzahl der zuzuweisenden RX-WQEs fest. Die Größe der UD-QP wird auf PSM3_NUM_RECV_WQES + 1032 WQEs festgelegt. Mit diesem Parameter wird auch die Anzahl der UD-Eager-Bounce-Puffer für den Empfang festgelegt (jeweils mit der Größe PSM3_MTU), die für jeden lokalen Endpunkt zugewiesen werden.

  • PSM3_NUM_RECV_CQES: steuert die Anzahl der Completion Queue Entries (CQEs) für Empfangsvorgänge. Dieser Parameter trägt zur Zuverlässigkeit von UD-Paketen auf der Empfängerseite bei, indem er dafür sorgt, dass in der Completion Queue immer Slots verfügbar sind. Eine höhere Warteschlangentiefe, z. B. 65536, kann UD-Paketverluste in der Empfangswarteschlange vermeiden, verbraucht aber Arbeitsspeicher und kann bei speicherintensiven Anwendungen zu OOM-Fehlern führen.

Empfehlungen für Anwendungen, die keine Puffer wiederverwenden

Einige Anwendungen, z. B. High-performance LINPACK (HPL), weisen häufig temporäre Kommunikationspuffer zu und geben sie wieder kostenlos, anstatt sie beizubehalten und wiederzuverwenden. Dieser kontinuierliche Zyklus von Anfordern und Freigeben von Arbeitsspeicher zwingt das System, Arbeitsspeicherseiten ständig zu registrieren und die Registrierung aufzuheben, was zu einem erheblichen Leistungsengpass führt.

  • Lösung: Verwenden Sie als Behelfslösung einen benutzerdefinierten Speicher-Allocator wie jemalloc. jemalloc ist ein leistungsstarker Speicher-Allocator (malloc) für allgemeine Zwecke, der auf die Skalierung der Nebenläufigkeit ausgelegt ist und die Arbeitsspeicherfragmentierung vermeidet. Durch die erzwungene effiziente Wiederverwendung großer Kommunikationspuffer (größer als 128 KB) umgeht diese Lösung kostspielige Neuzuweisungszyklen des Kernels und stellt die PSM3-Leistung wieder her.

  • Empfohlene Konfiguration:

    1. Installieren Sie jemalloc. Unter Rocky Linux können Sie beispielsweise die folgenden Befehle ausführen, die das EPEL-Repository (Extra Packages for Enterprise Linux) verwenden:

      sudo dnf install epel-release
      sudo dnf install jemalloc
      
    2. Laden Sie jemalloc vor und wenden Sie optimierte Cache-Limits an, bevor Sie Ihre Anwendung ausführen:

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

Der Konfigurationsbefehl verwendet die folgenden Einstellungen:

  • LD_PRELOAD: gibt die freigegebenen Bibliotheken an, die vor dem Start eines Prozesses geladen werden sollen.
  • MALLOC_CONF: konfiguriert das Verhalten bei der Arbeitsspeicherzuweisung für jemalloc.
  • dirty_decay_ms:-1 und muzzy_decay_ms:-1: weisen jemalloc an, nicht verwendeten Arbeitsspeicher niemals an das Betriebssystem zurückzugeben. Dadurch bleiben Seiten dauerhaft registriert und können sofort wiederverwendet werden.
  • lg_tcache_max:26: erhöht das Arbeitsspeicher-Cache-Limit pro Thread auf 64 MB, wodurch sichergestellt wird, dass große Kommunikationspuffer aggressiv im Cache gespeichert werden.

Nächste Schritte