Oracle Memory Structure 1. Overview And Management

tthero00boo發表於2013-11-12

參考了很多文章,做個簡單總結自用,第一篇

Oracle Memory Structure:

(System/Shared Global Area)SGA ; (Program/Process Global Area)PGA

SGA: Allocated at instance startup, and is a fundamental component of an Oracle Instance
PGA: Allocated when the server process or background process is created


 SGA consists of several memory structures:
  Shared pool (Library cache, Row cache)
  Database buffer cache
  Redo log buffer
  Large pool
  Java pool
  (Stream,flashback...)

 PGA is a memory region that contains data
    and control information for a single server process or a single background process.
  
  1. private SQL area 私有SQL區域(分為固定區域和Run-time執行時區域,共享伺服器模式時私有SQL區是在SGA中)
  2. Session Memory 會話空間(共享伺服器模式時,會話空間是共享的)
  3. SQL Work Area
     |- Sort Area
     |- Hash Join Area
     |- Bitmap Merge Area  點陣圖合併連線
     \- Create Bitmap Area 建立點陣圖

  (複雜的SQL會用到SQL Work Area,SQL工作區對系統的效能影響很大)


記憶體管理:

 9i引入自動PGA記憶體管理
 10g   自動SGA記憶體管理 ASMM (Automatic Shared Memory Management)
 11g   自動記憶體管理    AMM  (Automatic Memory Management)


/* PGA */

PGA的管理模式與設定
  1、PGA分兩種管理模式:
        手動PGA記憶體管理:使用者指定排序區和雜湊區所使用的記憶體,每個連線使用相同的記憶體。
        自動PGA記憶體管理:告訴Oracle可以使用的PGA的總量,由Oraclce根據系統負載決定具體分配。即PGA記憶體可以動態擴大和回收

        9iR1時預設為手動PGA記憶體管理,9iR2以後預設為自動PGA記憶體管理。

  2、設定(引數workarea_size_policy)
        設為MANUAL,使用手動管理方式。
      設為AUTO,並且pga_aggregate_target不為0時,啟用自動記憶體管理。

值得注意的: 引數pga_aggregate_target決定的是 所有伺服器程式分配的PGA總和,被稱為PGA合計(Aggregated PGA)

Oracle管理的原則是分配每個會話的PGA=min{(pga_aggregate_target * 5%),_pga_max_size} (並行操作是30%)
如果SQL執行過程中,出現了PGA排序區不足,那麼系統會進行硬碟排序,而不會從PGA再分配空間


/* SGA */

ASMM只能自動調整5個記憶體池的大小:shared pool、buffer cache、large pool、java pool和stream pool。
不再需要設定shared_pool_size、db_cache_size、large,java,streams_pool_size這五個初始化引數。
如果你依舊設了,那麼這會被當成自動調整相關元件的最小限制(與自動管理PGA不同,PGA的*_area_size全部忽略)
而其他的記憶體池,比如log buffer、keep buffer cache等仍然需要DBA手工進行調整。

設定:

 相關引數: SGA_TARGET,SGA_MAX_SIZE,statistics_level

 sga_target不為0,來啟動ASMM,該引數定義了整個SGA的總容量。
 同時,初始化引數statistics_level必須設定為typical或all才能啟動ASMM,
 否則如果設定為basic,則關閉ASMM。

 因為MMON將無法有效分析記憶體的使用的統計資訊從而驅動ASMM的自動調優,實際上我們不能同時設定
sga_target為非零值和statistics_level為BASIC.(MMON -請求-> MMAN -修改-> SGA)
 
 如果使用了server parameter file即spfile的話,ASMM會在例項shutdown之前將當前實際的記憶體元件大小
(Oracle認為這是最優的,但實際上可能不是)儲存到spfile中,如果你使用strings檢視,他們都是以雙下劃線開頭的引數
 
 [oracle@localhost ~]$ strings /opt/oracle/112/dbs/spfilemyorcl11.ora
 myorcl11.__db_cache_size=171966464
 myorcl11.__java_pool_size=4194304
 myorcl11.__large_pool_size=4194304
 myorcl11.__oracle_base='/opt/oracle'#ORACLE_BASE set from environment
 myorcl11.__pga_aggregate_target=104857600
 myorcl11.__sga_target=436207616
 myorcl11.__shared_io_pool_size=0
 myorcl11.__shared_pool_size=243269632
 myorcl11.__streams_pool_size=4194304


/* AMM */

AMM自動記憶體管理使得,PGA和SGA記憶體之間可以互相轉換,根據當前的工作負載來自動設定PGA和SGA的大小。
這種間接的記憶體轉換依賴於作業系統的共享記憶體的釋放機制來獲得內部例項的調優.

MEMORY_TARGET--作業系統的角度上 Oracle 所能使用的最大記憶體值。動態引數
MEMORY_MAX_TARGET--MEMORY_TARGET所能設定的最大值。非動態可調。

設定:

 相關引數: memory_target,memory_max_target,lock_sga
 
 如果lock_sga = true ,則AMM是不可用的
 設定memory_target不為0,則開啟AMM
 同樣的,如果sga_target,或pga_aggregate_targe設定了非0值,作為動態調整的最小值


如果設定MEMORY_TARGET不當,可能會出現ORA-00845: MEMORY_TARGET not supported on this system

 這個問題是MEMORY_TARGET的設定超出了作業系統/dev/shm大小導致的。
 Oracle中的AMM特性使用了/dev/shm (...詳見後面)

 解決這個問題有3個方法,
 1. 修改初始化引數,使得初始化引數中 MEMORY_TARGET 的設定小於/dev/shm的大小, --這其實不是個辦法...
 2. 調整/dev/shm的大小
 3. you can configure ASMM instead of AMM, i.e. set SGA_TARGET, SGA_MAX_SIZE and PGA_AGGREGATE_TARGET instead of
MEMORY_TARGET.

調整/dev/shm的大小
 1. 檢視當前/dev/shm
  [oracle@localhost ~]$ df -h
  Filesystem            Size  Used Avail Use% Mounted on
  
  tmpfs                 504M  404M  100M  81% /dev/shm

 2. 修改/etc/fstab
  #tmpfs                   /dev/shm                tmpfs   defaults        0 0
   tmpfs                   /dev/shm                tmpfs   defaults,size=640M        0 0
 
 3. 重新掛載
  $ umount /dev/shm
  $ mount /dev/shm
  $ df -h /dev/shm
  Filesystem            Size  Used Avail Use% Mounted on
  tmpfs                 640M  416M  225M  65% /dev/shm
 
/* 配置原則 */
 一般的,可以考慮分配80%的可用記憶體給Oracle例項

 OLTP系統中,典型PGA記憶體設定應該是總記憶體的較小部分(例如20%),剩下80%分配給SGA。
  OLTP:      SGA_TARGET = (total_mem * 80%) * 80%
    PGA_AGGREGATE_TARGET = (total_mem * 80%) * 20% 
 DSS系統中,由於會執行一些很大的查詢,典型的PGA記憶體最多分配70%的記憶體。
  OLAP,DSS:  SGA_TARGET = (total_mem * 80%) * 50%
    PGA_AGGREGATE_TARGET = (total_mem * 80%) * 50% ~70% 

 小原則:對於主機實體記憶體小於1G的,並且部署的資料庫型別是專有伺服器模式 Dedicated
   通常Oracle的SGA記憶體分配不要超過總記憶體的一半,否則很有可能因為記憶體緊張導致Oracle執行過程中出現瓶頸


/* _target 和 _max_target*/
 MEMORY_TARGET , MEMORY_MAX_TARGET
 SGA_TARGET , SGA_MAX_TARGET
 _target代表你要求的設定值,並且可隨時修改不需重啟例項,Oracle會自動調整它下面各元件的大小
 _max_target代表的是一些硬體的限制,控制能接受動態調整_target的最大值

/* Dynamic Performance V$ Views */
 
 AMM:
 
  V$MEMORY_DYNAMIC_COMPONENTS:描述當前所有記憶體元件的狀態
        V$MEMORY_RESIZE_OPS:迴圈記錄最後800次的SGA大小調整請求
        X$KMGSTFR:迴圈記錄最後800次的SGA的轉換地址
        _MEMORY_MANAGEMENT_TRACING=23:對於所有的記憶體轉換調整行為均記錄儲存為跟蹤檔案
 
 SGA:
  v$sgastat
  v$sgainfo
  V$SGA
  V$SGA_DYNAMIC_COMPONENTS
  V$SGA_DYNAMIC_FREE_MEMORY
  V$SGA_RESIZE_OPS
  V$SGA_CURRENT_RESIZE_OPS
  V$SGA_TARGET_ADVICE

 PGA:
  v$pgastat
  v$pga_target_advice
  V$PROCESS
  v$sql_workarea
  v$sql_workarea_active


/* tmpfs */

 /dev/shm/是一個裝置檔案,它使用就是tmpfs檔案系統
 (注意:在Centos和Redhat下,/dev/shm目錄是一個連結,指向/run/shm目錄,在Ubuntu系統下tmpfs檔案系統對應的是/run/shm目錄,可以使用df命令檢視)
 在Redhat/CentOS等linux發行版中預設大小為實體記憶體的一半。

 tmpfs是一種基於記憶體的檔案系統,建立時不需要使用mkfs等初始化。
 它的儲存空間在VM裡面,VM(virtual memory)是由RM(Real Memory)和swap組成
 RM的大小就是實體記憶體的大小,
 而Swap的大小是由你自己決定的。Swap是通過硬碟虛擬出來的記憶體空間,因此它的讀寫速度相對RM要慢許多

 我們為什麼需要Swap呢?當一個程式申請一定數量的記憶體時,如核心的vm子系統發現沒有足夠的RM時,
 就會把RM裡面的一些不常用的資料交換到Swap裡面,如果需要重新使用這些資料再把它們從Swap交換到RM裡面。
 如果你有足夠大的實體記憶體,根本不需要劃分Swap分割槽。

 tmpfs使用的儲存空間VM,因此tmpfs最大的儲存空間可達(The size of RM + The size of Swap).
 但是對於tmpfs本身而言,它並不知道自己使用的空間是RM還是Swap,這一切都是由核心的vm子系統管理的。

 預設情況下,tmpfs會mount到/dev/shm目錄。使用tmpfs,就是說你可以使用這個目錄,這個目錄就是tmpfs,如你寫臨時檔案到此目錄,這些檔案實際上是在VM中
 為防止tmpfs使用了全部VM,有時候要限制其大小。

 tmpfs優點:
  1. 基於記憶體的,速度快. 應用場合:oracle AMM ; 做web快取,對web訪問有很好的加速作用
  2. 動態檔案系統大小 (應用:oracle AMM )
     tmpfs最初會只有很小的空間,但隨著檔案的複製和建立,tmpfs檔案系統驅動程式會分配更多的 VM,
     並按照需求動態地增加檔案系統的空間。
     而且,當 /mnt/tmpfs 中的檔案被刪除時,tmpfs 檔案系統驅動程式會動態地減小檔案系統並釋放 VM 資源,
     這樣做可以將 VM 返回到迴圈當中以供系統中其它部分按需要使用。
     因為 VM 是寶貴的資源,所以您一定不希望任何東西浪費超出它實際所需的 VM,tmpfs 的好處之一就在於這些都是自動處理的。
   
 缺點: 由於它的資料是在VM裡面,因此斷電或者你解除安裝它之後,資料就會立即丟失,這也許就是它叫tmpfs的原故
 
 使用:
 #mount -t tmpfs -o size=20m tmpfs /mnt/tmp
 分配了上限為20m的VM到/mnt/tmp目錄下

 重啟後仍生效:
 /etc/fstab 新增
 tmpfs                   /dev/shm                tmpfs   defaults,size=640M        0 0

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28859270/viewspace-776429/,如需轉載,請註明出處,否則將追究法律責任。

相關文章