awr效能問題排查第一篇
對於awr,裡面涵蓋的內容比較雜,有時候看報告的時候總是不知道該怎麼下手。時間長了,可能會有一些閱讀習慣或者心得。今天在看大師chris lawson的一篇博文對於awr的一些心得(),還是蠻有收穫,趕緊按照這個方子來細細品味一番。
首先是檢視等待事件,這個也是老規矩。
不過先把db time先附上,更有針對性。
這是一個10分鐘的awr報告,基於Linux平臺,11gR2 64位。
-->檢視sequential read指標
這個指標很實用,可以在不同的平臺間進行比較,但是scattered read這種指標就不好比較了。
延遲一般需要在10ms以下,或者至少100 reads/sec,在基於SAN儲存快取資料的情況下,sequential read的指標有時候會保持在2ms左右,這個只能說明SAN已經把資料轉化為快取了,倒不能說明硬碟驅動確實很快。
上面的awr可以看到平均的延遲是在1ms以內,算是正常。
-->檢視top elapsed time sql
這個時候可以根據elapsed time得到一個sql執行情況的概覽。檢視這個的主要目的就是得到執行時間較長的sql語句。按照10分鐘對的一個頻度,executions為0的sql都需要格外注意,同時兼顧所佔的比例。
標黃的部分就是參考的依據,可以根據elapsed time和executions來做一個評估。
-->檢視db time
這個部分可以根據time model的部分得到。這個部分能夠得到一個大體的比例,看看db time都主要耗在哪些方面了。
-->檢視硬碟讀的消耗部分
透過這個部分可以得到哪些sql正在進行大量的硬碟讀,透過sql order by reads來得到。
經過分析
sql(gbqz84d1jggdq)佔用了22%的硬碟讀,比例是很高的,檢視sql語句發現走的是一個全表掃描,表是億級的大表。
sql(00jrngwmz2vxx)使用union的地方存在問題,導致了全表掃描,細節可以參考http://blog.itpub.net/23718752/viewspace-1209397/ 已經做了完整的調優解釋。
sql(4gz51fphuarsw,6fu3z8pqd2y9g)是產品線的兩個通用sql,已經做了最佳化,其中有個大表做了全表掃描加並行,相對了最快的方式了。
sql(98dyqu3xsgyf5)是一個簡單的select 查詢,但是也走了全表掃描,經過排查發現這個大表竟然在最開始規劃的時候丟掉了索引,所以這個問題也是一個比較糾結的錯誤。需要協調解決。
-->檢視logical reads
這個部分可以排查出那些執行效率低下的sql語句。
檢視以下的幾個sql,
sql(7yp93zzstn5gh)消耗了大量的邏輯讀,經過檢視,這個sql語句沒有問題,但是表級存在著大量的碎片,一個分割槽表只有幾十條資料,但是blocks卻有幾十萬。
sql(1hg2wcuapy3y3)檢視執行計劃時,發現執行計劃的消耗太高。cost達到近 273K,這條sql語句還是需要好好排查一番。
-->檢視commit頻率
這個部分可以檢視是否日誌切換較為頻繁,或者在進行著大量的事物處理,可以看看使用者進行commit的頻度
-->檢視系統負載
這個部分可以檢視系統級的一些指標,如果時間較長,就有多行的資料可以參考。總體來看iowait的比例不高。
-->檢視熱物件
可以透過segments by logical reads來得到一些比較熱的物件,可能是表,或者索引。
如果比例很高,可以透過這些熱物件從sql列表中排查一下,到底是哪些sql語句和這個熱物件相關。可能sql語句單獨執行很快,多個併發的程式時速度就會受到影響了。
-->檢視物理讀最高的物件
這個部分可以透過如下的方式查詢。排查表FILES_CONTROL的時候,發現sql列表中的一個對應的sql語句走了全表掃描,這個表本來資料量就有好幾百萬,走全表掃描還是可以完全避免的。
透過如上的方式也確實能夠發現不少的問題。也需要互相的印證。畢竟資料是表象,能夠結合實際的情況進行調優,從業務上,系統級調優,自己也能一定程度上解放自己。
首先是檢視等待事件,這個也是老規矩。
不過先把db time先附上,更有針對性。
這是一個10分鐘的awr報告,基於Linux平臺,11gR2 64位。
Snap Id | Snap Time | Sessions | Cursors/Session | |
---|---|---|---|---|
Begin Snap: | 17148 | 31-Oct-14 13:20:02 | 3397 | 5.6 |
End Snap: | 17149 | 31-Oct-14 13:30:03 | 3471 | 5.7 |
Elapsed: | 10.01 (mins) | |||
DB Time: | 262.49 (mins) |
Top 5 Timed Foreground Events
Event | Waits | Time(s) | Avg wait (ms) | % DB time | Wait Class |
---|---|---|---|---|---|
db file sequential read | 7,138,268 | 9,948 | 1 | 63.16 | User I/O |
DB CPU | 4,405 | 27.97 | |||
direct path read | 104,507 | 903 | 9 | 5.73 | User I/O |
db file parallel read | 103,319 | 336 | 3 | 2.13 | User I/O |
log file sync | 49,187 | 282 | 6 | 1.79 | Commit |
-->檢視sequential read指標
這個指標很實用,可以在不同的平臺間進行比較,但是scattered read這種指標就不好比較了。
延遲一般需要在10ms以下,或者至少100 reads/sec,在基於SAN儲存快取資料的情況下,sequential read的指標有時候會保持在2ms左右,這個只能說明SAN已經把資料轉化為快取了,倒不能說明硬碟驅動確實很快。
上面的awr可以看到平均的延遲是在1ms以內,算是正常。
-->檢視top elapsed time sql
這個時候可以根據elapsed time得到一個sql執行情況的概覽。檢視這個的主要目的就是得到執行時間較長的sql語句。按照10分鐘對的一個頻度,executions為0的sql都需要格外注意,同時兼顧所佔的比例。
SQL ordered by Elapsed Time
Elapsed Time (s) | Executions | Elapsed Time per Exec (s) | %Total | %CPU | %IO | SQL Id | SQL Module | SQL Text |
---|---|---|---|---|---|---|---|---|
1,243.85 | 29 | 42.89 | 7.90 | 7.32 | 94.81 | cjxrg4qpadvgw | fextract@ccbdbpr1 (TNS V1-V3) | SELECT . |
942.47 | 27 | 34.91 | 5.98 | 7.81 | 95.75 | 5y3d011ygwfyx | fextract@ccbdbpr1 (TNS V1-V3) | SELECT |
613.45 | 0 | 3.90 | 4.81 | 97.32 | 9yn2xdw7uy0bq | JDBC Thin Client | select /*+ index(s SERVICE_ | |
606.64 | 555 | 1.09 | 3.85 | 94.74 | 4.89 | 7yp93zzstn5gh | TB1Manager@ccbdbpr1 (TNS V1-V3) | update (select /*+ index( |
602.56 | 0 | 3.83 | 14.57 | 90.57 | 0cdthzpx2jn4q | JDBC Thin Client | SELECT | |
602.53 | 0 | 3.83 | 4.70 | 97.30 | b4c5cvdza03m3 | JDBC Thin Client | SELECT | |
578.66 | 31 | 18.67 | 3.67 | 11.61 | 92.22 | cc9x1wp2tdgdx | fextract@ccbdbpr1 (TNS V1-V3) | SELECT |
547.03 | 1 | 547.03 | 3.47 | 78.67 | 17.69 | gbqz84d1jggdq | JDBC Thin Client | /* MMO_Memo_getMemoList_1 */ S... |
523.83 | 3 | 174.61 | 3.33 | 29.21 | 72.21 | 4gz51fphuarsw | JDBC Thin Client | /*ProcInstScanner_selectAv... |
496.38 | 0 | 3.15 | 4.73 | 96.39 | 6gvd0gbp58kbc | SQL*Plus | INSERT INTO .. | |
420.94 | 6 | 70.16 | 2.67 | 48.53 | 49.96 | 00jrngwmz2vxx | JDBC Thin Client | select... |
-->檢視db time
這個部分可以根據time model的部分得到。這個部分能夠得到一個大體的比例,看看db time都主要耗在哪些方面了。
Statistic Name | Time (s) | % of DB Time |
---|---|---|
sql execute elapsed time | 14,854.47 | 94.32 |
DB CPU | 4,404.99 | 27.97 |
parse time elapsed | 64.23 | 0.41 |
PL/SQL execution elapsed time | 36.26 | 0.23 |
sequence load elapsed time | 24.11 | 0.15 |
hard parse elapsed time | 8.79 | 0.06 |
connection management call elapsed time | 7.85 | 0.05 |
RMAN cpu time (backup/restore) | 7.74 | 0.05 |
inbound PL/SQL rpc elapsed time | 6.28 | 0.04 |
repeated bind elapsed time | 0.11 | 0.00 |
hard parse (sharing criteria) elapsed time | 0.06 | 0.00 |
failed parse elapsed time | 0.03 | 0.00 |
PL/SQL compilation elapsed time | 0.01 | 0.00 |
DB time | 15,749.31 | |
background elapsed time | 1,394.65 | |
background cpu time | 68.34 |
-->檢視硬碟讀的消耗部分
透過這個部分可以得到哪些sql正在進行大量的硬碟讀,透過sql order by reads來得到。
經過分析
sql(gbqz84d1jggdq)佔用了22%的硬碟讀,比例是很高的,檢視sql語句發現走的是一個全表掃描,表是億級的大表。
sql(00jrngwmz2vxx)使用union的地方存在問題,導致了全表掃描,細節可以參考http://blog.itpub.net/23718752/viewspace-1209397/ 已經做了完整的調優解釋。
sql(4gz51fphuarsw,6fu3z8pqd2y9g)是產品線的兩個通用sql,已經做了最佳化,其中有個大表做了全表掃描加並行,相對了最快的方式了。
sql(98dyqu3xsgyf5)是一個簡單的select 查詢,但是也走了全表掃描,經過排查發現這個大表竟然在最開始規劃的時候丟掉了索引,所以這個問題也是一個比較糾結的錯誤。需要協調解決。
Physical Reads | Executions | Reads per Exec | %Total | Elapsed Time (s) | %CPU | %IO | SQL Id | SQL Module | SQL Text |
---|---|---|---|---|---|---|---|---|---|
8,901,984 | 1 | 8,901,984.00 | 22.37 | 547.03 | 78.67 | 17.69 | gbqz84d1jggdq | JDBC Thin Client | /* MMO_Memo_getMemoList_1 */ S... |
6,712,998 | 6 | 1,118,833.00 | 16.87 | 420.94 | 48.53 | 49.96 | 00jrngwmz2vxx | JDBC Thin Client | /* AR9_AR9GetPaymentSMS_select... |
5,957,336 | 3 | 1,985,778.67 | 14.97 | 523.83 | 29.21 | 72.21 | 4gz51fphuarsw | JDBC Thin Client | /* CL_ProcInstScanner_selectAv... |
4,880,228 | 3 | 1,626,742.67 | 12.26 | 309.94 | 18.47 | 78.67 | 6fu3z8pqd2y9g | JDBC Thin Client | /* CL_WaitScanner_selectWorkab... |
2,015,674 | 36 | 55,990.94 | 5.06 | 94.81 | 27.40 | 70.35 | 98dyqu3xsgyf5 | JDBC Thin Client | /* null_CL9CrdMntrExtract_sele... |
-->檢視logical reads
這個部分可以排查出那些執行效率低下的sql語句。
檢視以下的幾個sql,
sql(7yp93zzstn5gh)消耗了大量的邏輯讀,經過檢視,這個sql語句沒有問題,但是表級存在著大量的碎片,一個分割槽表只有幾十條資料,但是blocks卻有幾十萬。
sql(1hg2wcuapy3y3)檢視執行計劃時,發現執行計劃的消耗太高。cost達到近 273K,這條sql語句還是需要好好排查一番。
Buffer Gets | Executions | Gets per Exec | %Total | Elapsed Time (s) | %CPU | %IO | SQL Id | SQL Module | SQL Text |
---|---|---|---|---|---|---|---|---|---|
509,827,210 | 555 | 918,607.59 | 61.98 | 606.64 | 94.74 | 4.89 | 7yp93zzstn5gh | B1Manager@ccbdbpr1 (TNS V1-V3) | update (select /*+ index(B1_... |
30,887,996 | 14 | 2,206,285.43 | 3.76 | 25.51 | 99.95 | 0.04 | 1hg2wcuapy3y3 | JDBC Thin Client | select un_request.run_mod... |
-->檢視commit頻率
這個部分可以檢視是否日誌切換較為頻繁,或者在進行著大量的事物處理,可以看看使用者進行commit的頻度
Instance Activity Stats
Statistic | Total | per Second | per Trans |
---|---|---|---|
user calls | 7,073,740 | 11,777.75 | 216.38 |
user commits | 32,485 | 54.09 | 0.99 |
user rollbacks | 207 | 0.34 | 0.01 |
-->檢視系統負載
這個部分可以檢視系統級的一些指標,如果時間較長,就有多行的資料可以參考。總體來看iowait的比例不高。
Operating System Statistics - Detail
Snap Time | Load | %busy | %user | %sys | %idle | %iowait |
---|---|---|---|---|---|---|
31-Oct 13:20:02 | 38.14 | |||||
31-Oct 13:30:03 | 39.55 | 21.82 | 17.03 | 3.41 | 78.18 | 0.19 |
-->檢視熱物件
可以透過segments by logical reads來得到一些比較熱的物件,可能是表,或者索引。
如果比例很高,可以透過這些熱物件從sql列表中排查一下,到底是哪些sql語句和這個熱物件相關。可能sql語句單獨執行很快,多個併發的程式時速度就會受到影響了。
Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Logical Reads | %Total |
---|---|---|---|---|---|---|
APPO | INDXS01 | CYCLE_GROUPS_PK | INDEX | 41,559,296 | 5.05 | |
EFWORK | DATAL01 | OFFER | TABLE | 20,566,400 | 2.50 | |
APPO | DATAS01 | STEP_INST | TABLE | 10,610,368 | 1.29 |
-->檢視物理讀最高的物件
這個部分可以透過如下的方式查詢。排查表FILES_CONTROL的時候,發現sql列表中的一個對應的sql語句走了全表掃描,這個表本來資料量就有好幾百萬,走全表掃描還是可以完全避免的。
Segments by Physical Reads
Owner | Tablespace Name | Object Name | Subobject Name | Obj. Type | Physical Reads | %Total |
---|---|---|---|---|---|---|
APPO | DATAS01 | STEP_INST | TABLE | 10,101,327 | 25.38 | |
APPO | DATAS01 | FILES_CONTROL | TABLE | 2,042,467 | 5.13 | |
APPO | DATAS01 | ACCOUNT | TABLE | 920,202 | 2.31 | |
APPO | DATAM01 | DOCUMENT | P120_C10 | TABLE PARTITION | 905,729 | 2.28 |
透過如上的方式也確實能夠發現不少的問題。也需要互相的印證。畢竟資料是表象,能夠結合實際的情況進行調優,從業務上,系統級調優,自己也能一定程度上解放自己。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-1963384/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 線上效能問題初步排查方法
- JAVA死鎖排查-效能測試問題排查思路Java
- VictoriaMetrics常見效能問題排查
- sqlldr載入效能問題的排查SQL
- 一次快取效能問題排查快取
- openresty使用火焰圖排查效能問題REST
- 效能問題,AWR High Event enq: US - contentionENQ
- 使用awr來診斷資料庫效能問題資料庫
- 一次容器MySQL的效能問題排查MySql
- Redis效能問題排查解決手冊(七)Redis
- 如何快速排查Linux伺服器效能問題Linux伺服器
- java問題排查Java
- JVM 問題排查JVM
- 框架問題排查框架
- 微服務場景下效能問題排查神器之xrebel微服務
- job處理緩慢的效能問題排查與分析
- 如何使用AWR報告來診斷資料庫效能問題資料庫
- SDK與問題排查
- 線上FullGC問題排查實踐——手把手教你排查線上問題GC
- 不要再說你不會了——網路效能問題排查思路
- 雲吞鋪子:RDS for MySQL CPU效能問題分析第一篇MySql
- Java服務.問題排查.問題復現Java
- 異常問題排查之旅
- Spark學習——問題排查Spark
- 利用greys排查java問題Java
- JVM問題排查步驟JVM
- 資料問題排查思路
- Linux排查JVM問題LinuxJVM
- Redis阻塞問題排查方向Redis
- Mysql show processlist 排查問題MySql
- 技能篇:linux服務效能問題排查及jvm調優思路LinuxJVM
- 使用awr來分析session leak問題Session
- 微信支付返回-1,問題排查
- 運維排查問題常用sql運維SQL
- 伺服器問題 排查思路伺服器
- 日常問題排查-呼叫超時
- kubernetesgraceperiod失效問題排查
- 排查 “Detected Tx Unit Hang”問題