如何診斷Oracle Redo Log引發(fā)的性能問題
在能夠影響Oracle性 能的諸多因素中,Redo Log相關的因素從某種程度上可以說是最為重要同時也是最值得關注的。因為在一個OLTP系統(tǒng)中Oracle通過各種技術以及優(yōu)良的設計,盡量做到將大部 分操作在內(nèi)存中完成,以便最大程度的提升性能。因此在Oracle的諸多后臺進程以及用戶進程的大部分操作都是內(nèi)存操作,而且這些操作會通過延遲寫入技術 盡可能的將磁盤I/O操作滯后。但是在這些操作中卻有某些例外,其中最明顯的就是針對Redo Log的操作。
在Oracle中針對Redo Log的操作主要由LGWR進程完成,這個進程可以說是Oracle所有后臺進程中最繁忙的進程,而且這個進程可能要頻繁的進行I/O操作,這是因為Oracle出于數(shù)據(jù)安全的考慮必須保證聯(lián)機在線重做日志可 靠的寫入日志文件,以便在發(fā)生崩潰時能夠有效恢復數(shù)據(jù),而真正的數(shù)據(jù)可能會等一些時間延遲寫入數(shù)據(jù)文件。這種特點在Oracle的各個后臺進程中顯得有些 獨樹一幟。另外LGWR全局唯一,即一個實例只能有一個活動的LGWR進程,由于要進行頻繁的I/O操作可想而知是很容易造成LGWR進程競爭的。由于 LGWR在Oracle實例結構設計中的特殊地位,一旦出現(xiàn)LGWR性能瓶頸,那么對整個系統(tǒng)的性能影響將會是極為嚴重的,同時對數(shù)據(jù)安全也是一個潛在的 威脅。
因此作為Oracle日常的數(shù)據(jù)庫管 理,我們要給與這部分相當?shù)年P注,盡早發(fā)現(xiàn)問題,盡早作出調(diào)整。調(diào)整的目標就是要做到Log_Buffer大小適中(不要過大,也不能太小),要滿足用戶 進程的使用需要,每當系統(tǒng)負載有一個明顯的增加時,就應該考慮調(diào)整它的大小。比如因為業(yè)務拓展當前系統(tǒng)固定用戶數(shù)量從1萬人猛增到3萬人,那么就應該對 Log_Buffer大小給與關注。另外就是要做到日志文件的大小適中,日志組的日志文件數(shù)量合適,不能影響LGWR寫日志文件的性能,不能造成日志文件 間的寫入競爭,不能在日志切換歸檔發(fā)生時引發(fā)磁盤競爭等等。
二、監(jiān)控與問題排查:
在進行Redo Log問題監(jiān)控時,主要關注兩個方面:日志緩沖區(qū)空間使用的等待情況和日志緩沖區(qū)數(shù)據(jù)槽的分配情況。通過這兩方面的監(jiān)控并配合一些問題排查手段,通??梢园l(fā)現(xiàn)大量問題。
(1)日志緩沖區(qū)空間使用的等待情況:
可以通過查詢v$session_wait來監(jiān)控日志緩沖區(qū)空間使用的等待情況,通過如下SQL語句進行查詢:
select sid,event,seconds_in_wait,state from v$session_wait where event='log buffer space%'; |
以上的查詢中可以通過觀察seconds_in_wait的數(shù)值來分析問題,這個數(shù)值可以顯示如下問題:日志切換緩慢引發(fā)的等待、LGWR寫入緩慢引發(fā)的等待、日志文件寫入引起的磁盤競爭引發(fā)的等待。
這些等待的發(fā)生可能是由于如下問題引起的:
1、日志文件寫入時存在磁盤競爭:
這種情況多見于日志切換發(fā)生時,由于日志文件組的規(guī)劃不當,或者存放日志文件的磁盤寫入速度緩慢,或者是因為磁盤RADI類型不當都會引發(fā)這個問題,如果懷疑村在這些情況,可以通過如下語句進行監(jiān)控:
select event,total_waits,time_waited,average_wait from v$system_event where event like 'log file switch completion%'; |
可以通過觀察total_waits,time_waited,average_wait數(shù)值來分析問題,如果這些值過高(注意何謂“過高”,不同系統(tǒng)考量標準不一樣,要具體分析),那么說明存在以上問題。此時可以通過如下措施解決:
● 將同一日志文件組的各個成員分配到不同的磁盤上,進而減少日志寫入以及日志切換和日志歸檔時引發(fā)的競爭;
● 將日志文件盡可能存放在快速的磁盤上;
● 要合理選擇RADI類型對磁盤進行條帶化,通常不要選擇RADI5來作為日志文件磁盤的RADI類型,通常推薦使用RADI10;
● 可以增加REDO LOG文件大小,來延緩日志切換,下面是一個增加日志文件大小的方法;
假如原來有3個小的redo log file,下面是UNIX環(huán)境下的一個例子:
第一步:往數(shù)據(jù)庫添加三個大的redo logfile
SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 4 SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 5 SVRMGRL>ALTER DATABASE ADD LOGFILE GROUP 6 |
第二步: 手工地做log switch,使新建的redo logfile起作用
SVRMGRL>alter system switch logfile; |
此操作可以執(zhí)行一到幾次,使舊的redo logfile成invalid狀態(tài)。
第三步:刪除原來舊的redo logfile
SVRMGRL>alter database drop logfile group 1; SVRMGRL>alter database drop logfile group 2; SVRMGRL>alter database drop logfile group 3; |
2、檢查點發(fā)生時DBWR進程沒有完成數(shù)據(jù)寫入引發(fā)等待:
當日志文件完成一個循環(huán)周期后再一次來到原來某個日志文件準備進行重新使用時,發(fā)現(xiàn)該日文件對應的數(shù)據(jù)還沒有寫入相應的數(shù)據(jù)文件中,此時LGWR必須等待DBWR完成寫入,從而引發(fā)等待。
如果懷疑存在這個問題可以通過如下查詢來進行監(jiān)控:
select event,total_waits,time_waited,average_wait from v$system_event where event like 'log file switch (check%'; |
通過total_waits,time_waited,average_wait這些數(shù)值的大小來判斷分析問題,如果還不能確定,那么可以查看 一下Oracle的alert.log文件看一下相關時間內(nèi)是否存在“checkpoint not complete”。如果存在那么證明日志文件的操作性能被DBWR進程所拖累。此時可以通過如下措施解決:
● 檢查存放數(shù)據(jù)文件的磁盤是否存在I/O瓶頸(如:是否存在讀寫競爭、是否存在物理損壞、是否存在RADI類型不符等);
● 合理規(guī)劃調(diào)整日志文件組日志文件的數(shù)量和大??;
● 合理設置FAST_START_MTTR_TARGET參數(shù),以便設置一個合適的數(shù)值來控制檢查點的發(fā)生;
● 可以考慮增加DBWR進程的數(shù)量,Oracle最多可以有10個DBWR進程;
● 如果條件允許,可以開啟異步I/O;
3、由于日志歸檔引發(fā)的等待:
當歸檔發(fā)生時,歸檔日志進程不能快速的進行日志歸檔,從而導致了LGWR的等待。如果懷由此問題可以通過如下語句來監(jiān)控:
select event,total_waits,time_waited,average_wait from v$system_event where event like 'log file switch (arch%'; |
同樣通過total_waits,time_waited,average_wait這些數(shù)值來進行問題分析,如果出現(xiàn)由于歸檔日志寫入緩慢引發(fā)的性能問題,可以采用如下辦法:
● 確定存放歸檔日志的磁盤空間沒有被寫滿,如果出現(xiàn)這種情況,那么要對歸檔日志進行有限度的刪除,或者將這些歸檔日志移走如存放到磁帶庫上,或者分配更大的存儲空間;
● 增加日志文件組,從而為歸檔多留出一些時間;
● 增加多個歸檔進程,Oracle最多允許10個歸檔進程存在,在歸檔發(fā)生時如果LGWR進程發(fā)現(xiàn)歸檔進程ARCH出現(xiàn)不足時,會自動產(chǎn)生新的歸檔進程,因 此如果系統(tǒng)負載有明顯增加預先分配足夠的歸檔進程可以提高性能,可以使用alter system命令通過更改LOG_ARCHIVE_MAX_PROCESSES參數(shù)來改變歸檔進程數(shù)目;
(2)日志緩沖區(qū)數(shù)據(jù)槽的分配情況引發(fā)的等待:
可以通過如下的語句來監(jiān)控日志緩沖區(qū)數(shù)據(jù)槽的分配情況的百分比:
select r.value "retries",e.value "entries",r.value/e.value*100 "percentage" from v$sysstat t,v$sysstat e where r.name='redo buffer allocation retries' and e.name='redo entries'; |
這個百分比值不能高于1%,如果這個數(shù)值頻繁增長,那么一定出現(xiàn)了Log_Buffer內(nèi)存空間不足,從而使得新產(chǎn)生的redo log entries不能寫入Log_Buffer中從而造成等待,這個等待是由于LGWR性能不佳寫日志文件過慢造成的,通常來說LGWR寫入速度都是非???速的可以保證新產(chǎn)生的redo log entries內(nèi)存空間使用的需要,即使在高負載情況下也不會出現(xiàn)太大問題,因而上面的問題通常發(fā)生機率較小,但是如果一旦發(fā)生,那么很有可能是由于日志 文件磁盤I/O規(guī)劃出現(xiàn)問題,或者日志文件磁盤出現(xiàn)物理損壞,因此在出現(xiàn)這種情況引發(fā)的性能問題時,主要應該進行日志文件磁盤I/O規(guī)劃以及日志文件磁盤 是否出現(xiàn)物理損傷方面的排查,同時也可能綜合應用如Oracle的alert.log等相關文件進行綜合分析。
posted on 2012-05-11 09:49 順其自然EVO 閱讀(1307) 評論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫