前言:
通過緊張的網通、移動性能測試,雖然測試準備和討論的環節很多,應用服務器測試如果要體現應用服務器的性能,那么在測試環節中,其他環節不能成為瓶頸,否則應用服務器的性能將很難展現。但實際在我們的測試實踐中,無論準備情況,數據庫調優都是永恒的話題,數據庫的優劣直接影響整個測試的性能表現。本文結合了一些測試經驗和一些資料的整理,給出了個人的一些經驗,共大家分享,本文測重于
Unix
環境。
一般問題的發現及解決:
Oracle
數據庫服務器是整個系統的核心,它的性能高低直接影響整個系統的性能,為了調整
Oracle
數據庫服務器的性能,主要從以下幾個方面考慮:
第一步:
???
調整操作系統以適合
Oracle
數據庫服務器運行,
Oracle
數據庫服務器很大程度上依賴于運行服務器的操作系統,如果操作系統不能提供最好性能,那么無論如何調整,
Oracle
數據庫服務器也無法發揮其應有的性能。
第二步:
?
??
為
Oracle
數據庫服務器規劃系統資源,據已有計算機可用資源
,?
規劃分配給
Oracle
服務器資源原則是:盡可能使
Oracle
服務器使用資源最大化
,
特別在
Client/Server
中盡量讓服務器上所有資源都來運行
Oracle
服務。調整計算機系統中的內存配置,多數操作系統都用虛存來模擬計算機上更大的內存,它實際上是硬盤上的一定的磁盤空間。當實際的內存空間不能滿足應用軟件的要求時,操作系統就將用這部分的磁盤空間對內存中的信息進行頁面替換,這將引起大量的磁盤
I/O
操作,使整個服務器的性能下降。為了避免過多地使用虛存,應加大計算機的內存。
第三步:
???
為
Oracle
數據庫服務器設置操作系統進程優先級,不要在操作系統中調整
Oracle
進程的優先級,因為在
Oracle
數據庫系統中,所有的后臺和前臺數據庫服務器進程執行的是同等重要的工作,需要同等的優先級。所以在安裝時,讓所有的數據庫服務器進程都使用缺省的優先級運行。
第四步:
?
??
調整內存分配,
Oracle
數據庫服務器保留
3
個基本的內存高速緩存,分別對應
3
種不同類型的數據:庫高速緩存,字典高速緩存和緩沖區高速緩存。庫高速緩存和字典高速緩存一起構成共享池,共享池再加上緩沖區高速緩存便構成了系統全程區
(SGA)
。
SGA
是對數據庫數據進行快速訪問的一個系統全程區,若
SGA
本身需要頻繁地進行釋放、分配,則不能達到快速訪問數據的目的,因此應把
SGA
放在主存中,不要放在虛擬內存中。內存的調整主要是指調整組成
SGA
的內存結構的大小來提高系統性能,由于
Oracle
數據庫服務器的內存結構需求與應用密切相關,所以內存結構的調整應在磁盤
I/O
調整之前進行。
1
、庫緩沖區的調整
庫緩沖區中包含私用和共享
SQL
和
PL/SQL
區,通過比較庫緩沖區的命中率決定它的大小。要調整庫緩沖區,必須首先了解該庫緩沖區的活動情況,庫緩沖區的活動統計信息保留在動態性能表
v$librarycache
數據字典中,可通過查詢該表來了解其活動情況,以決定如何調整。
Select sum(pins),sum(reloads) from v$librarycache;
Pins
列給出
SQL
語句,
PL/SQL
塊及被訪問對象定義的總次數;
Reloads
列給出
SQL
和
PL/SQL
塊的隱式分析或對象定義重裝載時在庫程序緩沖區中發生的錯誤。如果
sum(pins)/sum(reloads)
≈
0
,則庫緩沖區的命中率合適;若
sum(pins)/sum(reloads)>1,
則需調整初始化參數
shared_pool_size
來重新調整分配給共享池的內存量。
2
、
數據字典緩沖區的調整
數據字典緩沖區包含了有關數據庫的結構、用戶、實體信息。數據字典的命中率,對系統性能影響極大。數據字典緩沖區的使用情況記錄在動態性能表
v$librarycache
中,可通過查詢該表來了解其活動情況,以決定如何調整。
Select sum(gets),sum(getmisses) from v$rowcache;
Gets
列是對相應項請求次數的統計;
Getmisses
列是引起緩沖區出錯的數據的請求次數。對于頻繁訪問的數據字典緩沖區,
sum(getmisses)/sum(gets)<10%
~
15%
。若大于此百分數,則應考慮增加數據字典緩沖區的容量,即需調整初始化參數
shared_pool_size
來重新調整分配給共享池的內存量。
3
、
緩沖區高速緩存的調整
用戶進程所存取的所有數據都是經過緩沖區高速緩存來存取,所以該部分的命中率,對性能至關重要。緩沖區高速緩存的使用情況記錄在動態性能表
v$sysstat
中,可通過查詢該表來了解其活動情況,以決定如何調整。
Select name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads');
dbblock gets
和
consistent gets
的值是請求數據緩沖區中讀的總次數。
physical reads
的值是請求數據時引起從盤中讀文件的次數。從緩沖區高速緩存中讀的可能性的高低稱為緩沖區的命中率,計算公式:
Hit Ratio=1-(physical reds/(dbblock gets+consistent gets))
如果
Hit Ratio<60%
~
70%
,則應增大
db_block_buffers
的參數值。
db_block_buffers
可以調整分配給緩沖區高速緩存的內存量,即
db_block_buffers
可設置分配緩沖區高速緩存的數據塊的個數。緩沖區高速緩存的總字節數
=db_block_buffers
的值
*db_block_size
的值。
db_block_size
的值表示數據塊大小的字節數,可查詢
v$parameter
表:
select name,value from v$parameter where name='db_block_size';
在修改了上述數據庫的初始化參數以后,必須先關閉數據庫,在重新啟動數據庫后才能使新的設置起作用。
IO
問題的發現及解決:
很多的時侯,當應用很慢、數據庫很慢的時侯,我們到數據庫時做幾個示例的
Select
也發現同樣的問題時,有些時侯我們會無從下手,因為我們認為數據庫的各種命種率都是滿足
Oracle
文檔的建議。實際上如今的優化己經向優化等待
(waits)
轉型了,實際中性能優化最根本的出現點也都集中在
IO
,這是影響性能最主要的方面,由系統中的等待去發現
Oracle
庫中的不足、操作系統某些資源利用的不合理是一個比較好的辦法。在移動的測試中,
Sun
的工程師也推薦這樣的做法。
?
第一步:
通過操作系統的一些工具檢查系統的狀態,比如
CPU
、內存、交換、磁盤的利用率,根據經驗或與系統正常時的狀態相比對,有時系統表面上看起來看空閑這也可能不是一個正常的狀態,因為
cpu
可能正等待
IO
的完成。除此之外我們還應觀注那些占用系統資源
(cpu
、內存
)
的進程。
?
1
、如何檢查操作系統是否存在
IO
的問題?使用的工具有
sar,
這是一個比較通用的工具。
Rp1#sar -u 2 10
即每隔
2
秒檢察一次,共執行
20
次。示例返回:
?
Linux 2.4.21-20.ELsmp (YY075) 05/19/2005
10:36:07 AM CPU %user %nice %system %idle
10:36:09 AM all 0.00 0.00 0.13 99.87
10:36:11 AM all 0.00 0.00 0.00 100.00
10:36:13 AM all 0.25 0.00 0.25 99.49
10:36:15 AM all 0.13 0.00 0.13 99.75
10:36:17 AM all 0.00 0.00 0.00 100.00
10:36:17 AM CPU %user %nice %system %idle
10:36:19 AM all 0.00 0.00 0.00 100.00
10:36:21 AM all 0.00 0.00 0.00 100.00
10:36:23 AM all 0.00 0.00 0.00 100.00
10:36:25 AM all 0.00 0.00 0.00 100.00
?
其中的
%usr
指的是用戶進程使用的
cpu
資源的百分比,
%sys
指的是系統資源使用
cpu
資源的百分比,
%wio
指的是等待
io
完成的百分比,這是值得我們觀注的一項,
%idle
即空閑的百分比。如果
wio
列的值很大,如在
35%
以上,說明你的系統的
IO
存在瓶頸,你的
CPU
花費了很大的時間去等待
IO
的完成。
Idle
很小說明系統
CPU
很忙。
當你的系統存在
IO
的問題,可以從以下幾個方面解決
1
、查找
Oracle
中不合理的
sql
語句,對其進行優化。
2
、對
Oracle
中訪問量頻繁的表除合理建索引外,再就是把這些表分表空間存放以免訪問上產生熱點,再有就是對表合理分區。
?
第二步:
關注一下內存,常用的工具便是
vmstat
,對于
hp-unix
來說可以用
glance,Aix
來說可以用
topas,
當你發現
vmstat
中
pi
列非零,
memory
中的
free
列的值很小,
glance,topas
中內存的利用率多于
80%
時,這時說明你的內存方面應該調節一下了,方法大體有以下幾項。
?
1
、劃給
Oracle
使用的內存不要超過系統內存的
1/2,
一般保在系統內存的
40%
為益。
為系統增加內存
2
、如果你的連接特別多,可以使用
MTS
的方式
3
、打全補丁,防止內存漏洞。
?
第三步:
如何找到點用系用資源特別大的
Oracle
的
session
及其執行的語句。
Hp-unix
可以用
glance,top
;
IBM AIX
可以用
topas
;此外可以使用
ps
的命令。通過這些程序我們可以找到占用系統資源特別大的這些進程的進程號,我們就可以通過以下的
sql
語句發現這個
pid
正在執行哪個
sql
,這個
sql
最好在
pl/sql developer,toad
等軟件中執行
,
把
<>
中的
spid
換成你的
spid
就可以了。
SELECT a.username,a.machine,a.program,a.sid,a.serial#,a.status,c.piece,c.sql_text from v$session a,v$process b,v$sqltext c WHERE b.spid='<>' AND b.addr=a.paddr AND a.sql_address=c.address(+)order BY c.piece
我們就可以把得到的這個
sql
分析一下,看一下它的執行計劃是否走索引,對其優化避免全表掃描,以減少
IO
等待,從而加快語句的執行速度。
另一個有用的腳本:查找前十條性能差的
sql:
SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea
order BY disk_reads DESC )where ROWNUM<10 ;
?
注意:在做優化
sql
時,經常碰到使用
in
的語句,這時我們一定要用
exists
把它給換掉,因為
Oracle
在處理
In
時是按
Or
的方式做的,即使使用了索引也會很慢。
(
這個很有用,我在煙草項目中,大量的
not in
操作對大數據量的查詢是相當的慢,改為
exists
后,性能提高
100
倍左右,視圖中的數量級為百萬
)
?
總結
在性能測試中應當指出,由于客戶機、網絡、服務器這
3
個相互依存的組成部分都必須調整和同步才能產生最佳的性能,因此還應根據系統的具體情況,具體分析和調整。本文涉及的
Oracle
調優是數據庫調優的一小部分,希望同事們不斷的補充我們的知識庫。
?
?
?
?