2015年6月30日 星期二

[Oracle優化]CPU使用率突然飆高了!

        某天管理的Oracle,它的CPU使用率突然飆高了一倍,平常使用率很低的,所以飆高了一倍還好。對一個穩定的系統來講,CCU沒有多一倍,CPU卻飆高一倍是很奇怪的,而且接下公司有辦活動,要是CCU暴增就不敢保證不會有問題了,所以要想辦法找出什麼原因造成CPU飆高

        首先看飆高當天的AWR,下圖是Top 5 Timed Foreground Events,第一名的DB CPU約佔73%,第二名的library cache: mutex X只佔10%左右,這還算正常


        接著看Time Model Statistics也還好


        看SQL Statistics想找出Bad Query也看不出什,因為系統是穩定的,只是CPU突然升高了一倍,所以關鍵在找出差異,做個與baseline的比較,應該可以發現問題,所以我用了AWRDRPT比較兩份AWR囉

        一份是CPU飆高前一天某時段的AWR
        一份是CPU飆高當天同一時段的AWR

        下圖開始是AWRDRPT的內容,其中Load Profile看到DB time增加1倍;Logical reads增加6倍;Hard parses增加15倍,從這幾個差異感覺很像沒有用綁定變量的Bad Query造成的


        在Top Timed Events中,看到library cache: mutex X從五名之外進到第二名了,這也是跟硬解析有關


        Time Model Statistics看到的也是差不多


        Wait Events看到大量增加的Concurrency事件,也都是與硬解析有相關
  • library cache: mutex X
  • latch: shared pool
  • cursor: pin S
  • latch: row cache objects


        看到這,合理懷疑就是有BAD Query造成的,所以接著就看SQL Statistics有沒有奇怪的Query囉,在Top SQL的比較這邊,下圖就有看出之前沒出現過的Query



        這裡也有看到


        這邊也是


        幾乎可以猜測出就是那些COUNT的Query造成的

        我們再看一下ASH
        
        Top SQL using literals也指出這些沒有使用綁定變量的SQL



        既然已經找到可疑SQL了,看一下SQL內容,接著分析追蹤一下這些SQL的執行計畫與統計值,發現有兩個問題
  • 前端沒有用綁定變量的寫法,會造成硬解析
  • 沒有合適的索引,造成超高的consistent gets
        怎麼解決也很簡單
        基本上調整完後,CPU使用率就往下掉了 ,如下圖的藍線,紅線是未優化的前一天,黃線是基準值,可以看出變化吧





0 意見:

張貼留言