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