Informix數(shù)據(jù)庫中異步I/O的應(yīng)用
Informix數(shù)據(jù)庫系統(tǒng)在銀行、保險(xiǎn)等行業(yè)里有著廣泛的應(yīng)用,鑒于銀行和保險(xiǎn)業(yè)務(wù)的特殊性,這些行業(yè)對于數(shù)據(jù)庫都有較高的要求,因?yàn)閿?shù)據(jù)庫的性能直接關(guān)系到整個(gè)應(yīng)用的好壞。提高數(shù)據(jù)庫性能的方法很多, 這里介紹一種數(shù)據(jù)庫與操作系統(tǒng)密切結(jié)合的應(yīng)用——異步輸入輸出(AIO,Synchronous Input/Output),使用這種方式可以有效地緩解數(shù)據(jù)庫的I/O瓶頸,從而提高數(shù)據(jù)庫的整體性能。
異步I/O的特點(diǎn)
對系統(tǒng)發(fā)出I/O請求通常有兩種方式: 同步I/O請求和異步I/O請求。同步I/O請求利用系統(tǒng)的緩沖區(qū)進(jìn)行數(shù)據(jù)處理,當(dāng)一個(gè)I/O操作執(zhí)行時(shí),應(yīng)用程序必須等待,直到I/O操作執(zhí)行完畢。而異步I/O操作是在后臺執(zhí)行,I/O操作和應(yīng)用程序可以同時(shí)運(yùn)行,從而增大了I/O流量,提高了系統(tǒng)性能。如果應(yīng)用程序是對裸設(shè)備(Raw Device)進(jìn)行操作, 則這種優(yōu)勢更加明顯,因?yàn)槭褂寐阍O(shè)備避免了操作系統(tǒng)的介入,數(shù)據(jù)在數(shù)據(jù)庫系統(tǒng)的管理下,不經(jīng)過系統(tǒng)的緩沖區(qū)直接在磁盤和數(shù)據(jù)庫的緩沖區(qū)之間進(jìn)行傳輸。對于讀寫頻繁、I/O成為瓶頸的數(shù)據(jù)庫系統(tǒng)來說,使用異步I/O可以有效地提高系統(tǒng)的性能。
在Informix Dynamic Server(IDS)中采用異步I/O有兩種方法: AIO虛擬處理機(jī)方式(CPU Virtual Processor,AIO VP)和核心AIO(Kernel Asynchronous Input/Output,KAIO)方式。核心AIO通過操作系統(tǒng)進(jìn)行無阻塞的磁盤讀寫,改進(jìn)I/O操作的性能。IDS中若使用KAIO,由進(jìn)程內(nèi)CPU虛擬處理機(jī)(CPU VP)服務(wù),而不是由AIO虛擬處理機(jī)服務(wù)。KAIO通常比AIO虛擬處理機(jī)有更好的性能,一般在沒有實(shí)現(xiàn)KAIO或?qū)ool Device進(jìn)行I/O時(shí),才用AIO虛擬處理機(jī)的方式負(fù)責(zé)進(jìn)行數(shù)據(jù)庫的I/O。
在Informix數(shù)據(jù)庫使用KAIO,要考慮下列因素:
操作系統(tǒng)的支持 在Informix Dynamic Server(IDS)產(chǎn)品中,除了低版本的(現(xiàn)已經(jīng)基本淘汰)外,都提供了對KAIO的支持。但是要想利用此功能,只有數(shù)據(jù)庫的支持還不行,還要有操作系統(tǒng)的支持。
系統(tǒng)性能 使用KAIO的主要目的是提高數(shù)據(jù)庫的I/O性能,若系統(tǒng)沒有I/O瓶頸,則沒有必要開啟此項(xiàng)功能。
對裸設(shè)備進(jìn)行I/O 這是使用KAIO提高I/O性能的物質(zhì)基礎(chǔ)。
異步I/O的配置
AIO VP在操作系統(tǒng)中不需要做特殊配置,只需在Informix的Onconfig文件中配置NumAIOVPS參數(shù)即可。而KAIO方式需要對操作系統(tǒng)和數(shù)據(jù)庫進(jìn)行配置,下面以SCO OpenServer 5.0.5為例說明操作系統(tǒng)的配置:
1.打開AIO的驅(qū)動(dòng)。在默認(rèn)的情況下,AIO是關(guān)閉的,必須使用命令進(jìn)行配置才能開啟它。方法是以超級用戶(root)注冊,執(zhí)行命令“#mkdev aio”或“scoadmin”將AIO加入到系統(tǒng)核心中,系統(tǒng)將自動(dòng)重新構(gòu)造內(nèi)核。
2.開啟SUDS驅(qū)動(dòng)。在AIO中要使用SUDS庫中POS2X.1b規(guī)定可以使用的函數(shù),必須先啟動(dòng)SUDS的驅(qū)動(dòng)程序。具體方法如下:
(1)編輯/etc/conf/sdevices.d文件,將其中第二個(gè)字段的“N”改為“Y”。
(2)進(jìn)入/etc/conf/cf.d目錄,執(zhí)行命令“#./link_unix ”重新連接核心,然后重新引導(dǎo)系統(tǒng)。
(3)使用suds_ctrl命令確定Informix用戶組有權(quán)限使用suds庫中的函數(shù)??梢允褂妹?ldquo;#suds_ctrl -a gid”,這里gid是Informix用戶組組號,可在/etc/group文件中查閱。為了使用方便,通常的做法是在/etc/rc2.d目錄下建立一個(gè)包含此命令的以大寫字母“S”開頭為文件名的文件(例如S99start_suds)。
(4) 調(diào)整與AIO相關(guān)的內(nèi)核參數(shù)。
與AIO相關(guān)的內(nèi)核參數(shù)有:NAIOPROC、NAIOREQ、NAIOBUF、NAIOHBUF、NAIOREQPP、NAIOLOKTBL,其具體含義讀者可查閱相關(guān)資料。根據(jù)筆者的經(jīng)驗(yàn),其缺省值偏小,建議將這些參數(shù)增大,其調(diào)整方法是編輯/etc/conf/cf.d/mtune文件。調(diào)整完畢,需要重新連接核心并重新引導(dǎo)系統(tǒng)。調(diào)整結(jié)果如下(括號內(nèi)為缺省值):
NAIOPROC | 50(5) | 1 | 500(16) |
AIORE1 | 400(120) | 5 | 4000(200) |
NAIOBUF | 400(120) | 5 | 4000(200) |
NAIOHBUF | 100(25) | 1 | 1000(50) |
NAIOREQPP | 400(120) | 30 | 4000(200) |
NAIOLOCKTAB | 50(10) | 5 | 500(20) |
在Informix中KAIO要進(jìn)行如下配置:
1.用戶環(huán)境變量的調(diào)整。缺省情況下KAIO是關(guān)閉的,激活的方法是:
KAIOON=1; 1-打開,0-關(guān)閉
export KAIOON (for Bourne or Korn Shell)
setenv KAIOON 1 (for C Shell)
2.Onconfig配置文件中有關(guān)參數(shù)的調(diào)整。與此相關(guān)的參數(shù)是NumAIOVPS,它表明處理磁盤I/O的虛擬處理器AIO類的虛擬處理器數(shù)目。如果系統(tǒng)中使用KAIO而且沒有Cool Device,則將NumAIOVPS設(shè)置為1或2(小型系統(tǒng)設(shè)置為1,較大系統(tǒng)設(shè)置為2),如果有Cool Device或系統(tǒng)不支持KAIO,這時(shí)系統(tǒng)使用AIO VP方式進(jìn)行數(shù)據(jù)I/O,可將NumAIOVPS設(shè)置為系統(tǒng)中活動(dòng)磁盤數(shù)的兩倍。
異步I/O的監(jiān)測
在完成異步I/O的配置后,還需要對其實(shí)際運(yùn)行狀況進(jìn)行監(jiān)測。要查看操作系統(tǒng)中AIO的運(yùn)行狀態(tài),可以用root用戶注冊,執(zhí)行命令“#aioinfo”,該命令可以返回AIO配置和使用的信息和內(nèi)部統(tǒng)計(jì)表。要監(jiān)測AIO的請求情況可以執(zhí)行命令“sar -O m n”,它表示每隔m秒檢測一次,共檢測n次。如果監(jiān)測AIO的buffer使用情況,可以執(zhí)行命令“sar -h m n ”。如果要在Informix數(shù)據(jù)庫下監(jiān)測AIO的運(yùn)行,可以執(zhí)行下列命令查看AIO的相關(guān)情況:“onstat -g ***”,這里“***”可以是“ath”、“iob”、“ioq”等。
當(dāng)然,在SCO OpenServer 5下使用KAIO也存在一定局限性。比如,在使用KAIO時(shí),操作系統(tǒng)對物理內(nèi)存中的內(nèi)存段加鎖,并且標(biāo)記為只能為KAIO程序使用。一旦內(nèi)存段被加鎖,它將不能被操作系統(tǒng)選為頁交換的內(nèi)存使用,對于內(nèi)存不大的系統(tǒng)將導(dǎo)致內(nèi)存不足。另外,要特別提醒讀者的是,如果IDS的Server端和Client端的環(huán)境變量KAIOON不一致(即KAIOON不是同時(shí)打開或同時(shí)關(guān)閉),啟動(dòng)數(shù)據(jù)庫后在Client端運(yùn)行onstat命令時(shí),可能產(chǎn)生錯(cuò)誤的輸出。具體情況如下表:
說明:oninit對應(yīng)KAIO是“on”,代表Server端數(shù)據(jù)庫啟動(dòng)時(shí)打開了KAIO功能,“off”則表示關(guān)閉了KAIO功能;onstat對應(yīng)KAIO是“on”,代表Client端數(shù)據(jù)庫啟動(dòng)時(shí)打開了KAIO功能,off則表示關(guān)閉了KAIO功能;error from onstat 對應(yīng)“NO”,表示onstat命令的輸出是正確的,“YES”則表示輸出是錯(cuò)誤的。