你的平台--明確的指明從DB2 UDB中可以取得很好的性能
DB2 UDB 8。1 FOR Linux、 UNIX、Windows 的版本可以存在與簡單的單一的系統上,也可以在存在與在各種平台上運行的、復雜的客戶-服務器環境裡。但是不論是什麼環境,用戶總是傾向於關心這樣一個問題:數據庫應用程序的性能。那麼什麼是性能,怎麼樣才能改善它?
簡單地說,性能就是反映計算機系統執行一項指定的任務時候的具體表現。它主要用於測量系統響應時間、計算能力和可用性。 每一個度量都可能受幾個因素影響,包括硬件、系統(和數據庫) 配置、類型和同時工作的用戶數量,以及每一個用戶應用程序的負載。
如果系統執行效率低,你通常可以有幾個調整的方法可供選擇。由於有不同的選擇,你總是傾向於選擇一種被組織化的,簡明的方式,在心裡有一個具體的目標;並且那個目標應該是現實的,定量的,而且還是可以測量的; 否則,性能調整將會變成為一個hit-or-miss exercise.(注:原文如此,我不知道該怎麼解釋所以保留原文)
那麼, DBA 應該從哪裡開始呢? 通過對一個數據庫的觀察,性能問題比較典型的出現從在下列的一個或更多因素的不足上:
系統(環境) 配置
實例配置
數據庫配置
數據庫設計
應用程序設計。
關注你上述的每個要素的最初的調整效果,讓他們在每一個因素下逐步的運轉,直到得到你所期望的那些性能。 在這一章節中,我將描述怎麼檢查Linux 、Unix ,和Windows平台系統環境配置。 在後續章節將覆蓋到剩余的部分。 在具體介紹之前,雖然,我將介紹一些適合於所有平台的相關的調整指南。
一般性的調整規則
如果在你開始之前你能夠關注一下這些指南,那麼你將要調整的項目將會是更加容易和更可能會成功。
1. 檢查已知的硬件和軟件問題。 一些性能問題可能通過簡單地更新軟件補丁包或者升級硬件來改正。 既然有可能通過一個簡單的service pack來解決問題那為何要浪費時間和精力去檢查調整系統中的其它部分呢?也就是說,在你決定升級硬件之前請確定你已經了解問題的所在。在你發現系統實際上需要更多內存之前去盲目的增加其它網絡接口卡將會付出昂貴的代價,它實際上是不會對改進性能有任何作用的。
2. 基於整個系統考慮。 通常,如果沒有在這個系統的至少一個部件上起作用的話,你就不能調整這個系統的任何一方面。 例如,如果你為DB2 數據庫管理器的後台進程預留出很大一塊內存空間,那麼你不會有足夠的剩余空間去執行你的存儲過程。所以,在你做改變之前,應該整體去考慮這些改變將會對系統造成什麼樣的影響。3. 根據不同的級別去做測量和重新配置。不要在一次調整當中改變一個系統級別以上。 即使你確定你的計劃是有益的,你將不得不評估每一個改變會對性能改善的結果產生多大的貢獻。 如果你做錯了,性能則有降無升,這樣你就無法知道是哪項變動使它產生了負面的影響。在數據庫服務器環境裡,以下是可以作為獨立考慮的級別: 硬件、操作系統、通信軟件、數據庫、SQL 語句以及應用程序。4. 每次改變一件事。 因為同樣原因你應該每次只調整一個系統級別,當你調整每一個系統級別你應該每次只改變一個要素(注冊表變量、實例配置變量、數據庫配置變量、等等)。5. 在開始之前請將你的跟蹤和反饋程序放置就位。性能的調整不是一門具體的學科。 你做的一些變動將會損害而不是有助於性能。 如果這樣情況發生,如果你有辦法撤銷每一次所作的變動你就可以花費較少時間設法使系統回到修改之前的狀態。 我喜歡使用shell 腳本程序或批處理文件去作變動。 那樣,我將能存放一條命令(能返回一個等同與原始狀態的配置值),並把它作為注釋行直接放在賦予配置參量新值的命令之上。 然後,如果我需要取消變動,我把這行明令取消注釋,而把引起變動的命令注釋掉並且重新運行這個腳本或批處理文件,這樣就可以了。如果你被一些改變強行退出,請准備好向每一個 必要的改變重新應用。
6. 不要因為覺得調整的好處而刻意去做調整。所執行的調整必須能解決一個明確的問題
。如果你的調整策略與讓你試圖解決問題的根源沒有直接的關系的話,你將收獲甚微或者一無所獲直到問題的根源被最終解決。從某個角度而言,這樣的行為確實為後來的調整工作帶來更多的麻煩。7. 謹記回報遞減規律。 記住, 最高效的性能調整結果的收益通常來自你最初的努力。 隨後調整將會導致逐步減小的收益和需要付出更多的努力。調整的DB2 UDB 系統配置
當DB2 UDB安裝後DB2 UDB會使用一套注冊變量來配置系統。 其中一些變量對於性能起著關鍵性的作用; 而其他一些的影響則是微乎其微,甚至毫無作用。 接下來我將說明哪些注冊變量能在每一個操作系統的平台上產生重大的影響。
切記,對這些變量的改動將會影響整個系統,因此在改變注冊變量的時候要特別當心。
對於所有平台
以下變量的推薦適用於Linux 、Unix 和Windows平台。
DB2_APM_PERFORMANCE OFF是該注冊變量的缺省值。這個參數指定是否能夠在存取計劃管理器(APM)中作出相應的調整,這樣做就可以對SQL高速緩沖存儲器的動作產生影響。它還闡述了全局性的SQL高速緩沖存儲器是否能在沒有使用任何包鎖定的情況下工作,這是由阻止高速緩沖包從不被注意的與之無關的地方進入的內部系統鎖機制所決定。
在nonproduction 環境裡,這變量只能被設置為ON。 當設置成ON的時候,你可以看到Out of package cache的錯誤信息,並且內存使用率將會增加。 預編譯、綁定和重新綁定(PRECOMPILE, BIND, and REBIND) 操作無法進行,也不能將這些包無效或者無法執行。
DB2_AVOID_PREFETCH 該變量指定在災難性恢復期間是否執行預存取(prefetching) 。 缺省值是OFF ; 如果設置成ON,prefetching將不執行。
DB2BPVARS 支持DB2BPVARS的參數明確指出了在調整緩沖池(buffer pools)時使用的包含參數值的那個文件的位置,參數包括:
NO_NT_SCATTER
NT_SCATTER_DMSFILE
NT_SCATTER_DMSDEVICE
NT_SCATTER_SMS
NUMPREFETCHQUEUES
PREFETCHQUEUESIZE
對於每個帶_SCATTER的參數,缺省值是 0 (或OFF ), 允許的取值是:0 (或OFF) 和 1 (ON)。 對於NUMPREFETCHQUEUES參數,缺省值是1; 參數值的范圍是 1 到NUM_IOSERVERS。 對於 PREFETCHQUEUESIZE參數,缺省值是都是最大值: 100 或 2 * NUM_iOSERVERS。范圍是 1 到32,767。
每一個_SCATTER參數都用於打開或關閉各自的表空間容器的scatter read(或者關閉所有容器的scatter read)。其他的參數則可用於提高緩沖池數據的預存取(prefetching)。
注: 當使用Windows操作系統並且DB2NTNOCACHE參數被設置成ON,那麼帶_SCATTER的參數只能被設置成ON。DB2CHKPTR 該變量指定是否執行輸入指針檢查; 缺省值是OFF。
DB2_ENABLE_BUFPD 缺省值是OFF,它指明是否DB2 將使用中間緩沖去改進查詢的性能。
DB2_EXTENDED_OPTIMIZATION 該變量指定查詢優化器是否使用優化擴展去改進查詢性能;缺省值是OFF。DB2MAXFSCRSEARCH 該變量可能被設置成-1,或者是從 1 到33554的任何一個,為了在當增加一條紀錄到一個表中的時候指定搜索可用空間控制紀錄的數量。他允許你去平衡空間再使用的插入速度(小的數值使插入速度最優化,大的數值使空間再使用成為最優化)。 如果被設置成 -1,DB2 數據庫管理器將搜尋所有可用空間控制紀錄。缺省值是5。
DB2MEMMAXFREE 該變量指定每個DB2 代理將保留可以用內存的數量; 取值范圍從0 到2.0e+32 字節。 缺省是8,388,608 個字節。
DB2_OVERRIDE_BPF 該變量可以被設置為整數個4K頁,它指定將被創建在數據庫北激活時或首次建立一個連接時的緩沖池的大小(在頁面裡)。當由於內存限制的發生導致出現故障時,DB2_OVERRIDE_BPF這個參數是非常有用的。這樣內存限制可能出現在由於真正的內存不足(很少發生)或由於嘗試用DB2 數據庫管理器對緩沖池分配過大或者使用不恰當的配置的時候。缺省值是空。
DB2PRIORITIES 該變量的取值是與平台相關的。 DB2PRIORITIES 控制著DB2 進程和線程優先權。DB2_SORT_AFTER_TQ DB2_SORT_AFTER_TQ 指定了在分區數據庫環境下當接收端要求數據排序並且接收的節點數與發送的相等時DB2 優化器與引導表隊列怎樣協同工作。當設置成NO (缺省值) ,DB2 優化器傾向於在傳送端進行排序並且在接收端進行合並行。當設置為YES,當所有行接收完成後,優化器在接收端傳輸未排序的行並將其排序。DB2_STPROC_LOOKUP_FIRST 該變量指定DB2 UDB 服務器是否在察看sqllibfunction目錄 和 sqllibfunctionunfenced目錄之前執行對所有DARI(數據庫應用程序遠程接口,存儲過程的過時術語)和存儲過程的編目查找。缺省值是OFF。
DB2_HASH_JOIN YES 或者 NO 的取值指明是否在編譯一個存取計劃(Access plan)的時候可以使用hash join。缺省值是NO。
DB2_PARALLEL_IO 可能的取值包括 * 和 NULL(缺省值),指定是否DB2在從表空間容器中讀寫數據時候使用並行I/O。
However, because of the one-page container tag, the extents will not line up with the RAID stripes. It may be necessary to Access more physical disks than would be optimal during an I/O request unless this registry variable is set to ON.
DB2_STRIPED_CONTAINERS 該變量設置成ON或者NULL(缺省)指定表空間容器ID 標簽是否采用部份或全部的RAID 磁盤數據條。 當使用RAID 設備,表空間創建的時候采用與RAID 數據塊大小相等的或者是數倍的大小的數據條的擴展尺寸。然而,由於頁容器標記的存在,擴展部分不能按照RAID數據條進行排列。訪問更多物理硬盤比在I/O請求的過程中進行優化顯得更有必要,除非該變量被設置為ON。對於UNIX平台
以下變量適用於Unix 平台(AIX、HP-UX或者其他一些被提到的)。
DB2MEMDISCLAIM 該變量指明AIX操作系統是否應該停止頁面內存使之不再占據任何的實際的存儲空間。設置DB2MEMDISCLAIM為YES(缺省)指明在程序關閉的時候DB2 UDB釋放部分或者全部內存,這取決於由DB2MEMMAXFREE注冊變量所決定的值。如果DB2MEMMAXFREE為空,程序關閉的時候所有內存將被釋放。如果DB2MEMMAXFREE被賦值,僅有部分的(最高到DB2MEMMAXFREE所設定得值)內存釋放。程序終結時,釋放保證了內存能被其他的進程所使用。
DB2_MMAP_READ 它與DB2_MMAP_WRITE一起使用,缺省值 YES 允許DB2 for AIX 使用mmap 作為I/O 一個交錯法。 在多數環境中,mmap在使用的時候應該避免當多個進程對同一文件的不同扇區執行寫入操作造成的操作系統鎖定的情況。
DB2_MMAP_WRITE 它與DB2_MMAP_READ一起使用,缺省值是YES; 在這個時候他允許DB2 for AIX使用mmap 作為一個I/O的預備的方法。DB2_PINNED_BP 這個AIX 和HP-UX平台上的變量指定是否數據庫使用的全局內存 (包括緩沖池的內存) 將被保留在系統主存儲器以獲得更加穩定的數據庫性能。對於Windows平台
以下變量適用於Windows NT 操作環境。
DB2NTMEMSIZE Windows NT 要求, 所有共用存儲器片段在初始化時都被儲存在動態連接程序庫,以保證程序運行的整個過程中均有匹配地址。必要的話,在Windows NT下可不考慮DB2的缺省值;但是,在多數情況下,缺省值應當足夠使用。缺省值如下:
DBMS: 16,777,216;
FCM: 22,020,096;
DBAT: 33,554,432;
APLD: 16,777,216.
DB2NTNOCACHE 指定文件系統高速緩沖存儲器是否執行。該變量適用於除了LONG或者LOB類型數據之外的任何類型的數據。除去系統高速緩沖存儲器允許數據庫使用更多可用內存以便增加更多的緩沖池(buffer pool)或排序堆(sortheap)。 缺省是OFF。
DB2NTPRICLASS 用於關聯各個獨立線程的優先權(設置使用 DB2PRIORITIES) ,該變量為DB2 實例程序(DB2SYSCS.EXE)設置優先組同時確定DB2線程在系統中相對於其他線程的絕對優先權。以下三個優先組是可用的:
NORMAL_PRIORITY_CLASS (缺省)
REALTIME_PRIORITY_CLASS (R)
HIGH_PRIORITY_CLASS (H).
取值可以是R、H或者其他值,缺省是NULL。
DB2NTWORKSET 該變量指明DB2可以利用到的最小和最大工作區大小。缺省時,當Windows NT沒有處在頁面調度的狀態下,一個過程的工作區可能隨心所欲的增大。 但是,一旦處於頁面調度,最大工作區只能是大約1MB。 該變量允許你忽略這個缺省狀態。 可能的取值包括 PositiveNumber, PositiveNumber0. (缺省是1,1 )
修改DB2注冊變量
你怎樣去確定是否這些變量已經被設置並且他們被設置成了什麼? DB2 UDB V8.1 給你兩種方式察看和改變變量: 由使用DB2 注冊管理工具(從Configuration Assistant可以找到) 或執行系統命令 db2set。 Listing 1 顯示那個命令的語法。
注:顯示在角括號裡的參數(< >) 是可選擇的;顯示在方括號裡的參量或選項([ ]) 是必需的。
Listing 1: 察看和改變變量值的語法
Table 1 描述了這個命令的其他可利用的選項.
Table 1: db2set 命令選項:
如果執行不加選項的 db2set 命令,將會返回一個包含了已經被設置的變量以及他們的當前值的列表,
繼續調節
DB2 UDB 的性能調整可能是一個漫長的過程因為許多因素可能影響性能。 這個專欄報道了一般性能調整和改進DB2 UDB 系統配置的方法。在下個專欄,我將闡述調整實例和數據庫配置為最佳性能的方法。