1. Vad är SGA?
SGA (System Global Area) är en minnesarea där som de olika serverprocesserna och bakgrundsprocesserna delar på. Om man uppdaterar data i SGA blir detta synligt för samtliga processer på systemet (även processer som inte är Oracles). Om du på Linux vill se ditt SGA skriver du bara:
[olle@dev1]$ pcs -m | grep ora
0xbe3bb918 491531 oracle 640 289406976 24
|
Mitt SGA är 289406976 bytes ( 289406976 / (1024*1024) = 276 MB). Jag verifierar denna storlek med min parameter SGA_TARGET, som representerar den av mig önskade storleken på SGA:
SQL> SHOW PARAMETERS SGA
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 272M
sga_target big integer 272M
|
Det verkar som att den verkliga storleken på SGA ligger 4 MB över den önskade storleken.
- Windows: I Windows sköts Oracle av en enda process "oracle.exe" och SGA är inte synlig utanför denna process. Vill du se den faktiska storleken på SGA får du använda dig av Oracles interna vyer (V$-vyerna).
2. MSMM
MSMM (Manual SGA Memory Management) var den enda metoden för minneshantering innan Oracle 10g. MSMM innebär att varje minnesarea i SGA manuellt måste konfigureras till en passande storlek. Följande parameter måste alltid sättas:
- SGA_MAX_SIZE: Bestämmer maximala storleken på SGA. Summan av de olika minnesareorna får inte överskrida SGA_MAX_SIZE. SGA_MAX_SIZE är inte en dynamisk parameter, man måste starta om instansen för att uppdatera denna parameter.
Nedan beskrivs vilka minnesparametrar som svarar mot vilka minnesareor (som ryms inom SGA):
- SHARED_POOL_SIZE: Denna parameter kontrollerar storleken på "Shared Pool". "Shared Pool" är den viktigaste delen av SGA, och innehåller "Library Cache" och "Dictionary Cache".
- LARGE_POOL_SIZE: Denna parameter kontrollerar storleken på "Large Pool". Du använder Large Pool i första hand om du har en delad server (se avsnittet för detta). Även RMAN brukar arbeta i "Large Pool".
- JAVA_POOL_SIZE: Denna parameter kontrollerar storleken på "Java Pool". Javapoolen infördes i 8.1.5 och används för att köra Java i databasen (lagrade procedurer skrivna i Java). Eftersom nästan ingen kör sin Java-kod i databasen idag bör denna sättas till 0.
- DB_CACHE_SIZE: Med denna parameter sätter du storleken på DEFAULT POOL-delen av buffercachen, den del av SGA som i normala fall cachar datablock.
- DB_KEEP_CACHE_SIZE: Med denna parameter sätter du storleken KEEP POOL-delen av buffercachen, den del där minneselementen aldrig åldras ut.
- DB_RECYCLE_CACHE_SIZE: Med denna parameter sätter du storleken på RECYCLE POOL-delen av buffercachen. RECYCLE är direkta motsatsen mot KEEP, alltså man förväntar sig inte att få någon cache-effekt alls i denna pool. Här ska man placera stora element som man utnyttjar relativt sällan för att förhindra att man i onödan åldrar ut blocken i DEFAULT POOL.
- DB_xK_CACHE_SIZE: Denna parameter använder du om du har flera olika blockstorlekar i din databas. Om du har defaultstorleken 16K (som jag) men dessutom vill använda säg 32K måste du definiera parametern DB_32K_CACHE_SIZE, så att det instansen kan bearbeta data från denna del av databasen.
- LOG_BUFFER: Denna parameter bestämmer storleken på "REDO-buffern", som buffrar data som ska skrivas ut till online REDO-loggarna.
- STREAMS_POOL: Denna parameter bestämmer storleken på "Streams pool". "Streams pool" är en ny SGA-struktur i Oracle 10g som används till att buffra köer som används av "Streams"-processen. DEFAULT= Max 10% av shared pool.
3. ASMM
Vi har i Oracle 1Og två metoder för SGA, antingen MSMM eller ASMM. ASMM (Automatic SGA Memory Management) innebär att Oracle 10g fördelar minnet i SGA efter egen förmåga. Vi har följande två generella parametrar för SGA:
- SGA_MAX_SIZE: Bestämmer maximala storleken på SGA (fungerar som i MSMM).
- SGA_TARGET: Bestämmer den storlek på SGA som instansen ska hålla. SGA_TARGET är en dynamisk parameter som kan uppdateras när som helst. SGA_TARGET måste sättas till mindre eller lika med SGA_MAX_SIZE. Genom att sätta parametern SGA_TARGET så tvingar du Oracle att utnytta funktionen ASMM.
Om metoden ASMM utnyttjas kommer instansen utföra följande:
- Utgå från SGA_TARGET.
- Dra av storleken på följande minnesareor: DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SIZE, DB_xK_CACHE_SIZE, LOG_BUFFER, STREAMS_POOL från SGA_TARGET.
- Fördela det resterande minnet dynamiskt på följande 4 minnesareor: SHARED_POOL_SIZE, LARGE_POOL_SIZE, JAVA_POOL_SIZE, DB_CACHE_SIZE.
Alltså, om du manuellt har satt ett värde på någon av parametrarna SHARED_POOL_SIZE, LARGE_POOL_SIZE, JAVA_POOL_SIZE, DB_CACHE_SIZE så kommer dessa inställningar att ignoreras av ASMM. ASMM kommer att då och då omfördela storleken på dessa fyra parametrar beroende på statistik baserad på hur minnet utnyttjas.
- OBS: Om du använder ASMM måste du ha STATISTICS_LEVEL=TYPICAL eller STATISTICS_LEVEL=ALL, annars har inte instansen tillgång till den historiska information som behövs för att fördela minnet på ett relevant sätt.
Vi kontrollerar denna parameter på systemet:
SQL> SHOW PARAMETERS statistics_level
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
statistics_level string TYPICAL
|
Inställningen är ok för ASMM.