Buffer cache 的調整與優化(一)
--==============================
-- Buffer cache 的調整與優化(一)
--==============================
Buffer Cache是SGA的重要組成部分,主要用於快取資料塊,其大小也直接影響系統的效能。當Buffer Cache過小的時候,將會造成更多的
free buffer waits事件。 下面將具體描述Buffer Cache的作用,調整與優化。
一、SGA的所有元件
從動態檢視v$sga_dynamic_components獲取SGA的相關資訊
SELECT component, current_size, min_size FROM v$sga_dynamic_components;
COMPONENT CURRENT_SIZE MIN_SIZE
------------------------- ------------ ----------
shared pool 71303168 71303168
large pool 4194304 4194304
java pool 4194304 4194304
streams pool 4194304 4194304
DEFAULT buffer cache 113246208 113246208
KEEP buffer cache 0 0
RECYCLE buffer cache 0 0
DEFAULT 2K buffer cache 0 0
DEFAULT 4K buffer cache 0 0
DEFAULT 8K buffer cache 0 0
DEFAULT 16K buffer cache 0 0
DEFAULT 32K buffer cache 0 0
ASM Buffer Cache 0 0
二、Buffer cache介紹
1.Buffer cache的型別通常包括
default buffer cache
keep buffer cache
recycle buffer cache
nk buffer caches
與Buffer cache打交道的後臺程式為DBWn,與之對應的資料檔案通常位於system 表空間,sysaux表空間,undo表空間,datafile 等
Buffer cache是SGA的一部分,其內容是由使用者程式從資料檔案讀取出來的資料塊,並且所有的使用者共享這些資料塊。通常,服務
器程式為提高I/O效能,會一次性讀多個資料塊。對於Buffer cache中的髒資料則由DBWn程式寫入到資料檔案。同樣為提高效能,DBWn
程式也會一次寫多個資料塊。Buffer cache會擁有一個資料塊的多個副本,當前塊的最新副本僅有一份,而該資料塊老的或舊的副本可
能有多份,用於塊的讀一致性。Buffer cache採用LRU演算法來淘汰掉過時的資料塊。
Buffer cache中存在檢查點佇列以及LRU連結串列。
2.Buffer cache的幾個相關引數
Buffer cache能有由多個獨立的且具有不同block size的緩衝池(buffer pool)組成。
DB_BLOCK_SIZE:引數決定了資料庫主塊的塊大小,該塊的大小通常被系統表(system,sysaux)空間和主要的Buffer cache(recycle,keep,
default buffer cache)所使用
決定主要的Buffer cache大小的幾個引數
db_cache_size
db_keep_cache_size
db_recycle_cache_size
3.Buffer cache中塊的四種狀態
pinned:意味著多個會話在相同的時段寫同一個資料塊,其他的會話等待訪問塊。
clean:優先要淘汰掉的資料塊,即不是pinned狀態,也不會被再次使用的塊.該塊可能和磁碟上的塊處於同步狀態,也可能是一個讀一致性塊
free/unused:即Buffer cache中的塊處於空閒狀態或未使用狀態,通常是由於例項剛剛啟動。
dirty:已發生變化的資料塊,且沒有程式再使用該塊,則在aged out之前需要立即由DBWn 寫入到資料檔案。
伺服器程式將資料塊從資料檔案填充到Buffer cache,當Buffer cache中不再需要使用到資料塊的副本時,而DBWn程式則將髒資料
寫入到資料檔案,用於將資料塊由 pinned 狀態變為free 狀態。
4.引數db_block_checksum
該引數設定為true,則一個指定的校驗碼被同時寫入到資料塊,用於防止磁碟,I/O系統損壞導致資料的丟失。
三、客戶端伺服器程式從Buffer cache獲取資料的過程
1.伺服器程式使用一個雜湊函式來檢查所需的資料塊是否已經位於Buffer cache。如果在Buffer cache中找到所需的資料塊,則該塊根據使
用的頻率放置到LRU佇列中特定的位置。此時的讀資料塊為邏輯讀,且不在需要執行後續步驟。如果不在Buffer cache中,則轉到下一步。
2.伺服器程式搜尋LRU列表中是否存在可用的空閒空間存放新的資料塊。在搜尋LRU列表同時時,已經被修改的髒資料將被伺服器程式放置到
檢查點佇列。
3.檢查點佇列長度超出預設大小的闕值或伺服器程式搜尋空閒塊操作預設的次數(由隱藏引數_db_block_max_scan_pct所指定的值,表示已
經掃描的buffer header數量佔整個LRU連結串列上的buffer header的總數量,在i中該限定值為40%),則伺服器程式通過DBWn將髒資料從
Buffer cache寫出到資料檔案。
4.當可用的空閒塊被找到後,伺服器程式從資料檔案讀入塊到Database Buffer cache並放置到LRU佇列中。如果所得到的塊不是一致性讀塊
,則伺服器程式從undo segment中重構一致性塊。
Buffer cache與DBWn密切相關,下面給出DBWn觸發的條件
髒緩衝列表達到指定的闕值大小
搜尋LRU空閒佇列達到預設的闕值次數
發生檢查點事件
資料庫關閉時
表空間實現熱備份時
表空間離線
在段被刪除時
更多有關體系結構請參考:Oracle例項和Oracle資料庫(Oracle體系結構)
四、對buffer cache調優,命中率等
1.調整buffer cache調優規則
調優的目標:儘可能在Buffer cache中找到資料,降低等待可用空閒塊的時間
除錯方法:
wait events
cache hit ration
v$db_cache_advice view
調整手段
降低SQL命令對資料塊的請求,如避免使用select * from 語句
增加緩衝池的大小
不同訪問方式使用不同的緩衝池(buffer pools)
快取常用的表到記憶體
並行讀或排序操作不使用cache,直接從磁碟讀入到PGA及記憶體
2.決定Buffer cache的幾個指標
下面的查詢中列出了涉及到buffer cache的幾個重要指標數
SELECT NAME, VALUE
FROM v$sysstat
WHERE NAME IN ('session logical reads',
'physical reads',
'physical reads direct',
'physical reads direct (lob) ',
'consistent gets',
'db block gets',
'free buffer inspected',
'free buffer requested',
'dirty buffers inspected',
'pinned buffers inspected');
NAME VALUE
------------------------------ -------------
session logical reads 139150060175
db block gets 274690511
consistent gets 139129962467
physical reads 21335058151
free buffer requested 21085155516
dirty buffers inspected 156801
pinned buffers inspected 432841
free buffer inspected 968639
physical reads direct 4995527
Session Logical Reads:所有的邏輯讀的資料塊的數量。
Free Buffer Inspected指標:
為尋找空閒buffer之前所檢查塊的總數量,即跳過塊的數量。如果該值接近髒資料塊的數量,則表明空閒塊很少,該值應儘可能小
於髒塊的數量。
Free Buffer Waits:
當session在LRU list上沒有尋找到空閒可用資料塊或者搜尋可用的記憶體資料塊被暫停的時候,該發生該事件,此為等待DBWn將髒
塊寫入到資料檔案的等待數。除此之外,會話在做一致性讀時,需要構造資料塊在某個時刻的前映像(image),此時需要申請內
存來存放這些新構造的資料塊,如果記憶體中無法找到這樣的記憶體塊,也會發生這個等待事件。
Buffer Busy Waits:
使用者伺服器程式已找到所需的資料塊,但該塊正被其它程式使用或多個程式同時要修改該塊,此時需要等待的時間。
當一個會話需要讀取一個資料塊,但這個資料塊正在被另一個會話讀取到記憶體中時,此時同樣發生Buffer Busy Waits事件。
SELECT event
,total_waits
FROM v$system_event
WHERE event IN ('free buffer waits','buffer busy waits');
EVENT TOTAL_WAITS
------------------------- -----------
buffer busy waits 35216021
查詢event事件名稱
SELECT NAME
,parameter1
,parameter2
,parameter3
FROM v$event_name
WHERE NAME='buffer busy waits';
NAME PARAMETER1 PARAMETER2 PARAMETER3
------------------------------ -------------------- -------------------- ------------
buffer busy waits file# block# id
產生Buffer busy waits的幾種情形
DATA BLOCK,資料塊的競爭,該情形通常是基於表段和索引段上的競爭,下面的處理辦法
儘可能縮小SQL語句的查詢欄位,查詢範圍,如不使用select * 查詢,將like子句改為直接賦值等
檢查索引的合理性。如使用了sequence生成的索引,其索引鍵通常位於相同的塊,因此可以使用反向索引避免此問題
使用自動段空間管理或增加空閒列表,以避免多個程式同時插入相同的塊
查詢檢視v$session_wait來獲得熱點塊的檔案ID,塊ID,通過這些資訊來獲得物件ID,進一步對該物件進行調整
UNDO Header
基於UNDO段頭部的競爭,如果未使用自動撤銷段管理模式,則需要增加更多的回滾段
UNDO BLOCK
基於UNDO段塊的競爭,如果未使用自動撤銷段管理模式,則需為回滾段分配更大的尺寸
產生Free Buffer waits的幾種情形
DBWn程式來不及將資料寫入到資料檔案,導致需要等待被釋放的空間
I/O系統速度過於緩慢
確保資料庫檔案是否分佈在不同的磁碟上,或增加更高效能的磁碟
資源等待造成I/O系統過慢,如latch等待
確保資料庫檔案是否分佈在不同的磁碟上,或增加更高效能的磁碟
Buffer cache太小,導致DBWn來不及將髒資料寫入到資料檔案
需要增大buffer cache的尺寸
Buffer cache太大,而單一的DBWn程式需要多次才能將資料寫入到檔案
減少buffer cache的尺寸,或增加更多的DBWn程式
3.評估Cache的命中率
計算命中率的思想
1-(物理讀的次數-總的請求次數)
計算命中率
SELECT ROUND(1 - ((physical.value - direct.value - lobs.value) / logical.value),3) *100 ||'%'
"Buffer Cache Hit Ratio"
FROM v$sysstat physical,
v$sysstat direct,
v$sysstat lobs,
v$sysstat logical
WHERE physical.name = 'physical reads'
AND direct.name = 'physical reads direct'
AND lobs.name = 'physical reads direct (lob)'
AND logical.name = 'session logical reads';
physical reads
從Oracle級別來理解,從磁碟讀資料塊的次數,一次可以讀多塊,由引數db_file_multiblock_read_count來控制。此種讀方式使用
了db cache.
形象示意:db_file ==> db_cache ==> pga
physical reads direct
有些資料塊不會先從硬碟讀入記憶體再從記憶體讀入PGA再傳給使用者,而是繞過SGA直接從硬碟讀入PGA。比如並行查詢以及從臨時表空
間讀取資料。這部分資料塊由於不快取使得hit ratio不會被提高。其在計算hit ratio時應當被扣除。
形象示意:db_file ==> pga
通常,disk sort / hash , exp direct=Y ,都會有physical reads direct
scott@ORCL> select name from v$statname where statistic# in (54,55,56);
NAME
----------------------------------------------------------------
physical reads
physical reads cache --使用buffer cache
physical reads direct --不使用buffer cache
physical reads direct (lob)
對於大值物件,如LOB資料型別以及LOB段,Oracle可以繞過buffer cache而直接使用PGA,其原理等同於physical reads direct
使用physical reads direct,physical reads direct (lob)的優點:
對於一個大操作,需要請求大量資料塊,假設又使用並行執行,且執行次數就那麼一次,這個時候就適合使用direct方式,
如果還是走buffer cache則需要把buffer cache裡已快取的資料庫都清空
注意physical write /direct 同理
session logical reads
發出的總的請求次數,此處是指從database buffer cache中請求塊。對於一致性讀,則這些緩衝包含來自回滾段的資料
下面是另一種不同的計算命中率的方法,通常用在10g和11g之中
SELECT NAME,
physical_reads,
db_block_gets,
consistent_gets,
ROUND((1 - (physical_reads / (db_block_gets + consistent_gets))) * 100) || '%' ratio
FROM V$BUFFER_POOL_STATISTICS
WHERE NAME = 'DEFAULT';
SELECT (1 - (SUM(decode(NAME, 'physical reads', VALUE, 0)) /
(SUM(DECODE(NAME, 'db block gets', VALUE, 0)) +
SUM(DECODE(NAME, 'consistent gets', VALUE, 0))))) * 100 "Hit Ratio"
FROM v$sysstat;
consistent gets from cache
在回滾段Buffer中的資料構造一致性讀資料塊的總次數。其產生原因是由於其他會話對當前資料塊進行操作,如update操作,
但是由於我們的查詢是在這些修改之前呼叫的,所以需要使用回滾段中的資料塊的前映像進行查詢,來保證資料的一致性。
這樣就產生了一致性讀。
db block gets
在操作中提取的塊數目,而不是在一致性讀的情況下而產生的塊數。
當前塊(current,相對於cosistent讀而言,current總是最新的塊),從buffer cache中請求的次數。當前塊意思就是在操作
中正好提取的塊數目,而不是在一致性讀的情況下而產生的塊數。通常的情況下,一個查詢提取的塊是在查詢開始的那個時
間點上存在的資料塊,當前塊是在這個時刻存在的資料塊,而不是在這個時間點之前或者之後的資料塊數目。
physical reads cache
從磁碟讀入到buffer cache中的總次數。
產生的主要原因是:在資料庫快取記憶體中不存在這些塊, 全表掃描, 磁碟排序等
db_block_gets + consistent_gets兩者之和作為總的請求次數,在與physical_reads相比進而得到命中率
此方法與前面命中率計算的方法不一樣,更簡單直觀。
4.影響命中率的因素
全表掃描(小標尚可,對於大表而言I/O效能更差。而且全表掃描總是被置於LRU的最尾端,隨時被aged out)
不同資料定義和應用程式設計影響命中率
大表的隨機訪問(非順序)
不均衡的cache hit
命中率需要考慮的問題
a.對相同的大表和索引的重複掃描容易造成命中率很高的假象。定期檢查頻繁使用且返回結果集很大的SQL語句,確保這些SQL語
句使用了最優的執行計劃。
b.避免返回查詢相同的資料,儘可能將獲得的結果集快取的客戶端程式或中介軟體。
c.大表的全表掃描問題,直接將其放置到LRU的尾端,容易aged out。
(小表通常指全表掃描時佔用buffer cache 20%或擁有個資料塊)。
d.對較大OLTP系統而言,表中的很多行僅僅被訪問次或很少的次數,基於此,這些塊不易長時間佔住buffer cache。
f.對於並行查詢或排序等,持續增加buffer cache的大小並無實際意義,優化效果並明顯。
5.下列情形可以考慮增加buffer cache
一些等待事件已經被優化
不良的SQL語句已經被優化
作業系統級別無不良的記憶體頁面置換
上次增加的buffer cache有效
基於上面的情形,且命中率很低,此時可以增加buffer cache
6.增加buffer cache 的步驟
首先將db_cache_advice置於ON 狀態
檢查動態效能檢視v$db_cache_advice(需要考慮增加後不影響作業系統級別過多的記憶體頁面置換)
動態增加db_cache_size的值(生產資料庫不建議關閉系統而使用動態調整alter system set db_cache_size=nM;)
檢視當前buffer cache的大小
SELECT NAME,current_size,buffers FROM v$buffer_pool;
NAME CURRENT_SIZE BUFFERS
------------------------------ ------------ ----------
DEFAULT 3456 428760
7.減少buffer cache 的情形
在命中率很高的情形下,查詢檢視v$db_cache_advice,來權衡適度降低buffer cache size是否會使得系統I/O顯劇增加,如不是,且
降低buffer cache size不會影響效能的情況下,則可以適度降低buffer cache size的大小。
使用alter system set db_cache_size來調整
8.使用advisor來調整buffer cache
buffer cache advisor 可以啟用或禁用通過收集統計資訊來預估buffer cache的大小,然後根據預估的大小以及工作負荷來調整buffer
cache的大小。buffer cache advisor功能通過設定引數db_cache_advice 開啟用或禁用,該引數僅能支援系統級別的修改。
其引數值為:OFF,ON,READY
OFF:禁用buffer cache advisor特性,且不為advisor分配記憶體
READY:不收集資料,但是收集資料的記憶體已經預先分配好了.通過把引數值從off設定為ready,然後再設定為on,以避免出現錯誤。
ALTER SYSTEM SET db_cache_advice = ON | READY | OFF ;
該引數設定的前提條件為STATISTICS_LEVEL引數必須要先設定為TYPICAL或者ALL
通過設定啟用buffer cache advisor 功能後,可以檢視檢視v$db_cache_advice來獲得不同負荷下的advisor
以下是該檢視的幾個重要列
SIZE_FOR_ESTIMATE
BUFFERS_FOR_ESTIMATE
ESTD_PHYSICAL_READS
檢視預設的buffer cache的advice
SELECT size_for_estimate "Cache Size (MB)",
size_factor,
buffers_for_estimate "Buffers",
estd_physical_read_factor est_read_factor,
estd_physical_reads estd_phy_red
-- ,estd_physical_read_time est_phy_red_t --此引數在i 中不可用
FROM v$db_cache_advice
WHERE NAME='DEFAULT'
AND block_size=(
SELECT VALUE
FROM v$parameter
WHERE NAME='db_block_size'
AND advice_status='ON');
Cache Size (MB) SIZE_FACTOR Buffers EST_READ_FACTOR ESTD_PHY_RED
--------------- ----------- ---------- --------------- ------------
352 .1019 43670 15.8455 6.1906E+10
704 .2037 87340 58.5913 2.2891E+11
1056 .3056 131010 31.6149 1.2351E+11
1408 .4074 174680 21.5397 8.4152E+10
1760 .5093 218350 14.6721 5.7321E+10
2112 .6111 262020 8.3646 3.2679E+10
2464 .713 305690 3.8134 1.4898E+10
2816 .8148 349360 1.9615 7663197796
3168 .9167 393030 1.2403 4845534681
3456 1 428760 1 3906820053
3520 1.0185 436700 .9675 3779821439
3872 1.1204 480370 .8359 3265831355
4224 1.2222 524040 .7512 2934896434
4576 1.3241 567710 .6957 2717876216
4928 1.4259 611380 .6565 2564852647
5280 1.5278 655050 .6272 2450487527
5632 1.6296 698720 .6045 2361720470
5984 1.7315 742390 .5859 2289177246
6336 1.8333 786060 .5726 2236962972
6688 1.9352 829730 .5619 2195121418
7040 2.037 873400 .5521 2156817317
9.優化Buffer cache的常用引數及檢視
db_cache_size
db_cache_advice
db_keep_cache_size
db_recycle_cache_size
db_file_multiblock_read_count
statspace report
v$db_cache_advice(view)
檢視
v$buffer_pool_statistics
v$buffer_pool
v$db_cache_advice
v$sysstat
v$sesstat
v$system_event
v$session_wait
v$bh
v$cache
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22578826/viewspace-703514/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- buffer cache深度分析及效能調整(四)
- buffer cache深度分析及效能調整(六)
- buffer cache深度分析及效能調整(五)
- Linux工具效能調優系列二:buffer和cacheLinux
- 調整緩衝區快取記憶體(Buffer Cache)的效能(轉)快取記憶體
- buffer與cache的區別
- Nginx的優化調整方面Nginx優化
- 技術分享 | 調整 max-write-buffer-size 優化 pika 效能10倍的案例優化
- 備份的優化和調整優化
- IO之核心buffer----"buffer cache"
- swoole優化核心引數調整優化
- 33、buffer_cache_3(redo的產生、LRBA、buffer cache裡的等待事件)事件
- Linux Buffer/Cache 的區別Linux
- Oracle Cache Buffer ChainsOracleAI
- 【Cache】將常用的“小表”快取到Buffer Cache快取
- 清理buffer/cache/swap的方法梳理
- TiDB 查詢優化及調優系列(四)查詢執行計劃的調整及優化原理TiDB優化
- Buffer Cache以及buffer busy waits/gc相關事件AIGC事件
- 【BUFFER】Oracle buffer cache之 latch 學習記錄Oracle
- Nginx安全優化與效能調優Nginx優化
- [20231023]備庫與alter system flush buffer_cache.txt
- Cache 和 Buffer 的區別在哪裡?
- 夏令時與冬令時:時區的變化與調整
- 記一次容量提升5倍的HttpDns業務Cache調優httpdDNS
- PostgreSQL DBA(89) - Linux(Buffer vs Cache)SQLLinux
- Linux記憶體、Swap、Cache、BufferLinux記憶體
- Service Worker cache 相比 HTTP cache 的一些優點HTTP
- 高層調整、資源優化:位元組跳動與阿里巴巴的遊戲野望優化阿里遊戲
- 淺談JVM整體架構與調優引數JVM架構
- Cache 和 Buffer 有什麼區別?
- 手動釋放Linux上的Swap、Buffer和CacheLinux
- Library Cache最佳化篇(一)降低library cache lock和library cache pin的方法
- TiDB 查詢優化及調優系列(一)TiDB 優化器簡介TiDB優化
- Linux如何手動釋放Swap、Buffer和CacheLinux
- LOL射手改版細節調整 英雄與裝備將進行整體調整ID
- RMAN備份的最佳化和調整
- MySQL調優之索引優化MySql索引優化
- 批量調整視訊尺寸大小的方法,一鍵自動批量調整視訊
- Solon 統一的返回結果調整