原作者:Bert Scalzo
目前,HP,Compaq,Dell,IBM 以及 Oracle 都在加快速度擁抱 Linux ,這個(gè)開放源碼的操作系統(tǒng)。根據(jù) eWeek 的統(tǒng)計(jì),去年 Linux 服務(wù)器的銷售量大約占據(jù)了 Compaq 的 30%,Dell 的 13.7%,IBM 的 13.5%。而且 IBM 2001年度在 Linux 上的投入有 10 個(gè)億。 Intel 最新的 64 位的 Itanium CPU 只支持四種操作系統(tǒng):Windows, Linux, AIX 和 HP-UX。我們也不要忘記 Oracle 的 9i 數(shù)據(jù)庫(kù) Linux 版本要比 Windows 版本早一個(gè)月。
盡管 Linux 能跑在從 IBM S/390 到 Sun SPARC 結(jié)構(gòu)的服務(wù)器,但是對(duì)于大多數(shù)人來說,Intel 還是 Linux 跑得最多的平臺(tái)。本文就是要講述通過簡(jiǎn)單的性能調(diào)正,使 Oracle 的性能提升 1000% 的辦法。
本文采用的測(cè)試環(huán)境是一臺(tái) Compaq 4 CPU,512 MB ,8 部 7200 rpm SCSI 磁盤的服務(wù)器,然后在幾乎同樣的單 CPU Athlon 系統(tǒng)上作了測(cè)試,內(nèi)存一樣,但是只有一部 7200 rpm 的 Ultra 100 IDE 磁盤。盡管最后的結(jié)果和得到的百分比不一樣,但是觀測(cè)得到的性能提升是一致的。
為了簡(jiǎn)單起見,我們的測(cè)試環(huán)境采用 TPC 基準(zhǔn)測(cè)試,它廣泛地用于 OLTP 的負(fù)荷測(cè)試。Quest 公司有一個(gè)叫做 Benchmark Factory 的工具,使測(cè)試工作變得就像發(fā)送電子郵件一樣簡(jiǎn)單。
下面我們將分別通過 DB 的調(diào)整和 OS 的調(diào)整來看測(cè)試的結(jié)果。
DB1 的初始化參數(shù)一般不常見,為了說明問題,我們使用這些參數(shù)并作為基準(zhǔn)。
DB1: Initial Database
Database Block Size 2K
SGA Buffer Cache 64M
SGA Shared Pool 64M
SGA Redo Cache 4M
Redo Log Files 4M
Tablespaces Dictionary
TPC Results Load Time (Seconds) 49.41
Transactions / Second 8.152
顯然需要加大 SGA 大小,我們來看 DB2 的結(jié)果:
DB2: Cache Pool
Database Block Size 2K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 4M
Redo Log Files 4M
Tablespaces Dictionary
TPC Results Load Time (Seconds) 48.57
Transactions / Second 9.147
增大 SGA 已經(jīng)緩沖看來對(duì)于性能的提升并不顯著,加載時(shí)間只提升了 1.73%。下面我們?cè)黾?SGA 重做日志的大?。?/p>
DB3: Log Buffer
Database Block Size 2K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Dictionary
TPC Results Load Time (Seconds) 41.39
Transactions / Second 10.088 我們可以看到加載時(shí)間提升了 17.35%,TPS 也提升了 9.33%。因?yàn)榧虞d和同時(shí)插入,更新,刪除需要比 8M 大的空間,但是看起來增加內(nèi)存性能并沒有顯著提升,我們加大塊大小:
DB4: 4K Block
Database Block Size 4K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Dictionary
TPC Results Load Time (Seconds) 17.35
Transactions / Second 10.179
我們看到加載時(shí)間提升了 138%!而對(duì) TPS 值沒有很大的影響。下面一個(gè)簡(jiǎn)單的念頭是表空間的管理從目錄切換為本地:
DB5: Local Tablespaces
Database Block Size 4K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Local
TPC Results Load Time (Seconds) 15.07
Transactions / Second 10.425
下面我們把數(shù)據(jù)庫(kù)塊加大到 8K 來看結(jié)果:
DB6: 8K Block
Database Block Size 8K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Local
TPC Results Load Time (Seconds) 11.42
Transactions / Second 10.683
看來結(jié)果并不壞,我們沒有理由繼續(xù)增加塊大小了,我們還沒有根據(jù) CPU 個(gè)數(shù)調(diào)整相應(yīng)的參數(shù),這次我們?cè)O(shè)置 I/O 的進(jìn)程數(shù)來繼續(xù)調(diào)整:
DB7: I/O Slaves
Database Block Size 8K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Local
dbwr_io_slaves 4
lgwr_io_slaves (derived) 4
TPC Results
Load Time (Seconds) 10.48
Transactions / Second 10.717
我們的測(cè)試是基于 Red Hat 6.2 進(jìn)行的,內(nèi)核版本為 2.2.14-5smp。對(duì)于 Linux 的內(nèi)核而言,有將近幾百個(gè)參數(shù)可以調(diào)整,包括對(duì) CPU 類型,SMP 支持,APIC 支持,DMA 支持,IDE DMA 缺省參數(shù)的使用以磁盤限額支持。根據(jù) Oracle 的文檔,我們要做的主要調(diào)整是共享內(nèi)存和信號(hào)量的大小,SHMMAX 最少配置 0x13000000,SEMMNI, SEMMSL 和 SEMOPN 分別至少設(shè)置 100, 512, 100。這些參數(shù)的設(shè)置可以通過下面的命令實(shí)現(xiàn):
# echo 0x13000000 >/proc/sys/kernel/shmmax
# echo 512 32000 100 100 >/proc/sys/kernel/sem
OS1: 單內(nèi)核和 IPC
TPC Results
Load Time (Seconds) 9.54
Transactions / Second 11.511
我們有理由相信采用新的內(nèi)核版本(2.2.16-3smp)也應(yīng)該有性能的提升:
OS2: Newer minor version kernel TPC Results
Load Time (Seconds) 9.40
Transactions / Second 11.522
目前已經(jīng)有 2.4 版本的內(nèi)核,和 2.2 相比,性能上有了很大的提升,我們采用 2.4.1smp:
OS3: Newer major version kernel TPC Results
Load Time (Seconds) 8.32
Transactions / Second 12.815
Linux 缺省讀操作時(shí)更新最后一次讀的時(shí)間,但是這個(gè)對(duì)我們來說并不重要,因此我們關(guān)閉這個(gè)選項(xiàng),通過設(shè)置 noatime 的文件屬性來實(shí)現(xiàn)。(對(duì)于 Win NT 和 2000 有相似的設(shè)置)
如果只是相對(duì) Oracle 的數(shù)據(jù)文件設(shè)置,我們的命令是
chattr +A file_name
對(duì)整個(gè)目錄的實(shí)施辦法:chattr -R +A directory_name
最好的辦法是修改 /etc/fstab ,針對(duì)每個(gè)文件系統(tǒng)入口,添加 noatime 關(guān)鍵字。
OS4: noatime file attribute
TPC Results
Load Time (Seconds) 5.58
Transactions / Second 13.884
另外一個(gè)調(diào)整 Linux I/O 的辦法是虛擬內(nèi)存子系統(tǒng)的調(diào)整,修改 /ect/sysctl.cong 文件,增加下面一行:
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
根據(jù) /usr/src/Linux/Documentation/sysctl/vm.txt 的說法:
第一個(gè)參數(shù)100 %:控制緩沖區(qū)中最大的臟緩沖數(shù)據(jù),增加這個(gè)值意味著 Linux 可以延遲磁盤寫。
第二個(gè)參數(shù) 1200 ndirty:給出 bdflush 一次能夠?qū)懭氪疟P的最大臟緩沖。
第三個(gè)參數(shù) 128 nrefill:當(dāng)調(diào)用 refill_freelist() 時(shí),bdflush 添加到自由緩沖區(qū)中的最大緩沖數(shù)目。
refill_freelist() 512:當(dāng)這個(gè)數(shù)目超過 nref_dirt 臟緩沖時(shí),將喚醒 bdflush。
第五個(gè) 15 和最后兩個(gè)參數(shù) 1884 和 2,系統(tǒng)未使用,我們不做修改。
age_buffer 50*HZ, age_super 參數(shù) 5*HZ:控制 Linux 把臟緩沖寫到磁盤的最多等待時(shí)間。數(shù)值用時(shí)鐘滴答數(shù)(jiffies)表示,每秒為 100 個(gè) jiffies 。
OS5: bdflush settings TPC Results
Load Time (Seconds) 4.43
Transactions / Second 14.988
經(jīng)過以上一系列調(diào)整后,我們得到的最終加載時(shí)間減少了 1015.35%,TPS 增加
下面是其他網(wǎng)友的補(bǔ)充
淺談Oracle 性能優(yōu)化
基于大型Oracle數(shù)據(jù)庫(kù)應(yīng)用開發(fā)已有6個(gè)年頭了,經(jīng)歷了從最初零數(shù)據(jù)演變到目前上億級(jí)的數(shù)據(jù)存儲(chǔ)。在這個(gè)經(jīng)歷中,遇到各種各樣的性能問題及各種性能優(yōu)化。
在這里主要給大家分享一下數(shù)據(jù)庫(kù)性能優(yōu)化的一些方法和見解。
1、服務(wù)器要求及配置
服務(wù)器處理器性能很關(guān)鍵,CPU的主頻要高,要有較大的內(nèi)存,IO讀寫速度塊。
如何驗(yàn)證一臺(tái)服務(wù)器的IO讀寫效率如何了,可以通過IOPS這個(gè)指標(biāo)來衡量。普及一下IOPS的定義:IOPS (Input/Output Operations Per Second),即每秒進(jìn)行讀寫(I/O)操作的次數(shù),多用于數(shù)據(jù)庫(kù)等場(chǎng)合,衡量隨機(jī)訪問的性能。目前SSD硬盤的IOPS基本是萬(wàn)級(jí)別。但相對(duì)的成本也是比較高的。
在Oracle數(shù)據(jù)使用場(chǎng)景中,可以實(shí)現(xiàn)如下語(yǔ)句來查看當(dāng)前服務(wù)器的IOPS:
declare
max_iops_out pls_integer ;
max_mbps_out pls_integer ;
actual_latency_out pls_integer ;
begin
dbms_resource_manager.calibrate_io(
max_iops=>max_iops_out,
max_mbps=>max_mbps_out,
actual_latency=>actual_latency_out);
dbms_output.put_line('max_iops = ' || max_iops_out
|| ',max_mbps = ' || max_mbps_out
|| ',actual_latency = ' || actual_latency_out);
end;
2、Oracle系統(tǒng)級(jí)的優(yōu)化
這里主要是針對(duì)ORACLE核心的優(yōu)化,包括Oracle內(nèi)存設(shè)置、文件大小、日志文件大小、回滾日志及各種系統(tǒng)級(jí)參數(shù)的設(shè)定。
那么如何發(fā)現(xiàn)目前的設(shè)置是否合理了,
A、在Oracle中提供一個(gè)性能分析報(bào)告AWR和ASH報(bào)告.可以通過命令來獲取該份報(bào)告。里面涉及到各種指標(biāo)值:內(nèi)存設(shè)定是否合理、影響ORACLE慢的幾大因素,數(shù)據(jù)文件讀寫速度等。
B、也可以通過ORALCE-EM中的性能模塊,來檢測(cè)每個(gè)時(shí)間節(jié)點(diǎn)ORALCE的運(yùn)行情況,從中捕獲那些耗資源的SQL語(yǔ)句,從而進(jìn)行優(yōu)化。
3、Oracle SQL語(yǔ)句的優(yōu)化
數(shù)據(jù)庫(kù)在百萬(wàn)級(jí)別,遇到的任何性能問題時(shí),均可以通過SQL語(yǔ)句的優(yōu)化。優(yōu)化的層面有2種:
1、通過索引,這種優(yōu)化的速度最快,而且見效也很明顯。索引的合理使用我就不在這里敘述,網(wǎng)上很多。
2、通過更改SQL語(yǔ)句的查詢邏輯和算法。有一個(gè)比較很效的原則是:先過濾小的結(jié)果集,然后通過這個(gè)小的結(jié)果集和其他表做關(guān)聯(lián)。
在這里希望大家可以提提一些其他觀點(diǎn)或不同看法。
您可能感興趣的文章:- oracle 性能優(yōu)化建議小結(jié)
- Oracle性能究極優(yōu)化
- Oracle性能究極優(yōu)化 下
- Oracle之SQL語(yǔ)句性能優(yōu)化(34條優(yōu)化方法)
- Oracle 查詢優(yōu)化的基本準(zhǔn)則詳解
- Oracle 數(shù)據(jù)庫(kù)優(yōu)化實(shí)戰(zhàn)心得總結(jié)
- oracle下一條SQL語(yǔ)句的優(yōu)化過程(比較詳細(xì))
- oracle數(shù)據(jù)庫(kù)sql的優(yōu)化總結(jié)
- Oracle SQL性能優(yōu)化系列學(xué)習(xí)一
- Linux中大內(nèi)存頁(yè)Oracle數(shù)據(jù)庫(kù)優(yōu)化的方法