首先看飆高當天的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造成的
- library cache: mutex X
- latch: shared pool
- cursor: pin S
- latch: row cache objects
Top SQL using literals也指出這些沒有使用綁定變量的SQL
既然已經找到可疑SQL了,看一下SQL內容,接著分析追蹤一下這些SQL的執行計畫與統計值,發現有兩個問題
- 前端沒有用綁定變量的寫法,會造成硬解析
- 沒有合適的索引,造成超高的consistent gets
- 請開發人員改寫成綁定變量的寫法,The DeployPHP Series, Part 1: Optimizing PHP and Oracle有介紹
- 建立上適合的索引
0 意見:
張貼留言