程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle性能診斷不能不知的秘籍

Oracle性能診斷不能不知的秘籍

編輯:Oracle數據庫基礎

Oracle性能診斷的方法有很多,下面就此講講常用的幾種方法。一般而言,如果需要進行性能調整,那麼,肯定是存在一些性能問題。所以,診斷,要從用戶所提出的性能問題開始著手,做到有的放矢。

用戶可能會羅列出一大堆的性能問題,你比如說:某個操作比較慢呀,或者說當達到多少用戶的並發時CPU和內存使用達到100%,死鎖等等。所以,我們要對用戶列出的這些性能問題進行分析。當然,首先得從用戶認為最迫切的性能問題開始著手進行分析。

明確了性能問題,這是系統調優的第一步,讓我們有一個出發點,但是分析性能問題,找到性能問題產生的原因,這是一個復雜的過程,並且是性能調優的非常重要的一個過程。只有找到了產生性能問題的根源,你才好著手進行調整。

在Orace性能診斷上,首先要有一個思路。從整體到局部,從面到點,逐步定位是一個不錯的方法。那麼,什麼是從整體到局部呢?

Oracle數據庫本質上是運行於某一種計算機上的應用軟件,所以,這個整體,我指的就是運行Oracle的計算機(即服務器)。如果,性能診斷問題的根源是因為計算機的性能低下所導致,那麼,做其它的調整將不能根本改變Oracle的性能狀況,我們得從調整這個整體開始(即服務器的性能)。

服務器的性能我覺得由2個因素所組成:硬件和操作系統。

(1)硬件包括:CPU,內存,存儲等。檢查的方法是我們可以登錄到服務器發布一些命令來查看服務器CPU,內存,以及硬盤等的I/O速率,如UNIX下及類UNIX(Linux)下可以發布:

Top,vmstat,iOStat,free等等命令來檢查這些硬件資源的使用狀況。還可以使用一些第三方的測量工具。比如,有一些工具是專門用來測試硬盤的傳輸速率的,從中我們可以知道硬盤的平均帶寬是多少。
通過這些工具,如果檢查出來,發現是由於服務器的硬件資源所導致的性能問題,那麼,我們就可以建議提升服務器的硬件。

(2)第二個因素是OS。因為Oracle是運行於OS之上的,所以OS的一些設置,也會導致一些性能問題。特別是在Linux下,一些參數的設置,如:內核參數,交換空間(swap)等等,也能影響到整個系統的性能。所以,我們也可以在服務器上查看一下這些設置。如果是Windows服務器,Windows提供了一個性能測量工具,可以測量每秒的內存頁交換(paging)等指標,從這些指標中我們也可以檢查出內存是否足夠,以及虛擬內存是否足夠等等一些問題。

檢查完服務器,就可以從Oracle本身開始進行分析了。分析的思路,我也是從整體到局部,從面到點。
整體:首先,我們可以從了解一下Oracle數據庫的規劃開始,這些規劃具體包括:存儲的規劃,內存的規劃,實例參數設置等等,下面我分別作一些簡單的介紹。

(1)存儲的規劃(storage planning):實際上指的就是Oracle數據庫的磁盤規劃,這關系到Oracle的I/O性能。舉例:oracle的數據文件磁盤是否和oracle軟件磁盤分開?應用系統是否有創建單獨的表空間?有沒有為索引和大對象創建單獨的表空間?多路復用(multiplexed)的控制文件是否分別存放於不同的磁盤?日志組的不同成員是否存放於不同磁盤?等等,這些都或多或少地影響到Oracle的I/O性能。

(2)內存規劃(memory planning):實際上指的是Oracle SGA和PGA的分配是否合理?以及組成SGA的各個內存組件的內存分配是否達到最佳?一般而言,對於排序操作(sort Operation)比較多的系統,比如,我們的XPC系統,或者報表系統,就應該適當地多分配一些內存給PGA。當然,PGA總體目標也要根據系統的連接數來確定。在SGA方面,總體原則是,盡量把大部分的內存分配給數據庫高速緩存,以增加內存的命中率。至於其它組件如:Java池,大池等分配幾十M就可以(32M一般就夠了)。而對於共享池,則要根據CPU的性能來決定。一般而言,如果CPU很強(如采用多路CPU),則共享池設小一點也無所謂。一般而言,設80M~300M都能滿足系統需求,再多設的話對系統性能增加不大,反而浪費內存。

(3)實例的參數:有些Oracle實例的參數能夠影響到整個系統的性能。你比如:與Oracle優化器相關的一些參數設置,與SQL共享和重用相關的參數,與是否預先將SGA裝載到內存相關的參數等等.我們都要檢查一些,這些參數設置是否合理.

那麼,我們怎麼能夠檢查出這些整體的設置是否就是導致性能問題的根源呢?Oracle有提供一個用於診斷性能問題的工具包(statspack).當然,可能也有一些第三方的用於oracle性能診斷的工具,但是我想沒有其它工具比Oracle本身提供的工具更全面,更准確了。

STATSPACK需要安裝。安裝後我們需要設置一下檢查的時間間隔,實際上就是創建一個oracle的JOB。Statspack或根據我們設定的時間間隔來從oracle的動態性能視圖中捕捉一些與性能相關的數據,然後根據一定的公式進行計算,生成一個有關於oracle各項性能指標的報告。報告羅列了一些實際的活動狀況(負載,內存命中率等等),最高等待事件,以及TOP SQL等內容,是我們進行Oracle性能診斷的一個比較綜合的一個工具。

局部:Oracle的整體調整完畢後,我們就可能逐步逐步調整某個局部了。你比如,我們可以根據用戶反映出來的問題:比如說,在XPC中點擊某個BUTTON或進行某項操作,系統響應比較慢,這個時候,我們就可能針對這個問題,來進行定位。導致這個操作慢有可能是由於這個操作執行的SQL語句比較慢,也有可能是由於我們的Java代碼寫得不夠好,實現比較復雜,結構不合理等等所導致。往往,這樣的性能診斷,要DBA和相關開發人員一起協同完成。在DB這一層,我們可以使用Oracle的一些實用工具,如SQL TRACE等來捕捉這些SQL,然後對這個SQL的進行分析,並進行優化,從而解決這些性能問題。根據實踐,相當大一部分性能優化是在SQL語句一級著手的。

除了上面我所描述的這些以外,其它與性能相關的情況也需要調查一下。如:Oracle是采用何種類型的優化器?如果是采用基於成本的優化器(CBO),是否有定期進行統計(gather shema statistics)?統計的時間間隔設置是否合理?

另外一個跟SQL性能相關的因素就是索引。我們也可以檢查一下是否在相關表上有否建索引?這些索引建得是否合理?是否有存在從來沒有被使用過的索引(通過索引監控工具來檢查)?

最後一個檢查的項可能是和並發有關。假如用戶反映說系統有時會出現死鎖,這時,我們就要檢查一下導致死鎖的原因了,如捕獲相關的引起死鎖的SQL語句,分析是由於應用的架構設計所導致還是由於業務邏輯本身所導致。在DB這一級,我們可以檢查一下事務的隔離等級是否高置合理。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved