oracle 記憶體分配和調優 總結
http://lqding.blog.51cto.com/9123978/1693659
在這裡要額外說明一點的是,對於 v$parameter、v$sgastat、v$sga 查詢值可能不一樣。v$parameter 裡面的值,是指使用者在初
因此在這裡必須要了解Redo Log的觸發事件(LGWR)1、當redo log buffer的容量達到1/32、設定的寫redo log時間間隔到達,一般為3秒鐘。3、redo log buffer中重做日誌容量到達1M4、在DBWn將緩衝區中的資料寫入到資料檔案之前5、每一次commit--提交事務。上面的結論可以換句話說1、log_buffer中的內容滿1/3,快取重新整理一次。2、最長間隔3秒鐘,快取重新整理一次3、log_buffer中的資料到達1M,快取重新整理一次。4、每次提交一個“事務”,快取重新整理一次
系統記憶體 |
SGA_MAX_SIZE值 |
1G |
400-500M |
2G |
1G |
4G |
2500M |
8G |
5G |
標準:一般是大於99%
檢查方式: select 1-(sum(reloads)/sum(pins)) "Library cache Hit Ratio" from v$librarycache;
處理措施:如果Library cache Hit Ratio的值低於99%,應調高shared_pool_size的大小。透過sqlplus連線資料庫執行如下命令,調整shared_pool_size的大小:SQL>alter system flush shared_pool;SQL>alter system set shared_pool_size=設定值 scope=spfile;
標準:一般是大於90%
檢查方式:select 1 - (phy.value / (cur.value + con.value)) "HIT RATIO"
from v$sysstat cur, v$sysstat con, v$sysstat phy
where cur.name = 'db block gets'
and con.name = 'consistent gets'
and phy.name = 'physical reads';
處理措施:如果HIT RATIO的值低於90%,應調高db_cache_size的大小。透過sqlplus連線資料庫執行如下命令,調整db_cache_size的大小SQL>alter system set db_cache_size=設定值 scope=spfile
標準:一般是大於95%
檢查方式:select 1 - (sum(getmisses) / sum(gets)) "Data Dictionary Hit Ratio" from v$rowcache;
處理措施:如果Data Dictionary Hit Ratio的值低於95%,應調高shared_pool_size的大小。透過sqlplus連線資料庫執行如下命令,調整shared_pool_size的大小:SQL>alter system flush shared_pool;SQL>alter system set shared_pool_size=設定值 scope=spfile;
標準:一般是小於1%
檢查方式:select (req.value * 5000) / entries.value "Ratio"
from v$sysstat req, v$sysstat entries
where req.name = 'redo log space requests'
and entries.name = 'redo entries';
處理措施:如果Ratio高於1%,應調高log_buffer的大小。透過sqlplus連線資料庫執行如下命令,調整log_buffer的大小:SQL>alter system set log_buffer=設定值 scope=spfile;
標準:undo_retention 的值必須大於max(maxquerylen)的值
檢查方式:col undo_retention format a30select value "undo_retention" from v$parameter where name='undo_retention';select max(maxquerylen) From v$undostat Where begin_time>sysdate-(1/4);
處理措施:如果不滿足要求,需要調高undo_retention 的值。透過sqlplus 連線資料庫執行如下命令,調整undo_retention 的大小:SQL>alter system set undo_retention= 設定值 scope=spfile;
=================補充=======================
Oracle資料庫包含了如下基本記憶體元件
-
System global area (SGA)
The SGA is a group of shared memory structures, known as SGA components, that contain data and control information for one Oracle Database instance. The SGA is shared by all server and background processes. Examples of data stored in the SGA include cached data blocks and shared SQL areas.
-
Program global area (PGA)
A PGA is a nonshared memory region that contains data and control information exclusively for use by an Oracle process. The PGA is created by Oracle Database when an Oracle process is started.
One PGA exists for each and background process. The collection of individual PGAs is the total instance PGA, or instance PGA. Database initialization parameters set the size of the instance PGA, not individual PGAs.
-
User Global Area (UGA)
The UGA is memory associated with a user session.
-
Software code areas
Software code areas are portions of memory used to store code that is being run or can be run. Oracle Database code is stored in a software area that is typically at a different location from user programs—a more exclusive or protected location.
記憶體管理
Oracle依賴於記憶體相關的初始化引數來控制記憶體的管理。
記憶體管理有如下三個選項
-
Automatic memory management
You specify the target size for instance memory. The database instance automatically tunes to the target memory size, redistributing memory as needed between the SGA and the instance PGA.
-
Automatic shared memory management
This management mode is partially automated. You set a target size for the SGA and then have the option of setting an aggregate target size for the PGA or managing PGA work areas individually.
-
Manual memory management
Instead of setting the total memory size, you set many initialization parameters to manage components of the SGA and instance PGA individually.
UGA概覽
UGA是會話記憶體,用來儲存會話變數例如登入資訊,已經資料庫會話需要的其他資訊。
當PL/SQL包載入進記憶體時,UGA中包含了package state,也就是呼叫PL/SQL時指定的變數值。
PGA概覽
PGA緩衝區,則主要是為了某個使用者程式所服務的。這個記憶體區不是共享的,只有這個使用者的服務程式本身才能夠訪問它自己的PGA區。做個形象的比喻,SGA就好像是作業系統上的一個共享資料夾,不同使用者可以以此為平臺進行資料方面的交流。而PGA就好像是作業系統上的一個私有資料夾,只有這個資料夾的所有者才能夠進行訪問,其他使用者都不能夠訪問。雖然程式快取區不向其他使用者的程式開放,但是這個記憶體區仍然肩負著一些重要的使命,如資料排序、許可權控制等等都離不開這個記憶體區。
PGA元件
私有SQL區包含了繫結變數值和執行時期記憶體結構資訊等資料。每一個執行SQL語句的會話都有一個塊私有SQL區。一個遊標的私有SQL區又分為兩個生命週期不同的區:
永久區,包含繫結變數資訊。當遊標關閉時被釋放。
執行區,當執行結束時釋放。
Cursor
A cursor is a name or handle to a specific private SQL area
SGA包含如下元件
-
Database Buffer Cache
-
Redo Log Buffer
-
Shared Pool
-
Large Pool
-
Java Pool
-
Streams Pool
-
Fixed SGA
Buffer cache
Buffer Cache是SGA區中專門用於存放從資料檔案中讀取的的資料塊的區域。Oracle程式如果發現需要訪問的資料塊已經在buffer cache中,就直接讀寫記憶體中的相應區域,而無需讀取資料檔案,從而大大提高效能。Buffer cache對於所有oracle程式都是共享的,即能被所有oracle程式訪問。
Buffer的大小和資料塊一樣。
Buffer cache按照型別分為3個池
-
Default pool
This pool is the location where blocks are normally cached. Unless you manually configure separate pools, the default pool is the only buffer pool.
-
Keep pool
This pool is intended for blocks that were accessed frequently, but which aged out of the default pool because of lack of space. The goal of the keep buffer pool is to retain objects in memory, thus avoiding I/O operations.
-
Recycle pool
This pool is intended for blocks that are used infrequently. A recycle pool prevent objects from consuming unnecessary space in the cache.
Oracle還提供了非標準塊大小的buffer cache。如果你建立的表空間指定的塊大小為非資料庫塊大小,那麼將使用這些buffer cache來快取資料塊。
首先Oracle 以每個資料塊的檔案號、塊號、型別做hash運算,得到hash值。
對於hash值相同的塊,放在一個Hash Bucket中。
因為buffer的大小畢竟有限,buffer中的資料塊需要根據一定的規則提出記憶體。
Oracle採用了LRU演算法維護一個LRU連結串列,來決定哪些資料塊被淘汰。
通用的淘汰演算法如下
Oracle改進了LRU演算法,引入了Touch count概念、以及LRU連結串列分為熱端頭和冷端頭。
Touch count:
用來記錄資料塊訪問的頻繁度,此數值在記憶體中不受保護,多個程式可以同時修改它。這個值並不是精準的表示塊被訪問的次數,只是一種趨勢。3秒內無論多少使用者,訪問多少次塊。此值加1.
當資料塊第一次被放到buffer中,Oracle將其放置在冷端的頭部。
如果buffer已經沒有空閒空間,那麼如何淘汰資料塊呢?Oracle從LRU的冷端尾部掃描資料塊,當發現資料塊的Touch count大於等於2時,將資料塊移動到熱端頭部,並將Touch count置為0 。當Oracle發現Touch count小於2時,則淘汰該資料塊。
當資料塊被修改了,我們把這個塊稱之為髒塊。髒塊在寫入磁碟前,是不會被踢出buffer的。
如果LRU中的髒塊比較多,每次申請新的空間時,都要掃描很多髒塊,但是又不能被淘汰。效率很低。
為此Oracle因為了髒LRU連結串列。專門用來記錄髒資料塊。
當塊被修改,並不會馬上從LRU連結串列中移動到LRUW中。只有當Oracle需要淘汰資料塊時,才會去掃描LRU連結串列,此時發現塊為髒塊,將資料塊移動到LRUW連結串列中。
檢查點連結串列
透過上面的描述,我們知道髒塊在LRU和LRUW連結串列中都有。那麼當dbwr寫資料時,這兩個連結串列都要掃描。首先效率比較低,並且無法保證先修改的資料塊先被寫入磁碟。
為此Oracle引入了檢查點佇列,該佇列按照資料塊第一次被修改順序將髒塊連結到一起。
dbwr寫髒塊時,只需讀取檢查點佇列即可。
並且每個資料塊與記錄了日誌條目的位置
redo log buffer
使用者程式將redo entries 複製到redo log buffer中。LGWR負責將其寫到磁碟中。
Redo entries contain the information necessary to reconstruct, or redo, changes made to the database by DML or DDL operations. Database recovery applies redo entries to data files to reconstruct lost changes.
共享池
Library Cache:
主要存放shared curosr(SQL)和PLSQL物件(function,procedure,trigger)的資訊,以及這些物件所依賴的table,index,view等物件的資訊。
Private SQL Areas與Shared SQL Area的關係
資料字典快取
用來快取系統資料字典表的內容,與普通表的快取不同,普通表以塊為單位快取到buffer cache中。而資料字典快取以行為單位,快取到shared pool中的data dictionary cache中。
Server result cache
用來快取sql或者plsql的執行結果。
大池:
The large pool can provide large memory allocations for the following:
-
UGA for the shared server and the interface (used where transactions interact with multiple databases)
-
Message buffers used in the parallel execution of statements
-
Buffers for Recovery Manager (RMAN) I/O slaves
配置記憶體
Oracle提供了兩個初始化引數用來配置記憶體自動管理
MEMORY_TARGET:sga+pga記憶體之和,Oracle自動分配SGA和PGA的大小。
MEMORY_MAX_TARGET:MEMORY_TARGET可以設定大小的上限。
SGA自動記憶體管理
設定初始化引數SGA_TARGET為非0值,並且將STATISTICS_LEVEL的值設定為TYPICAL或者ALL.
PGA自動記憶體管理
PGA_AGGREGATE_TARGET設定為非0值。
如果workarea_size_policy為auto則sort_area_size,hash_area_size等引數設定被忽略,如果workarea_size_policy為manual,則sort_area_size,hash_area_size等引數設定生效。
也可以手工配置其他各個記憶體池的大小。當配置了記憶體自動管理時,有配置了具體池的大小,那麼該配置為自動記憶體分配時的最小大小。
檢視記憶體情況
The following views provide information about dynamic resize operations:
-
V$MEMORY_CURRENT_RESIZE_OPS displays information about memory resize operations (both automatic and manual) which are currently in progress.
-
V$MEMORY_DYNAMIC_COMPONENTS displays information about the current sizes of all dynamically tuned memory components, including the total sizes of the SGA and instance PGA.
-
V$MEMORY_RESIZE_OPS displays information about the last 800 completed memory resize operations (both automatic and manual). This does not include in-progress operations.
-
V$MEMORY_TARGET_ADVICE displays tuning advice for the MEMORY_TARGET initialization parameter.
-
V$SGA_CURRENT_RESIZE_OPS displays information about SGA resize operations that are currently in progress. An operation can be a grow or a shrink of a dynamic SGA component.
-
V$SGA_RESIZE_OPS displays information about the last 800 completed SGA resize operations. This does not include any operations currently in progress.
-
V$SGA_DYNAMIC_COMPONENTS displays information about the dynamic components in SGA. This view summarizes information based on all completed SGA resize operations that occurred after startup.
-
V$SGA_DYNAMIC_FREE_MEMORY displays information about the amount of SGA memory available for future dynamic SGA resize operations.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2137760/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 垃圾回收與記憶體分配——總結篇記憶體
- [20210126]探究oracle記憶體分配.txtOracle記憶體
- STM32記憶體結構介紹和FreeRTOS記憶體分配技巧記憶體
- [20210126]探究oracle記憶體分配3.txtOracle記憶體
- [20210126]探究oracle記憶體分配4.txtOracle記憶體
- 【JVM】堆體系結構及其記憶體調優JVM記憶體
- JVM快速調優手冊v1.0之三:記憶體分配策略JVM記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- Android記憶體洩漏監控和優化技巧總結Android記憶體優化
- 記憶體調優實戰記憶體
- Go記憶體分配和GC的理解Go記憶體GC
- JVM垃圾回收和記憶體分配策略JVM記憶體
- 垃圾收集器與記憶體分配策略_記憶體分配策略記憶體
- MySQL記憶體管理,記憶體分配器和作業系統MySql記憶體作業系統
- 動態記憶體分配記憶體
- Android系統Bitmap記憶體分配原理與優化Android記憶體優化
- SAP專家培訓之NetweaverABAP記憶體管理和記憶體調優最佳實踐記憶體
- JVM效能調優,記憶體分析工具JVM記憶體
- JVM記憶體模型總結JVM記憶體模型
- Oracle - 資料庫的記憶體調整Oracle資料庫記憶體
- java-方法記憶體分配Java記憶體
- go記憶體分配器Go記憶體
- 深度理解glibc記憶體分配記憶體
- java基礎-記憶體分配Java記憶體
- hadoop 記憶體分配規則Hadoop記憶體
- C語言-記憶體分配C語言記憶體
- 記憶體分配策略學習記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- SAP專家培訓之Netweaver ABAP記憶體管理和記憶體調優最佳實踐記憶體
- JVM快速調優手冊v1.0之四:堆記憶體分配的CMS公式解析JVM記憶體公式
- 2024.04.18每日收穫之聯合體結構體記憶體分配結構體記憶體
- MySQL 索引和 SQL 調優總結MySql索引
- Oracle OCP(39):Database 記憶體結構OracleDatabase記憶體
- 效能調優(cpu/IO/JVM記憶體分析)JVM記憶體
- android 關於記憶體優化的一些總結Android記憶體優化
- JVM記憶體管理——總結篇JVM記憶體
- 記憶體分配策略中,堆和棧的區別記憶體
- Go 語言社群新提案 arena,可優化記憶體分配Go優化記憶體
- JVM筆記(1.2)垃圾收集器和記憶體分配策略JVM筆記記憶體