1、redo log buffer:
當(dāng)時(shí)常遇到較大的事務(wù)時(shí),增大log buffer可以減少不必要的log file I/O操作。commit操作將會(huì)flush log buffer,頻繁的commit可以考慮較小的buffer size。log_buffer最小為64K。
①對(duì)redo log buffer的診斷:
** 查看動(dòng)態(tài)視圖:v$session_wait查看當(dāng)前是否正有對(duì)log buffer的請(qǐng)求等待。
select sid, event, seconds_in_wait, state from v$session_wait where event = ‘log buffer space%’;
** 計(jì)算redo buffer allocation的重試的出現(xiàn)概率,此值應(yīng)該盡量接近0,不應(yīng)該大于1%,如果該值不斷增加,說(shuō)明大量對(duì)redo log buffer的等待。
select name, value from v$sysstat where name = ‘redo buffer allocation retries’; –顯示了user 進(jìn)程等待log buffer中的space所重試的次數(shù)。
select name, value from v$sysstat where name = ‘redo log space requests’;
引起等待的原因可能是由于log buffer過(guò)小,或是checkpoint,或是log switching所致。
對(duì)此,可以嘗試:增大log_buffer的值;或是改善checkpoint或歸檔進(jìn)程。
** SECONDS_IN_WAIT值顯示的是除了由于log swith以外造成的log buffer等待的時(shí)間。它表明redo buffer被寫(xiě)滿的速度要大于LGWR寫(xiě)logfile的速度。也可能反映在redo logfile上的I/O存在沖突。
如果懷疑是LGWR的問(wèn)題,可以繼續(xù)查看:
@@ 是否存在I/O沖突,是否redo log file存放在分開(kāi)的快速存儲(chǔ)設(shè)備上。
@@ 查看日志切換的次數(shù),考慮是否是切換太頻繁,是否需要增大log file 的size。
select event, total_waits, time_waited, average_wait from v$system_event where event like ‘log file switch completion%’;
@@ 如果DBWn在尚未完成checkpointing file時(shí),LGWR在此需要相應(yīng)的文件時(shí),會(huì)引起LGWR的等待。對(duì)此可以從alert.log文件中查看到相關(guān)信息。查看當(dāng)前是否有未完成的checkpoint事件:
select event, total_waits, time_waited, average_wait from v$system_event where event like ‘log file switch (check%’;
查看參數(shù)LOG_CHECKPOINT_INTERVAL和LOG_CHECKPOINT_TIMEOUT是否恰當(dāng);并查看redo log file的size和group數(shù)。
@@ 如果歸檔進(jìn)程不能及時(shí)的將redo logfile,也可能會(huì)引起LGWR的寫(xiě)入等待。
對(duì)此,先確認(rèn)歸檔目錄沒(méi)有滿,適當(dāng)增加redo log 的groups。下面的SQL顯示了由于歸檔問(wèn)題引起的log file switch等待統(tǒng)計(jì)。
select event, total_waits, time_waited, average_wait from v$system_evnet where event like ‘log file switch (arch%’;
可以適當(dāng)增大參數(shù)LOG_ARCHIVE_MAX_PROCESSES從而在大負(fù)荷量時(shí)增多歸檔進(jìn)程。
@@ 如果將DB_BLOCK_CHECKSUM設(shè)置為true,會(huì)因此增加性能上的開(kāi)支。
此外,盡可能減少redo的操作:
** 直接路徑的loading在非歸檔模式下,是不記錄redo log的
** 在歸檔模式下,直接路徑的loading可以使用nologging mode
** 直接insert也可使用nologging mode
** 部分sql可以使用nologging mode
但要明確,即使對(duì)table、index、tablespace使用nologging模式,但對(duì)于部分操作仍然會(huì)產(chǎn)生redo log。如create table … as select; create index … ; alter index … rebuild;
此外,nologging屬性對(duì)update, delete, 常規(guī)路徑的insert和各種DDL語(yǔ)句是不會(huì)起作用的。(這里貌似對(duì)insert添加hint也可以使其nologging)
2、監(jiān)控Java池內(nèi)存:select * from v$sgastat where pool = ‘java pool’;
1)用于限制Java session占用的內(nèi)存的初始參數(shù):
①JAVA_SOFT_SESSIONSPACE_LIMIT:當(dāng)user session的java命令占用的內(nèi)存超過(guò)該設(shè)置,將會(huì)發(fā)出warning,在跟蹤文件做一定的記錄,默認(rèn)為1M。
②JAVA_MAX_SESSIONSPACE_SIZE:當(dāng)user session的java命令占用內(nèi)存超過(guò)該值,該session將被kill掉,默認(rèn)為4G。
2)為Java Sizing SGA
①每裝載一個(gè)class,java引擎會(huì)使用8KB shared pool的內(nèi)存,當(dāng)裝載并處理大的jar files時(shí),可占用50MBshared pool的內(nèi)存。
②java pool是SGA中的一個(gè)組成部分,用于所有存在java code或是在EJE中存在數(shù)據(jù)的session中。instance startup時(shí),會(huì)分配JAVA_POOL_SIZE指定大小的內(nèi)存。一般會(huì)設(shè)置為50MB左右,默認(rèn)是20MB。
3、multiple I/O slave:
4、multiple DBWR 進(jìn)程
1) 多DBWn進(jìn)程可以使用DB_WRITER_PROCESSES參數(shù)控制。它對(duì)于多cpu的SMP系統(tǒng)較有效。但是multiple DBWR與multiple I/O slave是不能同時(shí)使用的。
2)對(duì)其的調(diào)節(jié):
select event, total_waits, time_waited from v$system_event where event=’free buffer waits’;
如果發(fā)現(xiàn)上述的SQL的total_waits是較大,可以考慮將增加DBWn進(jìn)程的數(shù)量。