天天看點

Oracle優化之I/O解析(五)

5 控制檔案相關的IO事件

這一類等待事件發生在對控制的IO事件時。對控制檔案的IO通路一般都是由Redo Log檔案切換、checkpoint等(如更新SCN)引起的。

5.1、control file parallel write

這一等待事件通常發生在一個服務程序在更新所有控制檔案時,通常是以下情況:

1)會話啟動了一個控制檔案事務(在送出事務之前更新所有控制檔案為最新);

2)會話送出了一個事務到控制檔案

3)一個控制檔案的條目被修改了,該修改要更新到所有控制檔案上去

考慮用以下手段來進行優化:

1)在保證控制檔案的備份數量足夠安全(不會出現控制檔案全部丢失)的情況下使控制檔案數量最少;

2)如果作業系統支援AIO,設定資料庫支援AIO;

3)将控制檔案轉移到IO負載比較低的磁盤上去。

5.2、control file sequential read

通常發生在對一個單獨的控制檔案的IO讀操作時,通常可能是以下情況:

1)備份一個控制檔案

2)RAC中在執行個體之前共享一個控制檔案資訊時;

3)讀取控制檔案的頭資料塊或者其他資料塊時。

用以下語句可以找到是通路哪個控制導緻的該等待事件:

select p1 as filename from v$session_wait

where event='control file sequetial read' and state='WAITING';

我們可以采取以下手段來降低這一等待:

1)如果作業系統支援AIO,設定資料庫支援AIO

2)将控制檔案轉移到IO負載比較低的磁盤上去。

5.3 control file single write

select p1 as filename from v$session_wait

where enent='control file single write' and state='WAITING';

優化手段同上;

5.4、RedoLog相關的IO事件

5.4、、log file parallel write

這一等待事件發生在LGWR程序等待完成将Redo記錄寫入Redo Log檔案時,在LGWR程序将Log Buffer中的資料寫入Log File時會發生該事件。

當使用了異步IO時,這種寫操作是并行的,否則隻會一個接着一個Redo檔案的寫入。LGWR程序必須等待所有的Redo log檔案都被寫入。因而redo log檔案所有在磁盤的IO效率就直接影響了該等待事件的總的等待時間。

降低log file parallel write等待的方法有:

1)不要使表空間長期處于熱備狀态。當表空間處于熱備狀态時,表空間不再被更新,redo log會急劇增加。

2)将Redo log檔案放在高速儲存設備上,千萬别放在RAID5上,可以考慮放在裸裝置上;

3)redo log檔案 的磁盤應盡量避免有其他IO操作的存在;

4)對某些操作,如大批量資料導入,可以設定nologging、unrecoverable選項,或者在sql語句中使用提示,以減少redo log的産生

5)在確定redo log資料足夠安全(不會發生Log檔案丢失)的情況下,盡量減少redo log 組的成員數;

6)在配置需要使用redo log功能時,如Streams複制、logminer、邏輯模式的DG,盡量設定為最低級别的補充日志(supplemental logging)

7)适當增加log_buffer的大小

我們可以按照以下方法來調整log_buffer的大小,比較redo log buffer配置設定的重試(在請求log buffer時,無足夠buffer,需要重新送出請求)率,如果該比例大于0.1%, 就需要考慮增加log_buffer的大小

select retries.value/entries.value "redo log buffer retry ratio"

from v$sysstat retries,v$sysstat entries

where retries.name='redo buffer allocation retries'

and entries.name='redo entries';

另外,如果系統統計資料中redo log space requests大于0,說明有程序在等待配置設定redo log檔案空間,而不是等待buffer空間。這時我們也需要考慮增加log_buffer的大小。

select name,value from v$sysstat where name='redo log space requests';

但是,log_buffer的大小不要超過128*CPU或者512K(取兩個數字中最大的一個)數。

5.2、log file sync

當oracle前台程序送出或者復原事務需要等待送出或復原完成時會産生該等待事件。部分等待的原因可能是等待LGWR程序将會話事務的redo記錄從log buffer中拷貝到磁盤上去。這時,就會出現前台程序等待log file sync,而背景lgwr程序帶等待log file parallel write的情況。

實際上,一個log file sync等待事件包涵了多個步驟:

1、如果lgwr空閑則喚醒lgwr程序

2、lgwr收集需要寫的redo記錄并送出IO請求

3、等待寫log的IO完成

4、LGWR IO送出處理

5、LGWR送出已經完成了寫日志的前台/使用者程序

6、前台/使用者程序被喚醒

我們采取以下調優手段來降低log file sync等待:

1)減少redo log的産生、提供redo log的IO效率、減少redo log與其他IO的沖突

2)将一些小事務合并成批量事務,以減少送出和復原次數

5.3、log file single write &&  log file sequential read

log file single writ隻會發生在打開或關閉一個redo log檔案後,向檔案頭寫入相關資訊時,因為檔案頭的資訊中包含了檔案号,是以檔案頭資訊不會并行寫入多個檔案,而是單獨一個個寫入,因而其等待時間不會被統計到log file parallel write之中。

5.4、log file switch completion && switch logfile command && log file switch (clearding log file)

alter system switch logfile;

日志切換由以下步驟組成:

1)從控制檔案擷取下一日志檔案的檔案号;

2)擷取redo copy和redo allocation的latch

3)清空redo,将buffer中的redo記錄寫入log檔案中去

4)關閉目前redo log檔案

5)更新控制檔案,包括:

a)設定下一日志檔案為目前日志檔案

b)設定之前的日志檔案為INACTIVE

c)如果在Archive模式下,将之前檔案加到歸檔檔案列中

d)打開新的日志檔案 組中的所有檔案

e)将scn寫入檔案頭

f)打開允許産生redo log的開關

一般來說,在系統運作高峰期以20~30分鐘切換一次為佳),通過以下語句可以查詢日志的切換記錄及其切換間隔時間:

select to_char(b.first_time,'YYYY-MM-DD HH24:MI:SS') as swtich_time,

(b.first_time - a.first_time) *24 as "switch_interval(hr)"

from v$log_history a,v$log_history b

where a.sequence# +1  = b.sequence#

and rownum <=10

order by 1;

5.5、log file switch(checkpoint incomplete)

當在做日志切換時,同時會做Checkpoint,如果此時有其他Checkpoint正在進行時,需要等待正在進行的Checkpoint完成,此時就會産生log file switch(Checkpoint incomplete)等待事件。

通過以下方法來進行調優:

1)增加redo log檔案的大小,使日志切換頻率降低

2)增大參數log_checkpoint_interval大小,該參數設定系統兩次Checkpoint之間redo log資料塊(該資料塊的大小由作業系統的資料塊大小決定)的數量。

但是oracle會限制這些資料塊總的大小要小于最小log檔案的90%,如最小log檔案為100M,作業系統的資料塊大小為512K,則log_checkpoint_interval要小于(100*90%/0.5)=180

5.6、log switch/archive && log file switch(archiving needed)

log switch/archive等待事件在會話等待所有archive 線程對目前log檔案archive操作完成。當LGWR進行切換日志時,如果要切入的日志還沒有被archive,需要等待其被完成archive,這時會産生log file switch(archive needed)等待事件,這時在ALERT log中我們還能發現以下資訊:

thred 1 connot allocate new log,sequence 9556

all online logs needed archiving

這兩個事件隻有資料庫在Archive模式下才會出現。說明Archive操作太慢。

對這兩個事件的調優主要是針對Archive設定的調優。

要跳高Archie的效率,可以采取以下方法:

1)調整redo log檔案的個數和大小

2)調整Checkpoint的間隔和效率

3)配置多arch程序

通過參數log_archive_max_processes可以配置最大arch程序數量。我們可以做一個腳本來執行“alert system archive log all;'指令,然後設定一個作業以固定間隔時間來執行該腳本。

這個指令可以強制歸檔所有未歸檔的日志檔案,這可以幫助均衡arch程序的歸檔 處理負擔。

4)增加Archive程序

增加Archive程序的buffer大小可以提高Archive效率,其大小是由參數log_archive_buffer_size控制的。該參數的初始設定為4k,最大可以增加到128k,但是,要注意,增加該參數雖然可以提供Archive效率,但是可能會使系統的整體性能下降;

另外,我們還可以通過增加Archive程序的buffer數量唉提高Archive效率。buffer數量由參數log_archive_buffer控制,最大為8

5)減少系統的IO沖突、提供系統IO效率

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29677883/viewspace-1170214/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/29677883/viewspace-1170214/