Wie gehe ich mit Problemen mit wenig freiem Speicher oder hoher Swap-Nutzung in meiner Datenbank-Instance in Amazon RDS für Oracle um?
Ich möchte Probleme mit wenig freiem Speicher oder hoher Swap-Nutzung in meiner Datenbank (DB)-Instance in Amazon Relational Database Service (Amazon RDS) für Oracle beheben.
Kurzbeschreibung
In Oracle-Datenbanken wird der verfügbare Speicher hauptsächlich von Program Global Area (PGA) und System Global Area (SGA) verwendet. Wenn du eine Oracle-DB-Instance konfigurierst, stelle sicher, dass die Summe dieser beiden Komponenten geringer ist als der gesamte physische Speicher. Du musst die Speicherparameter optimieren, um eine hohe Swap-Nutzung und einen hohen Verbrauch des physischen Speichers zu vermeiden. Weitere Informationen zur Swap-Nutzung und den empfohlenen Grenzwerten findest du unter Warum verwendet meine Amazon-RDS-DB-Instance Swap-Speicher, obwohl ich über ausreichend Speicher verfüge?
Wenn die DB-Instance eine automatische Speicherverwaltung verwendet, wird die gesamte des von den Oracle-Datenbanken verwendeten Speichermenge durch die Parameter MEMORY_TARGET und MEMORY_MAX_TARGET verwaltet. Der in MEMORY_TARGET festgelegte Wert entspricht der Summe von 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 durch die Parameter 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 einer hohen Swap-Nutzung führen.
Lösung
Verwende je nach Speicherverwaltungsmodus der Instance eine der folgenden Methoden, um dieses Problem zu beheben.
- Wenn die DB-Instance die automatische Speicherverwaltung verwendet, verringere den Wert von MEMORY_TARGET.
- Wenn die DB-Instance die automatische Verwaltung des gemeinsam genutzten Speichers verwendet, verringere die Werte der PGA- und SGA-Parameter in der Instance.
Hinweis: Obwohl es sich bei diesen Parametern um dynamische Parameter handelt, musst du die Instance ohne Failover neu starten, damit diese Parameter geändert werden können. Weitere Informationen findest du im Hinweis unter HugePages für eine RDS-für-Oracle-Instance aktivieren.
Gehe wie folgt vor:
-
Stelle sicher, dass die DB-Instance die automatische Speicherverwaltung oder die automatische Verwaltung des gemeinsam genutzten Speichers verwendet. Führe den folgenden Befehl aus, um die Parameter SGA, PGA und MEMORY_TARGET zu überprüfen:
SQL> SHOW PARAMETER SGA; SQL> SHOW PARAMETER PGA; SQL> SHOW PARAMETER MEMORY_TARGET;Wenn MEMORY_TARGET gesetzt ist, verwendet die Instance die automatische Speicherverwaltung.
Wenn MEMORY_TARGET nicht gesetzt ist, aber SGA_TARGET und PGA_AGGREGATE_TARGET gesetzt sind, verwendet die Instance die automatische Verwaltung des gemeinsam genutzten Speichers.Weitere Informationen findest du unter Automatische Speichererweiterung aktivieren auf der Oracle-Website.
-
Führe den folgenden Befehl aus, um die Speichernutzung durch PGA und SGA anzuzeigen:
SQL> SELECT (value/1024/1024) CURRENT_PGA_ALLOCATED_IN_MB FROM V$PGASTAT WHERE NAME ='total PGA allocated';SQL> SELECT SUM (bytes/1024/1024) CURRENT_SGA_SIZE_IN_MB,con_id FROM V$SGASTAT group by con_id;Führe nach dem letzten Neustart den folgenden Befehl aus, um den maximalen Speicher anzuzeigen, der PGA und SGA zugewiesen ist:
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ühre den folgenden Befehl aus, um die Advisory Views für PGA und SGA anzuzeigen:
SQL> SELECT PGA_TARGET_FOR_ESTIMATE,PGA_TARGET_FACTOR, ADVICE_STATUS, ESTD_TIME, ESTD_PGA_CACHE_HIT_PERCENTAGE FROMV$PGA_TARGET_ADVICE ORDER BY PGA_TARGET_FACTOR; SQL> SELECT SGA_SIZE,SGA_SIZE_FACTOR, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS FROMV$SGA_TARGET_ADVICE ORDER BY SGA_SIZE ASC;Hinweis: In der CDB-Konfiguration zeigt der Befehl V$PGASTAT die PDB-spezifischen Informationen an, die du in der Abfrage verwendest.
-
Definiere Speicherparametereinstellungen, um übermäßigen Speicherverbrauch und eine hohe Swap-Nutzung zu vermeiden. Diese Einstellungen helfen dir, die Datenbank für eine bessere Leistung zu optimieren. Du kannst jeden der Parameter in diesen Beispielen mithilfe der Instance-Parametergruppe ändern.
Wenn die Instance die automatische Speicherverwaltung verwendet, wird nur der Parameter MEMORY_TARGET gesetzt. Standardmäßig ist dieser Parameter auf den folgenden Wert gesetzt:
MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/4}
Wenn die Instance die automatische Verwaltung des gemeinsam genutzten Speichers verwendet, sind die Parameter für 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 Speicherauslastung mit diesen Standardeinstellungen hoch ist, passe die Standardeinstellungen an, um den von der Oracle-Instance verwendeten Speicher zu begrenzen. Verwende die vorherigen Advisory Views für den Speicher zum Anpassen der Speicherparameter. Es hat sich bewährt, die Speicherparameter in einer Testumgebung zu optimieren, bevor die Änderungen auf Produktionsdatenbanken angewendet werden.
BeispielWenn die Instance die automatische Speicherverwaltung verwendet, reduziere 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}**Beispiel **Wenn die Instance die automatische Verwaltung des gemeinsam genutzten Speichers verwendet, reduziere nur die Speicherparameter von SGA und/oder PGA basierend auf den im vorherigen Schritt gezeigten Advisor-Werten:
SGA_TARGET = {DBInstanceClassMemory*1/2}
-oder-
SGA_TARGET = {DBInstanceClassMemory*2/3}Um die Speicherauslastung des Programmspeicherbereichs zu optimieren, lege den folgenden Wert für PGA_AGGREGATE_TARGET fest:
PGA_AGGREGATE_TARGET = {DBInstanceClassMemory*1/12} -
In bestimmten Anwendungsfällen kann die Speicherauslastung durch den PGA den Wert PGA_AGGREGATE_TARGET überschreiten und bis zu dem im Parameter PGA_AGGREGATE_LIMIT festgelegten Wert reichen. Der Standardwert von PGA_AGGREGATE_LIMIT hängt von der Speicherkonfiguration der Datenbank-Instance ab. Weitere Informationen findest du unter PGA_AGGREGATE_LIMIT auf der Oracle-Website.
Wenn der Standardwert von PGA_AGGREGATE_LIMIT sehr hoch ist, hat die RDS-Instance möglicherweise einen sehr niedrigen oder keinen physischen Speicher für den zugrunde liegenden Host. Dies führt zu einer hohen Swap-Nutzung und zu Speicherkonflikten.
Um diese Anwendungsfälle zu beheben, ermittle, welche Prozesse oder Abfragen viel PGA verwenden. Führe den folgenden Befehl 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,con_id FROM V$PROCESS ORDER BY 4;Führe den folgenden Befehl aus, um die Speicherbelegung durch PGA für Benutzersitzungen mit Ausnahme von Hintergrundprozessen anzuzeigen:
SQL> SELECT sum(p.pga_alloc_mem)/1024/1024 "PGA Allocated MEMORY OF USER SESSION (MB)",p.con_id FROM v$process p, v$session s WHERE P.ADDR = S.paddr and p.background IS NULL group by p.con_id;Führe den folgenden Befehl aus, um die Speichernutzung durch PGA pro Sitzung und die Abfragen anzuzeigen, die von jeder Sitzung ausgeführt werden:
SQL> SELECT s.username, p.pga_alloc_mem/1024/1024 "PGA Allocated MEMORY OF USER SESSION (MB)", q.sql_text,p.con_id FROM v$process p, v$session s, v$SQL q WHERE P.ADDR = S.paddr AND p.background IS NULL AND s.sql_id = q.sql_id ORDER BY 2;Hinweis: Überprüfe in der CDB-Konfiguration anhand der Spalte con_id, welche Container-Ressourcen verwendet werden. In einer Nicht-CDB-Konfiguration ist die Spalte con_id immer 0.
Verwende eine oder mehrere der folgenden Methoden, um den hohen Speicherverbrauch durch PGA zu reduzieren:
Begrenze den Wert von PGA_AGGREGATE_LIMIT. Dies könnte verhindern, dass der Instance der Arbeitsspeicher ausgeht. Dies kann jedoch zu Verbindungsfehlern führen, wenn zusätzlicher PGA-Speicher für einen Prozess benötigt wird.
Reduziere den Wert SGA_TARGET. Dadurch kann PGA_AGGREGATE_TARGET auf den Wert von PGA_AGGEGATE_LIMIT angehoben werden, ohne dass es zu Speicherkonflikten kommt.
Erhöhe die Instance-Klassengröße auf eine größere Instance-Größe mit mehr Arbeitsspeicher. -
Nachdem du die Speicherparameter, wie in den vorherigen Schritten beschrieben, optimiert hast, überwache die Datenbankleistung und konsultiere die Advisory Views der Datenbank.
Wenn Beschränkungen der Speicherparameter zu Leistungseinbußen führen, versuche, die Instance zu vergrößern. Dies ermöglicht eine höhere Speicherauslastung für die Datenbank-Instance, um effizient arbeiten zu können.
Verwende das Performance-Insights-Dashboard, um die Datenbank-Workload zu analysieren und die Abfragen mit der höchsten Speicherauslastung zu identifizieren. Optimiere dann diese Abfragen mit der höchsten Speicherauslastung, um weniger Speicher zu verwenden.
Ähnliche Informationen
Memory architecture (Speicherarchitektur) auf der Oracle-Website.
- Sprache
- Deutsch
Ähnliche Videos


Relevanter Inhalt
AWS OFFICIALAktualisiert vor einem Jahr