在SAP應(yīng)用環(huán)境下建議將以上參數(shù)設(shè)置為:
vmo -p -o strict_maxclient=0
vmo -p -o lru_file_repage=0
vmo -p -o minperm%=3
vmo -p -o maxclient%=8
vmo -p -o maxperm%=8
vmo -p -o minfree=[CPU數(shù)量]*120
vmo -p -o maxfree=[CPU數(shù)量]*128
如果CPU數(shù)量是12,則minfree=1440, maxfree=1536
使用AIX 并行I/O (Concurrent I/O) 來(lái)提高數(shù)據(jù)庫(kù)的性能
內(nèi)容提要:
AIX 5L v5.2.0.10( 或稱作AIX 5L v5.2 ML01) 在增強(qiáng)的日志文件系統(tǒng)(JFS2) 上引入了并行I/O (Concurrent I/O) 的新的功能。在許多應(yīng)用環(huán)境下,這一新的功能可提高文件系統(tǒng)訪問(wèn)的性能,尤其對(duì)于關(guān)系型數(shù)據(jù)庫(kù)的應(yīng)用。在JFS2 的文件系統(tǒng)上采用并行I/O (Concurrent I/O) 技術(shù)后,可以得到與采用裸設(shè)備相似的性能。本文將對(duì)并行I/O (Concurrent I/O) 做一個(gè)簡(jiǎn)要的介紹并給出在Oracle 9i 數(shù)據(jù)庫(kù)上進(jìn)行性能比較的結(jié)果。
說(shuō)明:
1. 簡(jiǎn)介
文件系統(tǒng)長(zhǎng)久以來(lái)一直是UNIX 存儲(chǔ)管理的核心,UNIX 的用戶通過(guò)系統(tǒng)命令和系統(tǒng)接口對(duì)存儲(chǔ)在文件系統(tǒng)上的數(shù)據(jù)進(jìn)行操作和管理。文件系統(tǒng)的使用提供了對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)的有效手段。
如同使用其它方式一樣,文件系統(tǒng)的使用是對(duì)于性能與易用性平衡的結(jié)果。在應(yīng)用和磁盤之間傳輸數(shù)據(jù)最快的方式是直接進(jìn)行訪問(wèn),如使用裸設(shè)備。而使用文件系統(tǒng)來(lái)存數(shù)數(shù)據(jù)會(huì)產(chǎn)生很多額外開銷,如串行訪問(wèn),緩存和數(shù)據(jù)拷貝。這些都將對(duì)性能產(chǎn)生影響。使用裸設(shè)備進(jìn)行數(shù)據(jù)的存儲(chǔ)雖然能減少這些額外開銷,但對(duì)用戶的技術(shù)水平要求較高,而且不同應(yīng)用程序?qū)β阍O(shè)備的使用方式也不同,需要對(duì)用戶進(jìn)行額外的培訓(xùn)。但由于對(duì)裸設(shè)備進(jìn)行訪問(wèn)的高性能,傳統(tǒng)上來(lái)說(shuō),數(shù)據(jù)庫(kù)的應(yīng)用程序更希望使用裸設(shè)備而不是文件系統(tǒng)。
在JFS2 文件系統(tǒng)上采用并行I/O (Concurrent I/O) 技術(shù)后,數(shù)據(jù)庫(kù)用應(yīng)用可以得到與采用裸設(shè)備相似的性能。
2. 數(shù)據(jù)庫(kù)應(yīng)用
對(duì)于數(shù)據(jù)庫(kù)應(yīng)用來(lái)說(shuō),之所以采用裸設(shè)備比采用文件系統(tǒng)具有更好的I/O 性能,主要是由于文件系統(tǒng)的一些特性:
▲文件緩存
▲文件寫保護(hù)鎖或inode 鎖
▲系統(tǒng)的sync 進(jìn)程
這些文件系統(tǒng)的特性可以幫助保護(hù)數(shù)據(jù)的一致性,提高容錯(cuò)能力,事實(shí)上在許多情況下提高系統(tǒng)的性能。然而這些特性卻經(jīng)常對(duì)于數(shù)據(jù)庫(kù)的應(yīng)用的性能產(chǎn)生負(fù)面的影響。本文將解釋文件系統(tǒng)中這些特性的作用,并介紹在JFS2 上的新功能如何消除它們對(duì)性能的影響。
2.1 文件緩存
從最基本的層面來(lái)說(shuō),文件就是在介質(zhì)上所存儲(chǔ)一些二進(jìn)制位的集合,當(dāng)一個(gè)進(jìn)程需要從某個(gè)文件訪問(wèn)數(shù)據(jù)的時(shí)候,操作系統(tǒng)將這些數(shù)據(jù)讀入內(nèi)存,然后此進(jìn)程可以對(duì)數(shù)據(jù)進(jìn)行操作,最后將處理完的數(shù)據(jù)寫入磁盤。操作系統(tǒng)能夠從磁盤上直接讀出或?qū)懭霐?shù)據(jù),但是由于磁盤較慢的訪問(wèn)速度,這些操作的響應(yīng)速度和吞吐率都較差。因此操作系統(tǒng)試圖通過(guò)文件緩存的技術(shù),即在內(nèi)存中緩存數(shù)據(jù)的方法,來(lái)減少對(duì)磁盤的訪問(wèn)頻率。當(dāng)進(jìn)程需要從文件中讀取數(shù)據(jù)的時(shí)候,操作系統(tǒng)首先試圖從文件緩存中讀取所需要的數(shù)據(jù),如果這些數(shù)據(jù)不在文件緩存中,那么從磁盤上文件系統(tǒng)的文件中讀取,同時(shí)將這些數(shù)據(jù)緩存在文件緩存中。如圖1 和圖2 所示:
圖1 讀操作- 數(shù)據(jù)在文件緩存中(命中)
圖2 讀操作- 數(shù)據(jù)不在文件緩存中(沒(méi)有命中)
與讀數(shù)據(jù)相似,當(dāng)寫數(shù)據(jù)時(shí)數(shù)據(jù)寫入文件緩存,因此將來(lái)需要再讀取這些數(shù)據(jù)時(shí),不需要訪問(wèn)磁盤,同時(shí)也降低了寫磁盤的頻率。當(dāng)緩存的命中率高時(shí),使用文件緩存將是非常有效的。并且可以采用預(yù)先讀取和延遲寫的技術(shù)來(lái)減少磁盤訪問(wèn)的頻率。文件緩存所帶來(lái)的另一個(gè)好處是,以異步的方式進(jìn)行寫操作,這使得應(yīng)用可以繼續(xù)運(yùn)行,而不用等待數(shù)據(jù)寫入磁盤操作的完成,如圖3 所示。
雖然文件緩存提高了I/O 的性能,但是它消耗了大量的系統(tǒng)內(nèi)存。AIX JFS2 文件系統(tǒng)允許系統(tǒng)管理員控制可以作為文件緩存的最大內(nèi)存數(shù)。這種控制通過(guò)maxclient% 參數(shù)控制。系統(tǒng)管理員可以使用vmo 命令來(lái)調(diào)整maxclient% 參數(shù)。maxclient% 的卻省值是80 ,其含義是80%
的物理內(nèi)存能夠作為文件緩存。maxclient% 參數(shù)的取值可在1 至100 之間變動(dòng)。如可以采用以下命令設(shè)置最多50% 的系統(tǒng)物理內(nèi)存能夠作為文件緩存:vmo ?Co maxclient%=50 。
圖3 寫操作
與此相對(duì)應(yīng),裸設(shè)備不使用系統(tǒng)內(nèi)存來(lái)緩存應(yīng)用的數(shù)據(jù),所以沒(méi)有以上圖示的操作。
2.1.1 直接存?。―irect I/O )
一些應(yīng)用程序并不能從文件緩存中得到好處,如有些進(jìn)行大量科學(xué)運(yùn)算的程序,從不訪問(wèn)以前訪問(wèn)過(guò)的數(shù)據(jù),而且由于他們對(duì)數(shù)據(jù)進(jìn)行順序訪問(wèn),這使得文件緩存的命中率非常低。數(shù)據(jù)庫(kù)的應(yīng)用通常在應(yīng)用層上有自己的數(shù)據(jù)緩存技術(shù),所以不需要操作系統(tǒng)進(jìn)行文件緩存。在這種情況下,使用文件緩存會(huì)產(chǎn)生很多額外開銷,因?yàn)閿?shù)據(jù)首先從磁盤被讀入系統(tǒng)的文件緩存,然后從文件緩存拷貝到應(yīng)用的緩存中,這被稱為“重復(fù)拷貝”(double-copying ),重復(fù)拷貝增加了額外的CPU 開銷,并且相同的數(shù)據(jù)同時(shí)在文件緩存和應(yīng)用的緩存中,增加了內(nèi)存的消耗。
JFS2 的直接存取(Direct I/O )技術(shù)可以使應(yīng)用程序的數(shù)據(jù)被系統(tǒng)的文件緩存忽略。當(dāng)使用Direct I/O 時(shí),數(shù)據(jù)直接從磁盤讀取到應(yīng)用程序的緩存中,而不是用系統(tǒng)的文件緩存。圖4 和圖5 說(shuō)明了在Direct I/O 下的讀、寫操作。
圖4 Direct I/O 的讀操作
圖5 Direct I/O 的寫操作
2.1.1.1 Direct I/O 的設(shè)置方法
Direct I/O 可以通過(guò)兩種方式實(shí)現(xiàn),一是通過(guò)在mount 文件系統(tǒng)時(shí)加 ?Co dio 的參數(shù),即 mount ?Co dio /fs 。二是在調(diào)用open() 函數(shù)打開一個(gè)文件時(shí)加O_DIRECT 參數(shù)。當(dāng)一個(gè)文件系統(tǒng)在mount 時(shí)使用了?Co dio 的參數(shù),此文件系統(tǒng)的所有文件缺省都會(huì)使用Direct I/O ,你也可以通過(guò)namefs 使得Direct I/O 只對(duì)文件系統(tǒng)中某個(gè)子目錄中的文件起作用。例如:文件系統(tǒng)somefs 中有一些文件希望使用Direct I/O 功能,但是其它文件并不希望使用,你可以創(chuàng)建一個(gè)子目錄subsomefs ,將所有希望使用Direct I/O 功能的文件放入這個(gè)子目錄,在mount somefs 時(shí)不使用-o dio 參數(shù),然后用mount ?Cv namefs ?Co dio /somefs/subsomefs /somefs 命令mount subsomefs 。
Direct I/O 對(duì)應(yīng)用程序I/O 的邊界(alignment )和塊大小(length )有限制,表1 列出了JFS2 對(duì)此的要求,如果應(yīng)用的I/O 不滿足此要求,所有的I/O 操作會(huì)按傳統(tǒng)的方式(文件緩存)的方式進(jìn)行,但當(dāng)數(shù)據(jù)被傳輸?shù)綉?yīng)用的緩存后,系統(tǒng)緩存中的拷貝會(huì)被拋棄。當(dāng)使用Direct I/O 時(shí),文件系統(tǒng)的預(yù)讀功能將不會(huì)起作用。
表1 JFS 對(duì)Direct I/O 的限制