如何處理 Amazon RDS for Oracle Database 執行個體的低可用記憶體或高交換使用率問題?

上次更新日期︰2021 年 9 月 30 日

我想要處理 Amazon Relational Database Service (Amazon RDS) for Oracle 資料庫執行個體中的低可用記憶體或高交換使用率問題。

簡短描述

在 Oracle 資料庫中,可用記憶體主要由程式全域區域 (PGA) 和系統全域區域 (SGA) 使用。在您設定 Oracle 資料庫執行個體時,請確定這兩個元件的總和小於實體記憶體總計,以便可用記憶體供其他主機處理程序和功能使用。您必須調整記憶體參數,以避免高交換使用率和大量實體記憶體使用率。如需有關交換使用率和建議限制的詳細資訊,請參閱為什麼 Amazon RDS 資料庫執行個體在我有足夠的記憶體時使用交換記憶體?

如果您的資料庫執行個體使用自動記憶體管理,則 Oracle 資料庫使用的記憶體總量由參數 MEMORY_TARGETMEMORY_MAX_TARGET 管理。MEMORY_TARGET 中設定的值等於 SGA 與 PGA 的總和。SGA 使用的記憶體由參數 SGA_MAX_SIZESGA_TARGET 確定。 PGA 使用的記憶體由參數PGA_AGGREGATE_TARGETPGA_AGGREGATE_LIMIT 管理。出於效能原因,這些參數的預設值設定為高。不過,在某些使用案例中,這些高值可能會導致記憶體爭用和高交換使用率。

解決方案

如果要對該問題進行疑難排解,請根據執行個體的記憶體管理模式使用下列方法之一。

  • 如果您的資料庫執行個體使用自動記憶體管理,則降低 MEMORY_TARGET 的值。
  • 如果您的資料庫執行個體使用自動共享記憶體管理,則降低執行個體中 PGA 和 SGA 參數的值。

注意:雖然這些參數是動態參數,但您必須在不進行容錯移轉的情況下重新啟動執行處理,才能修改這些參數。如需詳細資訊,請參閱為 針對 Oracle 資料庫執行個體啟用 HugePages 中的附註

請嘗試下列疑難排解步驟:

1.    檢查資料庫執行個體是否使用自動記憶體管理或自動共享記憶體管理。您可以透過檢查參數 SGA、PGA 和 MEMORY_TARGET 來執行這項操作:

SQL> SHOW PARAMETER SGA;

SQL> SHOW PARAMETER PGA;

SQL> SHOW PARAMETER MEMORY_TARGET;
  • 如果已設定 MEMORY_TARGET,則執行個體會使用自動記憶體管理。
  • 如果未設定 MEMORY_TARGET,但設定了 SGA_TARGET 和 PGA_AGGREGATE_TARGET,則執行處理會使用自動共享記憶體管理。

如需不同記憶體管理模式的詳細資訊,請參閱關於記憶體管理的 Oracle 文件。

2.    執行下列查詢,分別檢視 PGA 和 SGA 的記憶體使用率:

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;

執行下列查詢,分別檢視上次重新啟動後分別為 PGA 和 SGA 配置的記憶體上限:

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';

執行下列查詢,分別檢視 PGA 和 SGA 的建議檢視:

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.    針對記憶體參數定義適當的設定,以避免記憶體耗用過多和高交換使用率。這些設定還可以協助您調整資料庫以獲得更佳效能。您可以使用執行個體參數群組,變更這些範例中的任何參數。

如果您的執行個體使用自動記憶體管理,則只會設定 MEMORY_TARGET 參數。此參數預設會設定為下列值:

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/4}

如果您的執行處理使用自動共享記憶體管理,則會將參數 PGA_AGGREGATE_TARGET 和 SGA_TARGET 分別設定為下列預設值:

PGA_AGGREGATE_TARGET= {DBInstanceClassMemory*1/8}

SGA_TARGET= SGA_MAX_SIZE = {DBInstanceClassMemory*3/4}

如果這些預設設定的記憶體使用率較高,則可調整預設設定,以限制 Oracle 執行處理使用的記憶體。您可以使用前面的記憶體建議檢視來調整記憶體參數。最佳實務是先調整測試環境中的記憶體參數,再套用變更至生產資料庫。

例如:

如果您的執行個體使用自動記憶體管理,則只降低 MEMORY_TARGETMEMORY_MAX_TARGET 值:

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*1/2}

-或-

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/5}

-或-

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*2/3}

如果您的執行個體使用自動共享記憶體管理,則根據上述步驟中顯示的建議值,只降低 SGA 及/或 PGA 的記憶體參數。例如:

SGA_TARGET = {DBInstanceClassMemory*1/2}

-或-

SGA_TARGET = {DBInstanceClassMemory*2/3}

您還可以設定 PGA_AGGREGATE_TARGET 的下列值來調整程式記憶體區域的記憶體使用率:

PGA_AGGREGATE_TARGET = {DBInstanceClassMemory*1/12}

4.    在某些使用案例中,PGA 的記憶體使用率可能會超過 PGA_AGGREGATE_TARGET 值,並達到 PGA_AGGREGATE_LIMIT 參數中設定的值。PGA_AGGREGATE_LIMIT 的預設值取決於資料庫執行處理的記憶體組態。如需詳細資訊,請參閱 PGA_AGGREGATE_LIMIT 的 Oracle 文件。如果 PGA_AGGREGATE_LIMIT 的預設值非常高,則 RDS 執行個體的基礎主機的實體記憶體可能會非常低或沒有實體記憶體,導致高交換使用率和記憶體爭用問題。

若要對這些使用案例進行疑難排解,須找出哪些程序或查詢正在使用大量的 PGA。執行下列查詢,以檢視每個程序的程式區域配置:

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;

執行下列查詢,以檢視 PGA 使用者工作階段 (不包括後台程序) 的記憶體使用率:

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;

執行下列查詢,以檢視 PGA 每個工作階段的記憶體使用率和每個工作階段執行的查詢:

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;

若要降低 PGA 高記憶體使用率,請使用下列一種或多種方法:

  • 限制 PGA_AGGREGATE_LIMIT 的值。這可能會使執行個體無法用完記憶體。不過,當程序需要額外的 PGA 記憶體時,可能會導致連線失敗。
  • 適當地降低 SGA_TARGET 值。這可讓 PGA_AGGREGATE_TARGET 增加至 PGA_AGGEGATE_LIMIT 的值,而不會導致記憶體爭用問題。
  • 將執行個體類別大小增加至更大的執行個體大小,且具有更多記憶體。

5.    調整前面步驟中所述的記憶體參數之後,監控資料庫效能並查詢資料庫建議檢視。如果限制記憶體參數會導致效能降低,則嘗試增加執行個體大小。這可讓資料庫執行個體有效率地運作更大記憶體使用率。您可以使用績效詳情儀表板來分析資料庫工作負載,並識別記憶體使用率最高的查詢。然後,您可以調整這些查詢的最高記憶體使用率,以使用較少的記憶體。


Oracle 記憶體架構文件

此文章是否有幫助?


您是否需要帳單或技術支援?