log buffer及日誌管理深入分析及效能調整(五)
的最佳化
我們一般不太會關注日誌緩衝區的最佳化。這是因為日誌緩衝區的爭用一般不會是的主要效能問題。前面我們已經知道,日誌塊的都是按照順序往裡寫,不存在更新日誌塊的以前的內容,同時每個日誌塊大小都很小,所以幾乎不會有多個程式搶同一個日誌塊的情況。其爭用主要是程式由於找不到可用的日誌塊而必須等待的情況。而我們知道LGWR負責釋放髒的日誌塊從而提供可用日誌塊,LGWR在日誌緩衝區中的髒日誌塊超過1M或者超過日誌緩衝區的1/3時就會啟動,而且在將重做記錄寫入聯機日誌檔案時,都是按照順序寫入,不存在類似DBWR的隨機寫入,所以寫入的速度是非常快的,除非硬碟的I/O速度有很大的問題。可以執行下面的語句來判斷硬碟的I/O是否過慢。
SQL > select total_waits,time_waited,average_wait,time_waited/total_waits as avg
2 from v$system_event where event = 'log file parallel write';
TOTAL_WAITS TIME_WAITED AVERAGE_WAIT AVG
----------- ----------- ------------ ----------
314346633 129581305 0 .41222425
我們可以看到,AVERAGE_WAIT表示LGWR完成一次寫入平均需要多少時間,是用等待時間除以等待次數得出的、並四捨五入以後得到的平均值(AVG是沒有四捨五入以後的值)。如果AVERAGE_WAIT大於1,就表示硬碟的I/O比較慢。
不過,對於整個資料庫的健康檢查來說,還是需要衡量一下資料庫的日誌緩衝區是否存在健康隱患。所以也還是需要了解一些有關日誌緩衝區效能的一些指標。
的統計資訊
有關log buffer的統計資訊,我們都可以從v$sysstat裡找到。我們可以執行一個DML語句,然後比較前後的統計資訊,看看都發生了哪些變化。
SQL> select name,value from v$sysstat where name like '%redo%' order by name;
NAME VALUE
---------------------------------------------------------------- ----------
redo blocks read for recovery 110
redo blocks written 13617
redo buffer allocation retries 0
redo entries 16868
redo log space requests 0
redo log space wait time 0
redo log switch interrupts 0
redo ordering marks 1
redo size 6228264
redo subscn max counts 0
redo synch time 207
redo synch writes 2475
redo wastage 519976
redo write time 1105
redo writer latching time 0
redo writes 1991
SQL> update redo_test set name='cdf' where id=1;
SQL> commit;
SQL> select name,value from v$sysstat where name like '%redo%' order by name;
NAME VALUE
---------------------------------------------------------------- ----------
redo blocks read for recovery 110
redo blocks written 13619
redo buffer allocation retries 0
redo entries 16869
redo log space requests 0
redo log space wait time 0
redo log switch interrupts 0
redo ordering marks 1
redo size 6228856
redo subscn max counts 0
redo synch time 207
redo synch writes 2476
redo wastage 520376
redo write time 1105
redo writer latching time 0
redo writes 1992
我們可以看到有些統計資訊發生了變化,而有些則沒有。這些統計資訊都是累計值,自從例項啟動以
來就一直累加而產生的。我們依次解釋一些重要的統計資訊。
<!--[if !supportLists]-->1) <!--[endif]-->redo writes、redo blocks written、redo write time:這三個統計資訊是主要的統計資訊,在LGWR寫完重做記錄以後更新,而且只能由LGWR負責更新。redo writes表示寫了多少次,我們可以看到上例中寫了1次(1992-1991);redo blocks written表示總共寫了多少日誌塊,可以看到寫了2個日誌塊(13619-13617),由此我們可以知道平均寫一次可以寫2個日誌塊。redo write time表示將重做記錄寫入日誌檔案花了多少時間,單位是10個毫秒,我們可以看到為了寫這2個日誌塊所需要的時間都幾乎為0(1105-1105)。
<!--[if !supportLists]-->2) <!--[endif]-->redo size、redo entries:這兩個統計資訊是在重做記錄複製到日誌緩衝區之前更新的。它們都表示產生了多少量的重做記錄,redo size以位元組為單位,而redo entries以個數為單位。比如,上例中產生了592(6228856-6228264)個位元組的重做記錄,共1(16869-16868)個重做記錄,平均每個重做記錄為592個位元組。
<!--[if !supportLists]-->3) <!--[endif]-->redo wastage:該記錄表示當日志緩衝區的日誌塊被寫入日誌檔案時,日誌塊中沒有被利用的空間數量,以位元組為單位。因為當把重做記錄複製到日誌緩衝區中的日誌塊時,需要格式化日誌塊以後才能實際存放日誌資訊,這樣就會“浪費”一些日誌緩衝區空間。上例中,我們可以看到為了格式化日誌塊而浪費了大約400(520376-519976)個位元組的空間。
注意:上例中,我們寫了2個日誌塊(redo blocks written)。我們知道一個日誌塊的大小是512個位元組,那麼兩個日誌塊的應該佔用1024個位元組。但是實際重做記錄只佔了592個位元組(redo size)。其中,為了格式化日誌塊而“浪費”了400個位元組(redo wastage)。同時每個日誌塊頭需要16個位元組,兩個日誌塊就是32個位元組。那麼我們有:592+400+32=1024。這正是兩個日誌塊的容量。由此我們可以推匯出這樣的公式:“redo blocks written”דredo block size”=16דredo blocks written”+“redo size”+“redo wastage”
由此我們可以看出,為了更新3個位元組('cdf'),需要消耗1024個位元組的日誌檔案的空間。看來oracle在記錄日誌方面,確實是比較消耗磁碟空間的。所以對於更新頻繁的系統而言,產生的日誌量會非常大。
<!--[if !supportLists]-->4) <!--[endif]-->redo log space requests、redo log space wait time:redo log space requests表示對聯機日誌檔案空間請求的次數,redo log space wait time表示在發出請求空間以後的等待時間。這兩個統計資訊只有在前臺程式請求聯機日誌檔案空間未果的情況下才會增加,這時前臺程式等待日誌切換完成。在沒有人為的發出alter system switch logfile命令的前提下,redo log space requests就表示日誌切換的總次數。
<!--[if !supportLists]-->5) <!--[endif]-->redo buffer allocation retries:表示再次嘗試在日誌緩衝區中分配可用空間的次數。當程式第一次沒能在日誌緩衝區中獲得可用空間時,該程式必須等待LGWR重新整理日誌緩衝區或者等待日誌切換完成等,然後會再次嘗試獲取空間。理想情況下,該統計資訊應該為0。
注意:這裡我們可以獲得在複製到日誌塊時必須等待的重做記錄的數量所佔的比例,計算公式為:redo buffer allocation retries / redo entries。該比例應該接近於0,不應大於1%。如果這個值不斷變大則說明伺服器程式在獲得日誌塊之前必須等待,這時應該增加日誌緩衝區,或者提高LGWR寫的效率,也就是提高硬碟物理I/O的速度。
<!--[if !supportLists]-->6) <!--[endif]-->redo synch writes,redo synch time:這兩個統計資訊是在使用者每次提交(commit)時增加。redo synch writes表示由於提交而重新整理日誌緩衝區的次數,而redo synch time表示由於提交而重新整理日誌緩衝區所花的時間,以10個微妙為單位。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/751371/viewspace-567587/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- log buffer及日誌管理深入分析及效能調整(一)
- log buffer及日誌管理深入分析及效能調整(七)
- log buffer及日誌管理深入分析及效能調整(六)
- log buffer及日誌管理深入分析及效能調整(三)
- buffer cache深度分析及效能調整(五)
- PGA自動管理原理深入分析及效能調整(五)
- PGA自動管理原理深入分析及效能調整(六)
- PGA自動管理原理深入分析及效能調整(一)
- (轉)PGA自動管理原理深入分析及效能調整
- buffer cache深度分析及效能調整(六)
- buffer cache深度分析及效能調整(四)
- Shared pool深入分析及效能調整
- Shared pool深入分析及效能調整(一)
- Shared pool深入分析及效能調整(二)
- oracle效能調優:管理oracle日誌之調整線上日誌檔案Oracle
- Oracle調整redo log日誌大小Oracle
- 【效能調整】等待事件(五)log相關等待事件
- Nginx 日誌分析及效能排查Nginx
- log buffer(日誌緩衝區)
- Layui+larave-log-view日誌頁面調整UIView
- 【Logback日誌級別】動態調整Logback的日誌級別
- 管理oracle日誌之調整檢查點Oracle
- log4j日誌列印級別動態調整
- oracle線上調整重做日誌Oracle
- Oracle重做日誌調整技巧Oracle
- solaris記憶體引數調整及管理記憶體
- 一起分析Nginx 日誌及效能排查Nginx
- PostgreSQL的xlog/Wal歸檔及日誌清理SQL
- Mysql之binlog日誌說明及利用binlog日誌恢復資料操作記錄MySql
- Monolog 優化及打造 ELK 友好的日誌格式Mono優化
- RMAN delete archivelog命令刪除歸檔日誌及歸檔日誌拷貝deleteHive
- Linux日誌檔案系統及效能分析(轉)Linux
- Ngnix 日誌管理及 Shell 實現定時完成日誌切割
- 線上修改REDO LOG的大小及增加新的日誌組
- mysql binlog日誌自動清理及手動刪除MySql
- 讀書筆記-高階owi與oracle效能調整-cache buffer筆記Oracle
- Oracle效能調整之--DML語句效能調整Oracle
- 日誌管理工具logrotatelogrotate