Wie gehe ich mit Problemen mit wenig freiem Speicher oder hoher Swap-Nutzung in meiner Instance für Amazon RDS for Oracle Database um?

Letzte Aktualisierung: 30.09.2021

Ich möchte Probleme mit geringem freiem Speicher oder hoher Swap-Nutzung in meiner Amazon Relational Database Service (Amazon RDS) für Oracle DB-Instance lösen.

Kurzbeschreibung

In Oracle-Datenbanken wird der verfügbare Speicher hauptsächlich von Program Global Area (PGA) und System Global Area (SGA) verwendet. Stellen Sie bei der Konfiguration einer Oracle-DB-Instance sicher, dass die Summe dieser beiden Komponenten geringer ist als der gesamte physische Speicher, um freien Speicher für andere Hostprozesse und Funktionalitäten verfügbar zu machen. Sie müssen die Speicherparameter anpassen, um eine hohe Swap-Auslastung und die Verwendung großer Mengen physikalischen Speichers zu vermeiden. Weitere Informationen zur Swap-Nutzung und zu den empfohlenen Grenzwerten finden Sie unter Warum verwendet meine Amazon-RDS-DB-Instance Swap-Speicher, wenn ich über ausreichend Speicher verfügt?

Wenn Ihre DB-Instance automatische Speicherverwaltung verwendet, wird die Gesamtmenge des von den Oracle-Datenbanken verwendeten Speichers von den Parametern MEMORY_TARGET und MEMORY_MAX_TARGET verwaltet. Der in MEMORY_TARGET festgelegte Wert entspricht der Summe aus SGA und PGA. Der von SGA verwendete Speicher wird durch die Parameter SGA_MAX_SIZE und SGA_TARGET bestimmt. Der von PGA verwendete Speicher wird von den Parametern PGA_AGGREGATE_TARGET und PGA_AGGREGATE_LIMIT verwaltet. Die Standardwerte für diese Parameter sind aus Leistungsgründen hoch eingestellt. In bestimmten Anwendungsfällen können diese hohen Werte jedoch zu Speicherkonflikten und hoher Swap-Auslastung führen.

Auflösung

Verwenden Sie eine der folgenden Methoden, die auf dem Speicherverwaltungsmodus Ihrer Instance basieren, um dieses Problem zu beheben.

  • Wenn Ihre DB-Instance automatische Speicherverwaltung verwendet, verringern Sie den Wert von MEMORY_TARGET.
  • Wenn Ihre DB-Instance die automatische Shared Memory-Verwaltung verwendet, verringern Sie die Werte der PGA- und SGA-Parameter in Ihrer Instance.

Hinweis: Obwohl es sich bei diesen Parametern um dynamische Parameter handelt, müssen Sie Ihre Instance ohne Failover neu starten, damit diese Parameter geändert werden können. Weitere Informationen finden Sie im Hinweis in Enabling HugePages für eine Oracle DB-Instance.

Versuchen Sie die folgenden Schritte zur Fehlerbehebung:

1.    Prüfen Sie, ob Ihre DB-Instance automatische Speicherverwaltung oder automatische Shared Memory-Verwaltung verwendet. Sie können dies tun, indem Sie die Parameter SGA, PGA und MEMORY_TARGET überprüfen:

SQL> SHOW PARAMETER SGA;

SQL> SHOW PARAMETER PGA;

SQL> SHOW PARAMETER MEMORY_TARGET;
  • Wenn MEMORY_TARGET gesetzt ist, verwendet die Instance eine automatische Speicherverwaltung.
  • Wenn MEMORY_TARGET nicht gesetzt, aber SGA_TARGET und PGA_AGGREGATE_TARGET gesetzt sind, verwendet die Instance die automatische Shared Memory-Management.

Weitere Informationen zu verschiedenen Speicherverwaltungsmodi finden Sie in der Oracle-Dokumentation für Informationen zur Speicherverwaltung.

2.    Führen Sie die folgenden Abfragen aus, um die Speicherbelegung durch PGA bzw. SGA anzuzeigen:

SQL> SELECT (value/1024/1024) CURRENT_PGA_IN_USE_IN_MB FROM V$PGASTAT WHERE NAME ='total PGA inuse';

SQL> SELECT SUM (bytes/1024/1024) CURRENT_SGA_SIZE_IN_MB FROM V$SGASTAT;

Führen Sie die folgenden Abfragen aus, um den maximalen Speicher anzuzeigen, der nach dem letzten Neustart für PGA bzw. SGA zugewiesen wurde:

SQL> SELECT (value/1024/1024) MAX_PGA_ALLOCATED_IN_MB FROM V$PGASTAT WHERE NAME = 'maximum PGA allocated';

SQL> SELECT SUM (bytes/1024/1024) MAX_SGA_SIZE_IN_MB FROM V$SGAINFO WHERE NAME='Maximum SGA Size';

Führen Sie die folgenden Abfragen aus, um die Advisory-Ansichten für PGA bzw. SGA anzuzeigen:

SQL> SELECT PGA_TARGET_FOR_ESTIMATE,
PGA_TARGET_FACTOR, ADVICE_STATUS, ESTD_TIME, ESTD_PGA_CACHE_HIT_PERCENTAGE FROM
V$PGA_TARGET_ADVICE ORDER BY PGA_TARGET_FACTOR;

SQL> SELECT SGA_SIZE,
SGA_SIZE_FACTOR, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS FROM
V$SGA_TARGET_ADVICE ORDER BY SGA_SIZE ASC;

3.    Definieren Sie geeignete Einstellungen für Speicherparameter, um einen übermäßigen Speicherverbrauch und eine hohe Swap-Auslastung zu vermeiden. Diese Einstellungen können Ihnen auch dabei helfen, die Datenbank für eine bessere Leistung zu optimieren. Sie können jeden der Parameter in diesen Beispielen mithilfe der Instance-Parametergruppe ändern.

Wenn Ihre Instance automatische Speicherverwaltung verwendet, wird nur der Parameter MEMORY_TARGET festgelegt. Dieser Parameter ist standardmäßig auf den folgenden Wert eingestellt:

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/4}

Wenn Ihre Instance die automatische Shared Memory-Verwaltung verwendet, werden die Parameter PGA_AGGREGATE_TARGET und SGA_TARGET auf die folgenden Standardwerte gesetzt:

PGA_AGGREGATE_TARGET= {DBInstanceClassMemory*1/8}

SGA_TARGET= SGA_MAX_SIZE = {DBInstanceClassMemory*3/4}

Wenn die Speicherbelegung mit diesen Standardeinstellungen hoch ist, können Sie die Standardeinstellungen anpassen, um den von der Oracle-Instance verwendeten Speicher zu begrenzen. Sie können die vorhergehenden Speicheranzeigeansichten zum Anpassen von Speicherparametern verwenden. Es ist eine bewährte Methode, die Speicherparameter in einer Testumgebung zu optimieren, bevor die Änderungen auf Produktionsdatenbanken angewendet werden.

Beispiel:

Wenn Ihre Instance eine automatische Speicherverwaltung ist, reduzieren Sie nur die Werte MEMORY_TARGET und MEMORY_MAX_TARGET:

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*1/2}

-oder-

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/5}

-oder-

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*2/3}

Wenn Ihre Instance die automatische Shared Memory-Verwaltung verwendet, reduzieren Sie nur die Speicherparameter von SGA und/oder PGA basierend auf den im vorherigen Schritt gezeigten Advisory-Werten. Beispiel:

SGA_TARGET = {DBInstanceClassMemory*1/2}

-oder-

SGA_TARGET = {DBInstanceClassMemory*2/3}

Sie können auch die Speicherbelegung des Programmspeicherbereichs optimieren, indem Sie den folgenden Wert für PGA_AGGREGATE_TARGET festlegen:

PGA_AGGREGATE_TARGET = {DBInstanceClassMemory*1/12}

4.    In bestimmten Anwendungsfällen kann die Speicherbelegung durch die PGA den Wert PGA_AGGREGATE_TARGET überschreiten und den Wert erreichen, der im Parameter PGA_AGGREGATE_LIMIT festgelegt ist. Der Standardwert von PGA_AGGREGATE_LIMIT hängt von der Speicherkonfiguration der Datenbank-Instance ab. Weitere Informationen finden Sie in der Oracle-Dokumentation für PGA_AGGREGATE_LIMIT. Wenn der Standardwert von PGA_AGGREGATE_LIMIT sehr hoch ist, verfügt die RDS-Instance möglicherweise über einen sehr niedrigen oder keinen physischen Speicher für den zugrunde liegenden Host, was zu hoher Swap-Auslastung und Speicherkonflikten führt.

Um diese Anwendungsfälle zu beheben, ermitteln Sie, welche Prozesse oder Abfragen eine hohe Menge an PGA verwenden. Führen Sie die folgende Abfrage aus, um die Zuweisung des Programmbereichs pro Prozess anzuzeigen:

SQL> SELECT spid, program, round(pga_max_mem/1024/1024) max_MB, round(pga_alloc_mem/1024/1024)alloc_MB, round(pga_used_mem/1024/1024) used_MB, round(pga_freeable_mem/1024/1024) free_MB FROM V$PROCESS ORDER BY 3;

Führen Sie die folgende Abfrage aus, um die Speicherbelegung durch PGA für Benutzersitzungen anzuzeigen, ohne Hintergrundprozesse:

SQL> SELECT sum(p.pga_max_mem)/1024/1024 "PGA MAX MEMORY OF USER SESSION (MB)" FROM v$process p, v$session s WHERE P.ADDR = S.paddr and s.username IS NOT NULL;

Führen Sie die folgende Abfrage aus, um die Speicherbelegung durch PGA pro Sitzung und die Abfragen anzuzeigen, die von jeder Sitzung ausgeführt werden:

SQL> SELECT s.username, p.pga_max_mem/1024/1024 "PGA MEMORY OF USER SESSION (MB)", q.sql_text FROM v$process p, v$session s, v$SQL q WHERE P.ADDR = S.paddr AND s.username IS NOT NULL AND s.sql_id = q.sql_id ORDER BY 2;

Verwenden Sie eine oder mehrere der folgenden Methoden, um die hohe Speicherauslastung durch PGA zu reduzieren:

  • Beschränken Sie den Wert von PGA_AGGREGATE_LIMIT. Dies könnte verhindern, dass der Instance der Speicher ausgeht. Es kann jedoch zu Verbindungsfehlern führen, wenn zusätzlicher PGA-Speicher für einen Prozess benötigt wird.
  • Reduzieren Sie den SGA_TARGET-Wert entsprechend. Dadurch kann PGA_AGGREGATE_TARGET auf den Wert von PGA_AGGEGATE_LIMIT steigen, ohne Probleme mit Speicherkonflikten zu verursachen.
  • Erhöhen Sie die Größe der Instance-Klasse auf eine größere Instance-Größe mit mehr Speicher.

5.    Überwachen Sie nach dem Optimieren der Speicherparameter, wie in den vorangegangenen Schritten erwähnt, die Datenbankleistung und konsultieren Sie die Datenbank-Advisory-Ansichten. Wenn die Begrenzung der Speicherparameter zu einer Leistungsverschlechterung führt, versuchen Sie, die Instance-Größe zu erhöhen. Dies ermöglicht eine höhere Speichernutzung für die Datenbank-Instance, um effizient zu arbeiten. Sie können das Performance Insights-Dashboard verwenden, um die Datenbank-Workload zu analysieren und die Abfragen mit der höchsten Speicherauslastung zu identifizieren. Dann können Sie diese Abfragen mit der höchsten Speicherbelegung optimieren, um weniger Speicher zu verbrauchen.


Oracle-Dokumentation für Memory-Architektur

War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?