當運行數據庫的系統資源壓力比較大的時候,,系統資源利用率比較告,通過# sar 1 5觀察系統wio比較高,或者CPU idle利用率比較低,cpu比較忙;或者還會有內存使用率比較高,並且不斷的上升; 原因是可能有一些進程佔用了大量的cpu或者mem資源,長時間不能釋放,累積佔用資源比較高,可以如下進行檢查系統情況: 查看系統中使用mem資源比較多的進程:
#ps -elf|awk '$10 >16000 {print }'| sort –rnk 10 |
可以找出分別佔用cpu和mem最多的進程,如果是oracle的進程,其中有LOCAL=NO是我們需要關注的oracle進程,可以通過如下語句查看具體執行的是什麼語句:先要知道進程的pid號;
得到進程的sid號: select id,serial# ,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') logon from v$session where paddr in ( select addr from v$process where spid in('&pid')); 得到session的sqltext語句:
select sql_text from v$sqltext_with_newlines where hash_value in (select SQL_HASH_VALUE from v$session where paddr in (select addr from v$process where spid= '&pid')) order by piece; |
SELECT /*+ ORDERED */ sql_text FROM v$sqltext a WHERE (a.hash_value, a.address) IN ( SELECT DECODE (sql_hash_value, 0, prev_hash_value, sql_hash_value ), DECODE (sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '&pid')) ORDER BY piece ASC / |
然後可以分析這些sql語句,看是否是語句本身的問題,並可以通過考慮是否需要將這些語句給kill掉;
以上的內容主要是針對緊急處理的情況,暫時強行將使用cpu較高的進程給kill掉,以保證業務的正常運行;如果要了解深入的原因,可以將當時運行的語句提出出來,做進一步的分析,查看語句是否合理等等。 | |