天天看點

Informix資料庫調優

Informix IDS資料庫廣泛的應用在金融、電信和郵政等各個行業中,它是一個多線程的關系資料庫伺服器,采用對稱的多處理器技術和單處理器體系結構,并具有先進的技術、性能與高可靠性和高可用性。它為使用者提供了動态系統管理工具來監控和管理資料庫伺服器。随着資料庫數量的增加和應用處理交易量的增多,它的運作效率顯得尤為突出。在硬體環境不變的情況下,資料庫性能的提高也一直成為大家關注的話題。

資料庫系統性能通常與CPU、共享記憶體、資料的存儲和網絡設定等四個方面有直接的關系。下面着重介紹通過配置Informix IDS參數和監控Informix IDS運作效率,來提高資料庫的性能。

虛拟處理器參數的調整和監控

Informix IDS對于虛拟處理器的分類,達到了十多種,每個虛拟處理器像作業系統的一個CPU允許多個程序服務于多個使用者一樣,也可以運作多個線程來為多個 SQL 客戶機應用程式提供服務。其中最重要的虛拟處理器是CPU、AIO、網絡處理器三種,在這三種伺服器中,CPU虛拟處理器(CPU VP)是最重要的,它驅動其他虛拟處理器,如磁盤 I/O 虛拟處理器(AIO VP)和 IDS 會話中的所有線程。AIO VP的功能是在 SQL 語句通路或更新資料庫資料時,執行磁盤 I/O。網絡處理器涉及到資料庫伺服器的客戶機或使用者連接配接。可以進行兩種類型的連接配接:共享記憶體連接配接和網絡連接配接。下面分别介紹這三種類型的參數。

1.CPU虛拟處理器(CPU VP)的參數

NUMCPUVPS:定義了Informix IDS 開始啟動的CPU VP的數量。一般情況下不能超過系統CPU的個數,對于單或雙CPU的計算機系統,建議設定NUMCPUVPS是1或者2,即使用一個或兩個CPU VP;對于有4個以上CPU,建議設定NUMCPUVPS的值等于處理器總數減1。

SINGLE_CPU_VP:定義了多CPU VP(0)和單CPU VP(1)設定。

MULTIPROCESSOR:定義了多個CPU VP(1)還是單個CPU VP(0)。

AFF_NPROCS:定義了可以綁定到CPU VP的CPU的數目。

AFF_SPROC:定義了把連續的幾個CPU(AFF_NRPOCS參數定義的值)中第一個CPU的序号連接配接到CPU VP上。

例如,某個Informix IDS系統所在的硬體平台有4個CPU,AFF_NPROCS設定為3(即可用于綁定CPUVP的CPU有3個),NUMCPUVPS設定為3,AFF_SPROC設定為1,則3個CPUVP需要綁定到CPU上,是從第2個CPU開始,綁定到第二、三、四個CPU上。SINGLE_CPU_VP設定為0。

2.對于磁盤I/O虛拟處理器(AIO VP)的配置

NUMAIOVP 指定系統上 AIO/KAIO 虛拟處理器的數目,如果Informix IDS采用裸裝置存儲,可以設定成2。

在Informix IDS9.2以後的版本中将NUMCPUVPS、NOAGE、AFF_NPROCS、AFF_SPROC、NUMAIOVP用VPCLASS參數代替。當Informix IDS處于online的狀态下,可以使用onmode -p (+/-)#來增加或者減少虛拟處理器。#代表增加或者減少虛拟處理器的個數。

3.對于網絡處理器參數的配置

NETTYPE:定義了Informix IDS的連接配接類型和連接配接可以連接配接的輪詢線索數目。如果sqlhosts檔案中支援一個以上的接口或協定的連接配接,就必須對每個連接配接類型規定獨立的NETTYPE參數。

輪詢線索可以在兩類VP上運作:NET VP和CPUVP。為得到最佳性能,Informix建議使用NETTYPE表項為CPU VP類隻配置設定一個輪詢線索,将其餘輪詢線索輪詢線索配置設定給NET VP。配置設定給任何一種連接配接類型的輪詢線索不得超過NUMCPUVPS的取值。

NETTYPE的配置格式如下:NETTYPE connection_type,poll_threads,c_per_t,vp_class 。其中,connection_type 辨別輪詢線索配置設定的連接配接協定;poll_threads是配置設定給該連接配接類型的輪詢線索數目,對任何連接配接類型,這個值不能超過NUMCPUVPS值;c_per_t 是每個輪詢線索的連接配接數目,可以用如下公式計算這個值:c_per_t=connections/poll_threads;connections 是所希望指定的連接配接類型支援的最大連接配接數。對于共享記憶體連接配接(ipcshm),該值應該加倍以獲得最好的性能;vp_class 是可運作輪詢線索的VP類,如果CPU VP上隻運作一個輪詢線索,那麼指定為CPU VP。

在對虛拟處理器的監控中,可以通過系統的一些指令,也可以通過資料庫的一些指令,常用的資料庫指令是onstat-grea和onstat -g ioq。

以下是onstat -g rea的輸出:

/usr/informix >onstat -g rea

Informix Dynamic Server Version 9.30.FC5 -- On-Line -- Up 36 days 00:22:32 -

- 5352416 Kbytes

Ready threads:

tid tcb rstcb prty status vp-class name

onstat -g rea監控了就緒隊列中的線程數目。包括準備運作而且在等待資源的線程。理想的狀态下是輸出極少的條目或者不顯示任何條目。如果輸出的某種 VP 類條目持續增長, 那麼就要考慮在該類中添加VP。

在onstat-g iog指令的輸出中,最需要關注的列是len列。len列的值應該總是為 0 或接近于 0。如果該列的值很高并持續增長,那麼我們可能需要添加另一個 AIO/KAIO 虛拟處理器來減少磁盤 I/O 負載。

監控虛拟處理器的方法比較多,可以使用Informix IDS查詢語句在系統表中找到虛拟處理器的使用情況:還可以在Unix作業系統中使用系統指令sar、top等來監控作業系統的CPU使用情況;還可以在一段時間内的重複執行Informix IDS指令onstat-g glo來監控各個虛拟處理器已占用的CPU資源。判斷CPU的忙閑。

記憶體使用效率的參數調整和監控

Informix IDS 使用的記憶體部分被資料庫伺服器線程以及其他使用者和虛拟程序共享,是以這部分的記憶體叫做共享記憶體,共享記憶體減少磁盤 I/O, 提供了最快地進行程序間通信的方法,還可以使資料庫伺服器減少總的記憶體使用。

Informix IDS共享記憶體分為四個部分:駐留部分、虛處理部分、消息部分和虛拟擴充區部分,其中消息部分隻有在客戶機和伺服器采用共享記憶體方式連接配接時才有,而且尺寸很小。虛拟擴充區也極小,它包含了用于 DataBlade 子產品的線程 heaps 和其他在使用者定義的虛拟處理器中運作的使用者定義例程。

1.駐留記憶體部分的參數

駐留記憶體部分又可以細分為:共享記憶體頭、緩沖區,邏輯日志緩沖區、實體日志緩沖區、鎖。

共享記憶體頭在共享記憶體中包含所有其他結構的描述,還包含到這些結構位置的指針共享記憶體頭是在初始化 Informix IDS 時建立的,并且不能進行調優。

緩沖區存儲 Informix IDS 從 dbspace 所讀取的資料,是資料庫對象資料,如表的資料或索引資料。緩沖區占用了駐留記憶體中最大的部分。所有的緩沖區被組織到一個較長的最近最少使用(least-recently-used,LRU)緩沖區隊列中,并通過最近最少使用(LRU)機制進行管理。定義緩沖區的參數是BUFFERS。稱作指定共享記憶體緩沖區的最大數目,該參數對資料庫I/O和事務處理吞吐量有明顯的影響。但是,如果配置設定過多的緩沖區會影響到作業系統的記憶體并導緻過多的交換記憶體頁面的活動。一般建議設定為實體記憶體的20%到25%。

邏輯日志緩沖區是用來存儲最後一次備份開始的邏輯日志記錄的。邏輯日志記錄儲存了 SQL 語句對資料庫資料進行的修改。在初始化Informix IDS 時,它建立三個邏輯日志緩沖區,以循環方式運作,來確定将獲得的每一條邏輯日志記錄都被重新整理到磁盤中。LOGBUFF定義了邏輯日志緩沖區的數量,緩沖區的大小決定了它被添滿的頻率,進而決定了它必須被重新整理到硬碟上的邏輯檔案中的頻率。一般情況下,Informix IDS建議設定為16KB或32KB

實體日志緩沖區在Informix IDS修改或着删除記錄之前,将該記錄的原始值存入到實體日志緩沖區中,在事務失敗時,用于恢複資料,以保持資料的一緻性。在Informix IDS初始化時,建立了兩個實體日志緩沖區,也以循環的方式運作。與實體日志緩沖區對應的參數是PHYSBUFF。

鎖包含可用鎖的數量,每個使用者對資料庫的連接配接并執行資料庫的操作,都需要一定數量的鎖。在Informix IDS9.2以後的版本中,當使用者的鎖不夠時,可以動态的配置設定鎖的數量。在以前的版本中,該數值是固定不變的。與鎖對應的參數是LOCKS。一般情況下設定為2000到8000000個。

2.共享記憶體虛拟存儲區的參數

共享記憶體虛拟存儲區存儲各種各樣的不同資料,可以分為:内部表、較大的緩沖區、會話資料、線程資料(堆棧和堆)、資料分布緩存器、字典緩存器、SPL 例程緩存器、SQL 語句緩存器、排序池、全局池。

影響虛拟存儲區的參數是:SHMADD、SHMVIRTSIZE 、STACKSIZE。

SHMVIRTSIZE定義了配置設定給Informix IDS共享記憶體的虛拟存儲區的大小。Informix IDS在處理大型查詢或高峰負荷的需要增加共享記憶體給虛拟存儲區,但是共享記憶體的配置設定需要增加事務處理的時間,故在設定SHMVIRTSIZE值時,一般考慮能滿足一個日常操作的需要。

STACKSIZE訓示了資料庫伺服器為每個活動線程指派的初始堆棧的大小。如果将該參數配置得過小,那麼線程将無法擁有執行其程式的足夠記憶體空間,而且它将幹擾其他線程。

SHMADD定義了Informix IDS自動加到虛拟存儲區的共享記憶體增量的大小。在增加共享記憶體時,要占用CPU周期;每次的增加量越大,增加次數就越少,留給其它的程序的記憶體也越少。是以一般采用大的增加量。但是在記憶體負荷很重時,少量增加使其他程式更好的共享記憶體資源。是以,如果實際記憶體小于等于256MB,則建議SHMADD使用預設值8192KB;如果在256MB到512MB之間,則設定為16384KB;如果大于512MB,則設定為32768KB。

可以用指令 onstat -g seg來顯示 IDS 目前共享記憶體虛拟區中的段的數目。

Informix IDS在初始化時,如果定義的虛拟記憶體區尺寸太小,會自動向虛拟區附加其他作業系統段,虛拟記憶體中的段過多進而引起資料庫的整體性能下降。是以在初始化時,将虛拟記憶體區的尺寸配置得足夠大,以避免進行動态的配置設定共享記憶體段。在該列的輸出中,class列為R是駐留記憶體段,V是虛拟記憶體段,M是消息記憶體段。如果顯示的虛拟記憶體段多于三個,那麼就需要提高配置檔案中 SHMVERSIZE 參數的值。

指令 onstat -p是監控記憶體的另一個指令。其輸出結果中的兩個%cache顯示了讀寫高速緩存比例的百分比,一般在80%到90%之間,如果低于80%,要調節BUFFERS參數值。ovlock 字段表明 IDS 在使用了最大數量的鎖之後嘗試過再使用鎖的次數,如果該數字非零,可能需要提高配置檔案中 LOCKS 參數的值。ovbuf 字段表明 IDS 在使用了最大數量的緩沖區之後嘗試過再使用緩沖區的次數。如果該數字很大,比如說超過 100000,就需要提高 BUFFERS 參數,以便使用者在需要從磁盤通路資料時不必等待緩沖區。在監控記憶體的使用情況時還可以采用Unix系統指令vmstat。

存儲器及I/O的參數調整和監控

Informix IDS支援兩種基本的資料儲存設備裸裝置和檔案系統,建議使用裸裝置存儲資料檔案。與檔案系統相比,裸裝置在存取資料時要快得多,而且對使用者來說是看不到裸裝置檔案的,要安全一些。使用檔案系統作為資料儲存設備還有一個潛在的危險,當檔案系統由于某些作業系統的錯誤而崩潰,且有一個資料庫事務正在進行時,資料庫伺服器将認為資料庫事務已經成功完成,但實際上,該事務正陷入作業系統緩沖區中,這最終将導緻資料庫中的某些不一緻。

Informix IDS在dbspace中存取資料,dbspace又包含一個或多個chunk(塊)。在9.40以後的版本中chunk的大小可以超過2G,在以前的版本中不能超過2G。可以使用onsta-d監控dbspace和chunk的使用情況和狀态。

與I/O參數調整直接相關的是檢查點。檢查點是使磁盤上的頁與共享記憶體緩沖池中的頁同步的過程。檢查點時間包含檢查點間隔時間和檢查點持續時間。在檢查點期間,IDS 阻止使用者線程進入臨界會話,并阻止所有的事務活動。是以,檢查點持續時間過長,使用者會經曆系統挂起。

CKPTINTVL參數指定檢查點之間的時間間隔。當檢查點間隔到了,則系統執行檢查點操作。

PHYSFILE指定實體日志的大小。一旦實體日志(PHYSFILE)的75%已滿,檢查點也會發生。

LRUS參數訓示共享記憶體緩沖池中設定的最近最少使用(LRU)隊列數目。

可以用LRUS和LRU_MAX_DIRTY及LRU_MIN_DIRTY來控制在滿的檢查點之間頁被重新整理到磁盤的頻度。在某些情況下,通過設定這些參數,使得在檢查點發生時需要重新整理修改的頁數量很少,可以達到高的吞吐量;假如檢查點持續時間始終超過 10秒甚至以上,那麼可能需要減少 LRU_MIN_DIRTY 和 LRU_MAX_DIRTY 配置參數的值以擷取更短的檢查點持續時間。可以使用onstat -R和onstat -P、onstat -F指令的輸出來确定參數值的大小。一般情況下LRU_MIN_DIRTY設定為50,LRU_MAX_DIRTY設定為70。

調整Informix IDS參數來優化資料庫性能,是Informix IDS性能優化的一個方面,它的性能調優還要從網絡、硬體、作業系統、應用程式等多個方面來綜合考慮,其性能的優化是一個高度複雜,異常繁瑣而且涉及面很廣的綜合性工作,而且它們之間互相關聯,互相影響。在調整過程中,應該明确資料庫的運作狀況和系統資源的使用情況,确定問題的瓶頸出現在哪裡。然後根據問題的所在來優化資料庫的性能。資料庫參數的調整是資料庫優化的一個方面,在此隻是想起到一個抛磚引玉的作用。