Fehlerbehebung bei VM-Fehlern aufgrund von fehlendem Arbeitsspeicher

Auf dieser Seite finden Sie Informationen zu Fehlern aufgrund fehlenden Speichers (Out-of-Memory, OOM) bei Dataproc auf Compute Engine-VMs. Außerdem werden Schritte zur Fehlerbehebung und Behebung von OOM-Fehlern beschrieben.

Auswirkungen von OOM-Fehlern

Wenn auf Dataproc-VMs in Compute Engine Fehler vom Typ „Out of Memory“ (OOM) auftreten, sind die Auswirkungen unter anderem die folgenden:

  • Master- und Worker-VMs frieren für einen bestimmten Zeitraum ein.

  • OOM-Fehler bei Master-VMs führen dazu, dass Jobs mit „task not acquired“-Fehlern fehlschlagen.

  • OOM-Fehler (Out-of-Memory) bei Worker-VMs führen zu einem Verlust des Knotens in YARN HDFS, was die Ausführung von Dataproc-Jobs verzögert.

YARN-Speichersteuerungselemente

Apache YARN bietet die folgenden Arten von Speichersteuerungen:

  • Umfragebasiert (alt)
  • Strikt
  • Elastic

Standardmäßig wird yarn.nodemanager.resource.memory.enabled in Dataproc nicht festgelegt, um YARN-Speichersteuerungen zu aktivieren. Das hat folgende Gründe:

  • Eine strenge Speicherverwaltung kann dazu führen, dass Container beendet werden, obwohl ausreichend Speicher vorhanden ist, wenn die Containergrößen nicht richtig konfiguriert sind.
  • Die Anforderungen für die Steuerung des elastischen Speichers können sich negativ auf die Jobausführung auswirken.
  • YARN-Speichersteuerungen können OOM-Fehler möglicherweise nicht verhindern, wenn Prozesse aggressiv Speicher belegen.

Dataproc-Speicherschutz

Wenn eine Dataproc-Cluster-VM unter Speichermangel leidet, beendet der Dataproc-Speicherschutz Prozesse oder Container, bis die OOM-Bedingung behoben ist.

Dataproc bietet Speicherschutz für die folgenden Clusternodes in den folgenden Dataproc on Compute Engine-Imageversionen:

Rolle 1,5 2.0 2.1 2.2
Master-VM 1.5.74+ 2.0.48+ Alle Alle
Worker-VM Nicht verfügbar 2.0.76+ 2.1.24+ Alle
Driver Pool-VM Nicht verfügbar 2.0.76+ 2.1.24+ Alle

Beendigungen des Speicherschutzes erkennen und bestätigen

Anhand der folgenden Informationen können Sie Jobbeendigungen aufgrund von Speichermangel identifizieren und bestätigen.

Prozessbeendigungen

  • Prozesse, die durch den Dataproc-Speicherschutz beendet werden, werden mit dem Code 137 oder 143 beendet.

  • Wenn Dataproc einen Prozess aufgrund von Speicherdruck beendet, können die folgenden Aktionen oder Bedingungen eintreten:

    • Dataproc erhöht den kumulativen Messwert dataproc.googleapis.com/node/problem_count und setzt reason auf ProcessKilledDueToMemoryPressure. Weitere Informationen finden Sie unter Erfassung von Messwerten für Dataproc-Ressourcen.
    • Dataproc schreibt ein google.dataproc.oom-killer-Log mit der Meldung: "A process is killed due to memory pressure: process name. Wenn Sie diese Meldungen aufrufen möchten, aktivieren Sie das Logging und verwenden Sie dann den folgenden Logfilter:
      resource.type="cloud_dataproc_cluster"
      resource.labels.cluster_name="CLUSTER_NAME"
      resource.labels.cluster_uuid="CLUSTER_UUID"
      jsonPayload.message:"A process is killed due to memory pressure:"
      

Beenden von Jobs für Master- oder Driver-Knotenpools

  • Wenn ein Dataproc-Masterknoten oder ein Job im Treiberknotenpool aufgrund von Arbeitsspeicherausfall beendet wird, schlägt der Job mit dem Fehlercode Driver received SIGTERM/SIGKILL signal and exited with INT fehl. Wenn Sie diese Meldungen aufrufen möchten, aktivieren Sie das Logging und verwenden Sie dann den folgenden Logfilter:

    resource.type="cloud_dataproc_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.cluster_uuid="CLUSTER_UUID"
    jsonPayload.message:"Driver received SIGTERM/SIGKILL signal and exited with"
        

    • Prüfen Sie das google.dataproc.oom-killer-Log oder dataproc.googleapis.com/node/problem_count, um zu bestätigen, dass der Job durch Dataproc Memory Protection beendet wurde (siehe Prozessbeendigungen).

    Lösungen:

    • Wenn der Cluster einen Treiberpool hat, erhöhen Sie driver-required-memory-mb auf die tatsächliche Arbeitsspeichernutzung des Jobs.
    • Wenn der Cluster keinen Treiberpool hat, erstellen Sie den Cluster neu und verringern Sie die maximale Anzahl gleichzeitiger Jobs, die im Cluster ausgeführt werden.
    • Verwenden Sie einen Masterknoten-Maschinentyp mit mehr Arbeitsspeicher.

Beenden von YARN-Containern auf Worker-Knoten

  • Dataproc schreibt die folgende Meldung in den YARN-Ressourcenmanager: container id exited with code EXIT_CODE. Wenn Sie diese Meldungen aufrufen möchten, aktivieren Sie das Logging und verwenden Sie dann den folgenden Logfilter:

    resource.type="cloud_dataproc_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.cluster_uuid="CLUSTER_UUID"
    jsonPayload.message:"container" AND "exited with code" AND "which potentially signifies memory pressure on NODE
    
  • Wenn ein Container mit code INT beendet wurde, prüfen Sie das google.dataproc.oom-killer-Log oder dataproc.googleapis.com/node/problem_count, um zu bestätigen, dass der Job durch Dataproc Memory Protection beendet wurde (siehe Prozessbeendigungen).

    Lösungen:

    • Prüfen Sie, ob die Containergrößen richtig konfiguriert sind.
    • Sie sollten yarn.nodemanager.resource.memory-mb verringern. Mit dieser Eigenschaft wird die Speichermenge gesteuert, die für die Planung von YARN-Containern verwendet wird.
    • Wenn Jobcontainer immer wieder fehlschlagen, prüfen Sie, ob die Datenverteilung eine erhöhte Nutzung bestimmter Container verursacht. Wenn ja, partitionieren Sie den Job neu oder erhöhen Sie die Worker-Größe, um den zusätzlichen Arbeitsspeicheranforderungen gerecht zu werden.

Linux-Speicherschutz auf dem Masterknoten optimieren (erweitert)

Dataproc-Masterknoten verwenden das earlyoom-Dienstprogramm, um Systemabstürze zu verhindern, indem sie Arbeitsspeicher freigeben, wenn der verfügbare Arbeitsspeicher kritisch niedrig ist. Die Standardkonfiguration eignet sich für viele Arbeitslasten. Möglicherweise müssen Sie die Konfiguration jedoch anpassen, wenn Ihr Masterknoten über viel Arbeitsspeicher verfügt und der Arbeitsspeicher schnell aufgebraucht wird.

In Szenarien mit hohem Arbeitsspeicherbedarf kann das System in einen Zustand des „Thrashing“ eintreten, in dem es die meiste Zeit mit der Arbeitsspeicherverwaltung verbringt und nicht mehr reagiert. Dies kann so schnell geschehen, dass earlyoom nicht auf Grundlage der Standardeinstellungen reagiert oder nicht reagiert, bevor die OOM-Reaktion des Kernels aufgerufen wird.

Hinweise

  • Dies ist eine erweiterte Abstimmungsoption. Bevor Sie die earlyoom-Einstellungen anpassen, sollten Sie andere Lösungen in Betracht ziehen, z. B. die Verwendung einer Master-VM mit mehr Arbeitsspeicher, die Reduzierung der Job-Concurrency oder die Optimierung der Job-Arbeitsspeichernutzung.

earlyoom-Einstellungen anpassen

Die Standardkonfiguration von earlyoom verwendet einen festen Betrag an freiem Arbeitsspeicher als Trigger. Auf virtuellen Maschinen mit viel RAM, z. B. 32GB oder mehr, kann dieser feste Betrag einen kleinen Bruchteil des Gesamtspeichers darstellen. Dadurch ist das System anfällig für plötzliche Spitzen bei der Arbeitsspeichernutzung.

Wenn Sie die earlyoom-Einstellungen anpassen möchten, stellen Sie eine Verbindung zum Masterknoten her und ändern Sie die Konfigurationsdatei.

  1. Stellen Sie eine SSH-Verbindung zu Ihrem Masterknoten her.

  2. Öffnen Sie die Konfigurationsdatei zur Bearbeitung:

    sudo nano /etc/default/earlyoom
    
  3. Mindestspeichergrenzwert anpassen Suchen Sie die Zeile EARLYOOM_ARGS. Mit der Option -M <kbytes> wird die Mindestmenge an freiem Arbeitsspeicher in KiB festgelegt, die earlyoom beibehalten soll. Der Standardwert ist -M 65536, was 64 MiB entspricht.

    Erhöhen Sie diesen Wert für einen Masterknoten mit viel Arbeitsspeicher. Wenn Sie den Grenzwert beispielsweise auf 1 GiB (1048576 KiB) festlegen möchten, ändern Sie die Zeile so:

    EARLYOOM_ARGS="-r 15 -M 1048576 -s 1"
    

    Hinweise:

    • -r: Intervall für Speicherberichte in Sekunden
    • -s: Der Schwellenwert für den Auslagerungsspeicher, der earlyoom auslöst.
  4. Starten Sie den Dienst earlyoom neu, um die Änderungen zu übernehmen:

    sudo systemctl restart earlyoom