理論實踐:循序漸進理解AWR細致入微分析性能報告

1. AWR 概述

Automatic Workload Repository(AWR) 是10g引入的一個重要組件。在里面存貯著近期一段時間內(默認是7天)數據庫活動狀態的詳細信息。

AWR 報告是對 AWR 視圖進行查詢而得到的一份自動生成的報告。可以通過下面的腳本手工得到一份 AWR 報告。

wps21B5.tmp

通過 AWR 和 AWR 報告,DBA 可以容易地獲知最近數據庫的活動狀態,數據庫的各種性能指標的變化趨勢曲線,最近數據庫可能存在的異常,分析數據庫可能存在的性能瓶頸從而對數據庫進行優化。

AWR 報告所有的數據來源于 AWR 視圖,即以 DBA_HIST_開頭的所有系統表,Database Reference 有對所有這些系統表的描述,這應該是 Oracle 官方對 AWR 報告的官方注釋了。而對于如何有效地去分析 AWR 報告,這可能更需要 DBA 經驗的日積月累。

AWR的前身是Statspack,Statspack在10g和11g中也有提供,同時和AWR一起做了同步更新,而且Statspack是公開源代碼的,因此,關于Statspack的資料,還有Statspack的源代碼,都是理解AWR的一個有用的輔助。

本文著重對AWR中的一些要點進行剖析,歡迎一起討論AWR相關的問題。

2.? DB CPU - CPU負載分析

如果關注數據庫的性能,那么當拿到一份 AWR 報告的時候,最想知道的第一件事情可能就是系統資源的利用情況了,而首當其沖的,就是 CPU。

而細分起來,CPU 可能指的是:

1、OS 級的 User%,Sys%, Idle%

2、DB 所占 OS CPU 資源的 Busy%

3、DB CPU 又可以分為前臺所消耗的 CPU 和后臺所消耗的 CPU

如果數據庫的版本是11g,那么很幸運的,這些信息在AWR報告中一目了然:

wps21B6.tmp

wps21C7.tmp

分析上面的圖片,我們可以得出下面的結論:

· OS 級的 User%,Sys%,Idle%:

OS 級的 %User 為75.4,%Sys 為2.8,%Idle 為21.2,所以 %Busy 應該是 100-21.1=78.8。

· DB所占OSCPU資源的Busy%

DB占了OS CPU資源的69.1,%Busy CPU則可以通過上面的數據得到:%Busy CPU = %Total CPU/(%Busy) * 100 = 69.1/78.8 * 100 = 87.69,和報告的87.7相吻合。

如果是10g呢,則需要手工對 Report 里的一些數據進行計算了。

Host CPU 的結果來源于 DBA_HIST_OSSTAT,AWR 報告里已經幫忙整出了這段時間內的絕對數據(這里的時間單位是centi second,也就是1/100秒)

wps21C8.tmp

根據上面的數據,稍加計算分析便可得出下面的結果。

· OS級的User%,Sys%, Idle%:

%User = USER_TIME/ (BUSY_TIME+IDLE_TIME)*100 =146355/ (152946+41230)*100 = 75.37

%Sys = SYS_TIME/ (BUSY_TIME+IDLE_TIME)*100=5462/(152946+41230)*100=2.81

%Idle = IDLE_TIME/ (BUSY_TIME+IDLE_TIME)*100=21230/(152946+41230)*100=10.93

值得注意的,這里已經隱含著這個AWR報告所捕捉的兩個Snapshot之間的時間長短了。有下面的公式:BUSY_TIME + IDLE_TIME = ELAPSED_TIME * CPU_COUNT

注意:正確的理解這個公式可以對系統CPU資源的使用及其度量的方式有更深一步的理解。

因此ELAPSED_TIME =(152946+41230)/8/100 =? 242.72 seconds

至于DB對CPU的利用情況,這就涉及到10g新引入的一個關于時間統計的視圖V$SYS_TIME_MODEL,簡單而言,Oracle采用了一個統一的時間模型對一些重要的時間指標進行了記錄,具體而言,這些指標包括:

1) Background elapsed time

?? 2) Background CPU time

????????? 3) RMAN CPU time (backup/restore)

1) DB time

?? 2) DB CPU

?? 2) Connection management call elapsed time

?? 2) Sequence load elapsed time

?? 2) SQL execute elapsed time

?? 2) Parse time elapsed

????????? 3) Hard parse elapsed time

??????????????? 4) Hard parse (sharingcriteria) elapsed time

??????????????????? 5) Hard parse (bindmismatch) elapsed time

????????? 3) Failed parse elapsed time

??????????????? 4) Failed parse (out of sharedmemory) elapsed time

?? 2) PL/SQL execution elapsed time

?? 2) Inbound PL/SQL RPC elapsed time

?? 2) PL/SQL compilation elapsed time

?? 2) Java execution elapsed time

?? 2) Repeated bind elapsed time

這里我們關注的只有和 CPU 相關的兩個: Background CPU time 和 DB CPU。

這兩個值在 AWR 里面也有記錄:

wps21C9.tmp

Total DB CPU = DB CPU + Background CPU time = 1305.89 + 35.91 = 1341.8 seconds

Total DB CPU除以總的 BUSY_TIME + IDLE_TIME可得出% Total CPU。

% Total CPU = 1341.8/1941.76 = 69.1%,這剛好與上面Report的值相吻合。

其實,在 Load Profile 部分,我們也可以看出DB對系統CPU的資源利用情況。

wps21CA.tmp

用 DBC PU per Second 除以 CPU Count 就可以得到 DB 在前臺所消耗的 CPU% 了。這里 5.3/8 = 66.25 %比69.1%稍小,說明DB在后臺也消耗了大約3%的 CPU,這是不是一個最簡單的方法了呢?

3. DB Time – 進程消耗時間分析

DB CPU 是一個用于衡量 CPU 的使用率的重要指標。假設系統有N個 CPU,那么如果 CPU全部處于繁忙狀態的話,一秒鐘內的 DB CPU 就是N秒。

如何去表征一個系統的繁忙程度呢?除了利用 CPU 進行計算外,數據庫還會利用其它計算資源,如網絡、硬盤、內存等等,這些對資源的利用同樣可以利用時間進行度量。假設系統有M個 Session 在運行,同一時刻,有的 Session 可能在利用 CPU,有的 Session 可能在訪問硬盤,那么,在一秒鐘內,所有 Session 的時間加起來就可以表征系統在這一秒內的繁忙程度,一般的,這個和的最大值應該為 M。這其實就是 Oracle 提供的另一個重要指標:DB Time,它用以衡量前端進程所消耗的總時間。

對除 CPU 以外的計算資源的訪問,Oracle 用等待事件進行描述。同樣地,和 CPU 可分為前臺消耗 CPU 和后臺消耗 CPU一樣,等待事件也可以分為前臺等待事件和后臺等待事件。

DB Time 一般的應該等于DB CPU + 前臺等待事件所消耗時間的總和。等待時間通過 V$SYSTEM_EVENT 視圖進行統計,DB Time 和 DB CPU 則是通過同一個視圖,即V$SYS_TIME_MODEL 進行統計。

Load Profile 一節就有了對 DB Time 的描述:

wps21CB.tmp

這個系統的 CPU 個數是8,因此我們可以知道前臺進程用了系統 CPU 的7.1/8=88.75%。 DB Time/s 為11.7,可以看出這個系統是 CPU 非常繁忙的。里面 CPU 占了7.1,則其它前臺等待事件占了11.7 –7.1 = 4.6 Wait Time/s。DB CPU 占 DB Time 的比重呢? 7.1/11.7= 60.68%

Top 5 Timed Events,或許很多人都對它有所耳聞,按照 CPU/等待事件占 DB Time 的比例大小,這里列出了 Top 5。如果一個工作負載是 CPU 繁忙型的話,那么在這里應該可以看到 DB CPU 的影子。

wps21CC.tmp

注意到,我們剛剛已經算出了 DB CPU 的 %DB time 為60%左右。

其它的 external table read,direct path write, PX Deq: read credit, PXDeq: Slave Session Stats 這些就是占比重40%的等待事件里的 Top 4了。

回過頭再研究下這個 Top 5 Timed Foreground Events,如果先不看 Load Profile,你能說出這個一個 CPU-Bound 的工作負載嗎?

答案是否定的,要知道系統 CPU 的繁忙程序,還要知道這個 AWR 所基于兩個 Snapshot 的時間間隔,還要知道系統 CPU 的個數。否則,系統可以是一個很 IDLE 的系統呢。記住 CPU 利用率= DB CPU/(CPU_COUNT*Elapsed TIME)。

這個 Top5 給我們的信息只是這個工作負載應該是并行查詢,從外部表讀取數據,并用 insert append 的方式寫入磁盤,同時,主要時間耗費在 CPU 的運算上。

上面提到,DB Time 一般的應該等于 DB CPU + 前臺等待事件所消耗時間的總和。在下面有對這三個值的統計:

wps21CD.tmp

· DB CPU = 6474.65

· DB TIME = 10711.2

· FG Wait Time = 1182.63

明顯的,DB CPU + FG Wait Time < DB Time,只占了71.5%

其它的28.5%被消耗到哪里去了呢?這里其實又隱含著一個 Oracle 如何計算 DB CPU 和? DB Time 的問題。當 CPU 很忙時,如果系統里存在著很多進程,就會發生進程排隊等待 CPU 的現象。在這樣,DB TIME 是把進程排隊等待 CPU 的時間算在內的,而 DB CPU 是不包括這一部分時間。這是造成 DB CPU + FG Wait Time < DB Time 的一個重要原因。如果一個系統 CPU 不忙,這兩者應該就比較接近了。

不要忘了在這個例子中,這是一個 CPU 非常繁忙的系統,而71.5%就是一個信號,它提示著這個系統可能是一個 CPU-Bound 的系統。

4.? IO數據分析

除了 DB CPU、DB Time,或許另一個比較常用的指標應該是 IO 的利用情況。關于 IO 的指標就比較多了,單單在 Load Profile 里面就有5個,在 DB Time 和 DB CPU 的下面:

wps21DD.tmp

這5個指標的值都來自 V$SYSTAT 視圖,分別是:

· Redo Size: ‘redo size’

· Logical reads = ’session logical reads’or (’db block gets’ + ‘consistent gets’)

· Blocks Changes = ‘db block changes’

· Physical reads = ‘physical reads’

· Physical writes = ‘physical writes’

具體指標的解釋可以參考Database Reference (http://docs.oracle.com/cd/B28359_01/server.111/b28320/stats002.htm)

如何得到系統大致的 MBPS(Megabits Per Second) 呢?

MBPS= (Physical reads + Physical writes) *Block_Size = (196,271.4+2.0)*8*1024/1024/1024 = 1533 MB/s

更準確的 MBPS 可以從 Instance Activity Stats 部分獲得。

wps21DE.tmp

Physical IO disk bytes = physical read total bytes+ physical write total bytes

值得注意的是這里 physical write total bytes 大致是 physical write bytes 的兩倍。這應該是 physical write total bytes 統計的是磁盤的 IO,而這里,我們做了 ASM,normal redundancy,一份數據寫了兩遍的原因。

Load Profile 剩下的部分主要是關于各種執行情況的統計,除了 W/A MB processed 來自 V$PGASTAT(單位其實也是 Byte,不是 MB),其它數據都是來自于 V$SYSSTAT。

· Blocks Changes: ‘db block changes’

· User calls: ‘user calls’

· Parses: ‘parse count (total)’

· Hard parses: ‘parse count (hard)’

· Logons: ‘logons cumulative’

· Executes: ‘execute count’

· Rollbacks: ‘user rollbacks’

· Tranasactions: ‘user rollbacks’ + ‘usercommits’

· W/A MB processed: ‘bytes processed’

一般而言,Hard parses < Parses < Executes < User Calls。

AWR 的一般性介紹我想差不多就這些了,其它部分的介紹借助于一些更具體的 AWR 報告進行分析可能會更加方便和清晰。

5. AWR 報告分析 – 實戰1

構建 DSS 系統的第一步離不開數據加載,通過文本文件加載是最常見的方式,Oracle 提供了外部表加載的方法,即把一個文本文件當成一個正常的表來進行操作,通過類似 insert /*+ append */ into table select from external_table 的方式進行加載。

數據加載是一個 CPU-Bound 的過程,不過是通過什么工具,external table 也好,sqlldr 也好,imp 也好,impdp 也好。換句話說,如果連數據加載都出現 IO 瓶頸,這個系統的配置就說不過去了。

這個過程的 AWR 報告會是什么樣子的呢?

先做個一般的假定,從外部表加載數據到一個本地分區表。

Top 5 Timed Events 類似下面:

wps21DF.tmp

如果去抓取這段時間 DBA_HIST_ACTIVE_SESS_HISTORY 的數據,并轉換為圖表的話,我們會得到更形象的 Top 10 Wait Events。(如何實現這一步可以參考用 Oracle 實現 ASH 的數據透視圖:http://www.cnblogs.com/rootq/archive/2009/09/24/1573200.html)

wps21E0.tmp

enq: HV –contention 是什么東西呢?

在11.2以前,對于分區表的 parallel direct-path load,Oracle 采用的是 brokered load 的方式,即所有的 PX Slaves 共享對每個分區的 high water mark 的訪問,通過輪流持有 high water mark 實現對每個 segment 添加新的 blocks。這種方法對于充分利用 extent 的空間是有幫助的,不過帶來的問題就是對 high water mark 的競爭,也就是這里的 enq: HV – contention。在執行計劃中,這以 RANDOM LOCAL 標記。下面是一個例子:

wps21E1.tmp

一個好消息是,11.2引入了一種新的方式,叫做 PKEY distribution。在這種方式下,一個特定的分區只交給一個或多個特定的 PX slave 負責,這種方式不僅減少了對 high water mark 的爭用,而且可以實現 Partition 內更好的壓縮率。

6.? AWR報告分析 – 實戰2

有一次跟一個 QQ 上的朋友一起探討了另一個對系統 CPU 進行度量的指標: CPU used by this session。

他剛好有一份 AWR 報告,在這份報告里,出現了嚴重的 CPU used by this session 和 DB CPU 不一致的現象。

下面是這份報告的一些片斷:

wps21F2.tmp

wps21F3.tmp

wps21F4.tmp

wps21F5.tmp

再做進一步的歸納:

OS Busy% =1821080/(1821080+5384293) = 25%

Inst CPU% (using DB CPU) = 8934.22*100/ (1821080+5384293)=12%

Inst CPU% (using CPU used by this session) = 418035/ (1821080+5384293) = 6%

用 CPU used by this session 計算出的 CPU 利用率竟然只是用 DB CPU 計算出來的利用通率的一半!

我的第一個反應是在 Jonathan Lewis 網站看到的一篇相關文章,里面提到了 DB CPU 和 CPU used by this session 計算時的不同之處: (https://jonathanlewis.wordpress.com/2009/05/26/cpu-used/)

“Prior to10g Oracle usually updated time figures at the end of each database call; butfrom 10g there are some views where time is updated more regularly.

The “DB CPU” from v$sess_time_model increases every six seconds, while the “CPU used by this session” from v$sesstat changes only at the end of the test.”

如何驗證這一點呢?

在瀏覽這份報告的 TOP SQL 時,我們發現了下面的現象:

wps21F6.tmp

這是從 SQL ordered by Elapsed Time 截取出來的 Top 3 SQL。TOP 1 的 SQL 用了 DB Time 的30.10%,用了2517s 的 CPU Time。但請注意它的 Executions 的值卻為0。也就是說,這里的 CPU Time 是還沒有被計算入 CPU used by this session 這個指標里面的。

我們再把2517s加回來,看出誤差縮小多少:(251700+418035)/(1821080+5384293) = 9%

這時和用 DB CPU 計算出來的12%還是有1/4的差距。

從這個例子可以看出,用 DB CPU 度量還是比用 CPU usedby this session 來得準確的。特別在有大查詢在跑的過程中抓的 AWR,這個誤差很有可能會被放大。這是一個有趣的實際例子。

7. 總結

AWR 是分析數據庫運行狀況的利器,將其運用好可幫助 DBA 提早發現數據庫中存在的問題并加以解決。文中主要對 DB CPU、DB Time、IO 等 AWR 報告中的數據進行了分析說明,當然分析AWR報告不能僅限于此,更需要DBA日積月累的經驗。希望本文對想了解 AWR 的朋友有一定幫助。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282458.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282458.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 動態代理

動態代理 Proxy動態代理是基于實現接口的,被代理類實現了某個功能接口, 代理類實現invocationHandler 接口重寫invoke(Object proxy, Method method , class 代理類) 用Proxy.newProxyInstance(類加載器, 被代理類實現的接口的集合, invocationhandler 的實現類)來創建代理類對…

mysql sql語句書寫之面試部分

要求一 :查詢時,將用戶的手機號碼(比如1331234567)顯示為133***4567 這是在交流群里看到別人發的一個面試題,我本人非常反感直接在查詢時進行處理數據的,查詢出來再處理不好嗎,但是面試題要求是這樣. 這里,簡單的寫了兩個表關聯查詢,然后把手機號碼進行處理顯示出來select a.ui…

Linux中寫入ISO鏡像

1、查看U盤標識 fdisk -l2、寫入鏡像到U盤 sudo dd if/home/***.iso of/dev/sdb轉載于:https://www.cnblogs.com/katzepunk/p/7492813.html

Linux上用戶之間對話

Linux上用戶之間對話 昨天想在CentOS7上與另外一個用戶對話&#xff0c;但把命令忘記了&#xff0c;特此記錄下來。 Write命令 write命令是單向發送一條消息給同機器的Linux用戶。首先通過who命令查看誰在線。 root tty7 2017-03-15 14:38 (:0) root pts/20 …

Redis --數據類型 [1]

一 string 類型 (最簡單常用的類型) string是redis最基本的類型&#xff0c;你可以理解成與Memcached一模一樣的類型&#xff0c;一個key對應一個value。二 Hash類型(哈希) Redis hash是一個string類型的field和value的映射表&#xff0c;hash特別適合用于存儲對象。三 List(列…

KestrelServer詳解[3]: 自定義一個迷你版的KestrelServer

和所有的服務器一樣&#xff0c;KestrelServer最終需要解決的是網絡傳輸的問題。在《KestrelServer詳解[2]: 網絡連接是如何創建的&#xff1f;》&#xff0c;我們介紹了KestrelServer如何利用連接接聽器的建立網絡連接&#xff0c;并再次基礎上演示了如何直接利用建立的連接接…

c# 文件下載

這樣的下載方式 減少服務器的壓力&#xff0c; 還有一種省懶勁的方式&#xff1a;后端在iis上配置一個虛擬目錄&#xff0c;然后讓前端自己拼url地址下載&#xff0c; 這個東西是給后期其他工作人員埋坑&#xff0c;哈哈。 本帖原文轉自與 農碼一生轉載于:https://www.cnbl…

Redis -- 基礎操作 [2]

一 獲取redis當前數據庫符合條件鍵名 [keys pattern]二 設置string形式key-value [set key value]三 獲取存儲在指定 key 中字符串的子字符串 [GETRANGE KEY start end]四 刪除指定鍵值對 [del key]五 為給定key設置過期時間 [Expire KEY SECONDS]注: Expireat KEY TIMESTAMP 同…

Centos7作為VNCserver,本地使用VNCViewer連接

1.概念 VNC是一個遠程連接工具 VNC is used to display an X windows session running on another computer. Unlike a remote X connection, the xserver is running on the remote computer, not on your local workstation. Your workstation ( Linux or Windows ) is only …

SQL Server CONVERT() 日期轉換為新數據類型的 通用函數

http://www.w3school.com.cn/sql/func_convert.asp轉載于:https://www.cnblogs.com/renzhituteng/p/6665569.html

在URL中實現簡易的WebAPI驗簽

本文主要介紹一種與微信公眾平臺對接方式類似的&#xff0c;為 AspNetCore 提供的一種簡易的 WebAPI 簽名驗證中間件。本文相關源碼和案例已開源&#xff0c;地址&#xff1a;https://github.com/sangyuxiaowu/SignAuthorization原理說明簡易的 API url 簽名驗證中間件&#xf…

Redis -- Hash(哈希) [3]

Redis Hash 是一個string類型的field和value的 映射表 &#xff0c;hash特別適合用于存儲對象。 注 : Redis 中每個 hash 可以存儲 232 - 1 鍵值對&#xff08;40多億&#xff09;。 比如這樣:注:在此,首先推薦一款redis可視化工具 https://redisdesktop.com/download , 是非常…

HBuilder 打包流程

1.運行HBuilder---百度搜索HBuilder&#xff0c;官網下載安裝包&#xff0c;解壓&#xff0c;運行HBuilder.exe。注冊賬號&#xff0c;并登陸 2.新建app---在左邊右鍵&#xff0c;選擇新建APP&#xff0c;或者&#xff0c;點擊中間的新建app 3.在彈出的窗口&#xff0c;填入應用…

pandas所占內存釋放

df pd.read_csv(....) 要調用循環處理多個文件時&#xff0c;內存占用情況嚴重&#xff0c;如果互相之間不需要調用&#xff0c;可以直接del df 釋放內存

Python3——字典

Python 字典(Dictionary) 字典是另一種可變容器模型&#xff0c;且可存儲任意類型對象。 字典的每個鍵值(key>value)對用冒號(:)分割&#xff0c;每個對之間用逗號(,)分割&#xff0c;整個字典包括在花括號({})中 定義字典 d {} d {key1 : value1, key2 : value2 } d di…

科技以換皮為本:路遙工具箱 V4 版本發布

作為定位“開發輔助”的工具&#xff0c;我也一直在想如何讓工具更有效率。是更快的打開速度還是更豐富的功能&#xff1f;路遙工具箱 V3 版本的界面布局是偏 BS 后臺系統的風格&#xff1a;可折疊的樹形菜單用來拓寬用戶的操作區域&#xff0c;多標簽的功能布局讓軟件保持整潔…

myisam數據表根據frm文件恢復數據表

有時,我們重裝mysql時,可能忘記備份數據了, 只留下了之前的mysql下面的data文件夾里的數據, 這時我們應該如何去恢復數據表呢 如果直接將原來的data目錄導進現在的mysql,肯定是不行的,其實很簡單 我們常用的數據表結構有myisam和innodb,這兩種數據表恢復數據的方式是不一樣的,這…

本文主要總結關于mysql的優化(將會持續更新)

2019獨角獸企業重金招聘Python工程師標準>>> ON DUPLICATE KEY UPDATE 事件背景 在閱讀公司原來代碼的過程中&#xff0c;我發現了這樣一段代碼: $sql "INSERT INTO {$table} ({$fields}) VALUES " . $values; if (!empty($onDuplicate)) {$sql . ON DU…

CS Academy Gcd Rebuild

題目鏈接&#xff1a;https://csacademy.com/contest/archive/task/gcd-rebuild/statement/ 題目大意&#xff1a;給出一個N*M的矩陣&#xff0c;其中第i行j列表示gcd(a[i], b[j])&#xff0c;現在不知道數組a&#xff0c;b&#xff0c;給出這個矩陣&#xff0c;求a&#xff0c…

ASP.NET Core 在 IIS 下的兩種部署模式

KestrelServer最大的優勢體現在它的跨平臺的能力&#xff0c;如果ASP.NET CORE應用只需要部署在Windows環境下&#xff0c;IIS也是不錯的選擇。ASP.NET CORE應用針對IIS具有兩種部署模式&#xff0c;它們都依賴于一個IIS針對ASP.NET CORE Core的擴展模塊。一、ASP.NET CORE Cor…