Linux

當 sga 和 pga 達到限制時會發生什麼?

  • December 25, 2018

我有以下疑問,我有一個帶有 Oracle 9i 的伺服器和另一個帶有 Oracle 12c 的伺服器,在這兩種情況下,我都懷疑當 Oracle 達到定義的記憶體參數(SGA 和 PGA)所施加的限制時會發生這種情況?… 假設範例:我有一個具有 32GB RAM 的伺服器,其中我只執行了一個分配了以下參數的 oracle 12c 實例:

sga_max_size = 19327352832
sga_target = 19327352832
pga_aggregate_target = 10737418240 
pga_aggregate_limit = 12884901888

如果達到這些參數的極限會發生什麼?,作業系統(RedHat)會開始交換嗎?

**SGA:**沒什麼大不了的,它是一個固定大小的記憶體區域,一旦滿了,數據庫就會重用很少使用 LRU(最近最少使用)算法訪問的記憶體

記憶體架構

**PGA:**一旦PGA_AGGREGATE_LIMIT達到,數據庫將中止對具有最不可調(如 PL/SQL 集合)PGA 記憶體的會話的呼叫,並且這些會話會收到ORA-04036錯誤。如果這沒有幫助並且 PGA 使用量仍然高於限制,那麼數據庫甚至可能會終止這些會話:

PGA_AGGREGATE_LIMIT

超過 PGA_AGGREGATE_LIMIT 時採取的措施

並行查詢將被視為一個單元。首先,使用最不可調記憶體的會話將中止其呼叫。然後,如果總 PGA 記憶體使用量仍然超過限制,則使用最不可調記憶體的會話將被終止。

SYS 程序和除作業隊列程序之外的後台程序將不受本節中描述的任何操作的影響。相反,如果他們使用最不可調的記憶體,他們會定期將其 PGA 使用情況的簡短摘要寫入跟踪文件。

(19327352832 + 12884901888)/1024/1024/1024 = 30

您的伺服器中有 32 GB 記憶體,您已為數據庫分配了 30 GB 記憶體,正如您所說,它上面沒有執行其他任何東西。通過正確的配置和大小調整,在正常情況下您應該看不到交換:

  • hugepages用於減少頁表
  • filesystemio_options=setall用於直接 I/O 並避免文件系統記憶體
  • vm.swappiness設置為 10 甚至更低
  • 調整大小:合理數量的數據庫會話/程序

這並不意味著系統永遠不會交換。例如:

  • SYS 會話和後台程序不受PGA_AGGREGATE_LIMIT. 您仍然可以讓流氓程序消耗超過限制的 PGA 記憶體,從而導致交換。
  • 如果您使用大小不合理的連接池,例如 100 甚至 1000 多個數據庫程序,則這些程序有一些不屬於 PGA 的私有記憶體,因此它們加起來超出了 SGA + PGA 限制。這在 AIX 上尤其重要,幸運的是在 Linux 上沒有那麼重要。

引用自:https://dba.stackexchange.com/questions/225743