DB2 V9自動自調整記憶體詳解

rheet1978發表於2008-06-18

 

        IBM的DB2 V9 引入了自動自調整記憶體管理,自適應的自調整記憶體功能通過自動設定記憶體配置引數值以及調整緩衝池大小來簡化記憶體配置任務。啟用此功能後,記憶體調整器就會在幾個記憶體使用者(包括:排序、程式包快取記憶體、鎖定列表和緩衝池)之間動態地分配可用記憶體資源,從而簡化了記憶體配置引數調整的工作量。本文重點介紹在DB2® V9中如何使用自動自調整記憶體,包括如何啟用自調整記憶體,禁用自調整記憶體以及自調整記憶體相關的幾個記憶體配置引數等。

簡介 

    在DB2 V9之前,資料庫的記憶體配置引數和緩衝池都是由管理員手工設定的。而資料庫的工作負載很少是靜態的,而是動態變化的。比如,當工作負載型別發生變化(由事務型變成了混合型等)、使用者增加、維護任務的執行或者其它應用程式消耗的資源變化等,都會造成工作負載在不停的變化。因此,即便是資深的資料庫管理員調優過的系統,在另一個時候也未必是最優的。資料庫管理員需要根據變化隨時做出調整,工作量大而效果也不明顯。變化可能在很短的時間內發生,因此留給資料庫管理員作出響應的時間很短。資料庫記憶體設定尤其容易受這些變化的影響,因而會嚴重影響響應時間。 

    現在,從IBM® DB2®版本 9 開始,新的記憶體調整功能自動設定若干記憶體配置引數值,從而簡化了記憶體配置任務。啟用此功能後,記憶體調整器就會在幾個記憶體使用者(包括排序、程式包快取記憶體、鎖定列表和緩衝池)之間動態地分配可用記憶體資源。記憶體調整器對工作負載特徵的顯著更改作出響應,從而調整記憶體配置引數值和緩衝池大小以優化效能。 

    本文重點介紹在DB2® V9中如何使用自動自調整記憶體。 

    我們將按照下列順序介紹自動自調整記憶體:

•自動自調整記憶體概述

•啟用自動自調整記憶體

•與自調整相關的記憶體管理引數

•禁用自動自調整記憶體

自動自調整記憶體概述 

    DB2 V9的自動自調整記憶體功能能夠簡化若干個記憶體配置引數的調整。除了簡化記憶體配置任務之外,此新增的自適應的自調整記憶體功能通過提供更高的配置來提高效能,該配置可以動態響應工作負載特徵中出現的重要變化。自調整記憶體管理器使用智慧控制和反饋機制來跟蹤工作負載特徵、記憶體消耗以及對資料庫中各種共享資源的需求的變化,並根據需要動態調整它們對記憶體的使用。例如,如果排序操作需要更多的記憶體,而一些緩衝池又有多餘的記憶體,那麼記憶體管理器會釋放多餘的緩衝池記憶體,並將它分配給排序堆。 

    預設情況下,已對單一分割槽資料庫啟用自調整記憶體功能,並對多分割槽資料庫禁用此功能。也就是說,在 V9.1 中建立單一分割槽資料庫時,self_tuning_mem 資料庫配置引數會自動設定為 ON,如果不需要啟用自調整記憶體管理器,則可在建立資料庫之後通過將 self_tuning_mem 配置引數設定為 OFF 來關閉該管理器;在 DPF 系統上不會預設啟用自調整記憶體管理器。 

    在 Windows® 和 AIX® 平臺上(也僅在這兩個平臺上),自調整記憶體功能還可確定資料庫記憶體的總需求,並會動態地對資料庫共享記憶體的總體使用情況進行調整。這使資料庫管理器可以根據工作負載的需要消耗更多實體記憶體,而在資料庫記憶體需求降低時將這些記憶體釋放到作業系統中。 

    另外,如果將資料庫從 V8 遷移至 V9.1,則不會自動啟用此功能。要在已遷移的資料庫中使用此功能,必須手工啟用它。可以通過將 self_tuning_mem 配置引數設定為 ON 並將下列某些或全部配置引數設定為 AUTOMATIC 來啟用自調整記憶體:
•pckcachesz

•locklist 和maxlocks

•sortheap 和sheapthres_shr

•database_memory(其 AUTOMATIC 設定僅在 AIX® 和 Windows® 作業系統上受支援。在其他平臺上,database_memory 的預設值是 COMPUTED)。 

    自適應的自調整記憶體功能通過自動設定記憶體配置引數值以及調整緩衝池大小來簡化記憶體配置任務。啟用此功能後,記憶體調整器就會在幾個記憶體使用者(包括:排序、程式包快取記憶體、鎖定列表和緩衝池)之間動態地分配可用記憶體資源。 

    可以對下列記憶體使用者啟用自調整(把相應的引數設定為 AUTOMATIC):

•緩衝池(由 ALTER BUFFERPOOL 和 CREATE BUFFERPOOL 語句指定AUTOMATIC屬性)。

•程式包快取記憶體(由 pckcachesz 配置引數控制)。

•鎖定記憶體(由 locklist 和 maxlocks 配置引數控制)。

•排序記憶體(由 sheapthres_shr 和 sortheap 配置引數控制)。

•資料庫共享記憶體(由 database_memory 配置引數控制)。 

    接下來我們通過具體的例子來看一下如何使用自動自調整記憶體。

啟用自調整記憶體功能 

    首先我們建立一個單一分割槽資料庫MYDB1,由於預設情況下,單一分割槽資料庫啟用自調整記憶體功能,所以我們建立的示例資料庫MYDB1就啟動了自動自調整記憶體功能,其資料庫引數self_tuning_mem被自動設定成了ON,並把程式包快取記憶體、鎖定記憶體、排序記憶體和資料庫共享記憶體等記憶體使用者預設啟動了自動自調整記憶體功能,預設建立的緩衝池IBMDEFAULTBP也啟用了自調整記憶體功能。我們在DB2CMD視窗中,發出CREATE DB 命令,建立示例資料庫MYDB1具體如清單1所示:

 
--清單 1. 建立啟用自動自調整記憶體的示例資料庫MYDB1
 
C:\>DB2 CREATE DATABASE MYDB1
DB20000I  CREATE DATABASE命令成功完成。
 
 

    我們通過GET DB CFG命令檢視示例資料庫MYDB1的配置引數,會發現其自調整記憶體引數(self_tuning_mem)被設定成了ON,資料庫共享記憶體大小(DATABASE_MEMORY) 、 鎖定列表的最大儲存量引數(LOCKLIST)、 每個應用程式的鎖定百分比列表引數(MAXLOCKS)、 程式包快取記憶體大小引數(PCKCACHESZ)、 共享排序的排序堆域值引數(SHEAPTHRES_SHR)和 排序列表堆引數(SORTHEAP)都被設定成了AUTOMATIC,表示這些引數啟用自動自調整記憶體,另外資料庫記憶體閾值引數(DB_MEM_THRESH)被設定成了10。 

    DB2 V9中新增了資料庫配置引數 db_mem_thresh,以控制有多少物理 RAM 被 database_memory 引數的未使用部分佔用。此資料庫配置引數指定資料庫管理器如何處理未用資料庫共享記憶體過多這一問題。通常,當程式訪問記憶體頁時,記憶體頁處於已落實狀態,這表示作業系統已分配了該記憶體頁,並且該記憶體頁佔用實體記憶體空間或磁碟上的頁檔案空間。根據資料庫的工作負載,資料庫共享記憶體需求在一天中的某些時間可能會達到峰值。一旦作業系統有足夠的已落實記憶體來滿足那些峰值需求後,該記憶體就會一直處於已落實狀態,即使記憶體需求從峰值回落亦如此。此資料庫配置參數列示資料庫管理器允許的已落實但當前未使用的資料庫共享記憶體最大百分比,達到此百分比後,資料庫管理器將開始釋放已落實的記憶體頁以將它們返回給作業系統。可接受的值是整數 0(立即釋放任何未使用的資料庫共享記憶體)到 100(永遠不釋放任何未使用的資料庫共享記憶體)。預設值是 10(僅噹噹前未使用的資料庫共享記憶體超過 10% 時,才釋放那些記憶體)。 

    具體情況如清單2所示:

 
--清單 2. 檢視示例資料庫MYDB1配置引數
 
C:\>DB2 GET DB CFG FOR MYDB1
資料庫 MYDB1 的資料庫配置
資料庫配置發行版級別                                    = 0x0b00
資料庫發行版級別                                        = 0x0b00
資料庫地域                                              = CN
資料庫內碼表                                            = 1386
資料庫程式碼集                                            = GBK
資料庫國家/地區程式碼                                    = 86
資料庫整理順序                                          = UNIQUE
備用整理順序                              (ALT_COLLATE) =
資料庫頁大小                                            = 4096
.......
自調整記憶體                            (SELF_TUNING_MEM) = ON
資料庫共享記憶體大小(4KB)             (DATABASE_MEMORY) = AUTOMATIC
資料庫記憶體閾值                          (DB_MEM_THRESH) = 10
鎖定列表的最大儲存量(4KB)                   (LOCKLIST) = AUTOMATIC
每個應用程式的鎖定百分比列表                 (MAXLOCKS) = AUTOMATIC
程式包快取記憶體大小(4KB)                  (PCKCACHESZ) = AUTOMATIC
共享排序的排序堆域值(4KB)            (SHEAPTHRES_SHR) = AUTOMATIC
排序列表堆(4KB)                            (SORTHEAP) = AUTOMATIC
........

 


    清單2中所示的程式包快取記憶體大小(PCKCACHESZ)引數,是在資料庫共享記憶體之外分配的,並且用於快取記憶體資料庫上的靜態和動態 SQL 和 XQuery 語句的部分。快取記憶體程式包使資料庫管理器在重新裝入程式包時可以不訪問系統目錄;或者對於動態 SQL 或 XQuery 語句,可以免去編譯這一步,從而減少其內部開銷。將這些段儲存在程式包快取記憶體中,直到發生下列其中一種情況:

•資料庫關閉 。

•程式包或動態 SQL 或 XQuery 語句無效 。

•快取記憶體空間用完。 

    靜態或動態 SQL 或 XQuery 語句節的快取記憶體可提供效能,尤其是在與資料庫連線的應用程式多次使用同一個語句時。這在事務處理應用程式中特別重要。當此引數設定為 AUTOMATIC 時,就啟用了自調整功能。當 self_tuning_mem 設定為 ON 時,記憶體調整器將在工作負載需求更改時動態調整 pckcachesz 控制的記憶體區的大小。由於記憶體調整器在不同記憶體使用者之間交換記憶體資源,所以,必須至少有兩個記憶體使用者啟用自調整功能才能使自調整功能有效。需要注意的是,程式包快取記憶體是工作快取記憶體,所以不能將此引數設定為零。此快取記憶體中必須分配有足夠的記憶體以儲存當前執行的 SQL 或 XQuery 語句的所有節。如果分配的空間比當前需要的空間多,則各節被快取記憶體。下一次需要這些部分時,只需執行它們而不必將其裝入或進行編譯。由 pckcachese 引數指定的限制是軟限制。如果資料庫共享集合中還有可用的記憶體,如果有必要的話,可以超過該限制。 

    清單2中所示的鎖定列表的最大儲存量 (LOCKLIST)引數,是用來指示分配給鎖定列表的記憶體量。每個資料庫有一個鎖定列表,鎖定列表包含由同時連線至資料庫的所有應用程式掛起的鎖定。鎖定是資料庫管理器用來控制多個應用程式併發訪問資料庫中的資料的機制。行和表都可以鎖定。資料庫管理器還可以獲取鎖定來供內部使用。當此引數設定為 AUTOMATIC 時,就啟用了自調整功能。這允許記憶體調整器根據工作負載需求變化動態地調整此引數控制的記憶體區大小。由於記憶體調整器在不同記憶體使用者之間交換記憶體資源,所以,必須至少有兩個記憶體使用者啟用自調整功能才能使自調整功能有效。locklist 值是與 maxlocks 引數一起調整的,因此,如果禁用 locklist 引數自調整功能,也將自動禁用 maxlocks 引數自調整功能。如果啟用 locklist 引數自調整功能,也將自動啟用 maxlocks 引數自調整功能。當一個應用程式使用的鎖定列表百分比達到 maxlocks 時,資料庫管理器就會對該應用程式掛起的鎖定執行從行到表的鎖定升級。雖然升級過程本身花不了多少時間,但是鎖定整個表(與個別行比較)降低了併發性,並且可能因對受影響的表進行後續訪問而降低整個資料庫效能。關於如何控制鎖定列表大小的建議是:

•經常執行 COMMIT 以釋放鎖定。

•當執行很多更新時,在更新前鎖定整個表(使用 SQL LOCK TABLE 語句)。這樣將只使用一個鎖定,防止其他鎖定干擾更新,但卻降低了資料的併發性。

•還可以使用 ALTER TABLE 語句的 LOCKSIZE 選項來控制如何對特定表進行鎖定。

•使用“可重複讀”隔離級別可能會導致自動錶鎖定。 

    只要有可能,使用“遊標穩定性”隔離級別以減少所掛起的共享鎖定數。如果不會影響到應用程式的完整性需求,則使用“未落實的讀”代替“遊標穩定性”以進一步減少鎖定量。 將 locklist 設定為 AUTOMATIC。鎖定列表將同步地增大以避免發生鎖定升級或鎖定列表滿的情況。 一旦鎖定列表已滿,效能就可能會降低,因為鎖定升級將生成更多的表鎖定和更少的行鎖定,從而降低資料庫中共享物件的併發性。另外,應用程式間可能有更多的死鎖(因為這些應用程式都在等待有限數目的表鎖定),這樣將導致事務回滾。當資料庫的鎖定請求數達到最大值時,應用程式將接收到值為 -912 的 SQLCODE。 

    清單2中所示的每個應用程式的鎖定百分比列表(MAXLOCKS)引數,是用來定義應用程式所掛起的鎖定列表的百分比,和locklist一起決定了每個應用程式可以使用的鎖定數量,超過了將引發鎖升級。當此引數設定為 AUTOMATIC 時,就啟用了自調整功能。這允許記憶體調整器根據工作負載需求變化動態地調整此引數控制的記憶體區大小。由於記憶體調整器在不同記憶體使用者之間交換記憶體資源,所以,必須至少有兩個記憶體使用者啟用自調整功能才能使自調整功能有效。 

    清單2中所示的共享排序的排序堆域值 (SHEAPTHRES_SHR)引數,是表示對排序記憶體使用者每次可使用的資料庫共享記憶體總量的軟限制。除排序以外,還有其他排序記憶體使用者(例如,雜湊連線、索引 AND 運算、塊索引 AND 運算、合併連線和記憶體表)。當共享排序記憶體使用者的共享記憶體總量達到 sheapthres_shr 限制時,就會啟用記憶體調節機制,將來的共享排序記憶體使用者請求得到的記憶體量將少於請求的記憶體量,但始終多於完成任務所需的最低記憶體量。一旦達到 sheapthres_shr 限制,排序記憶體使用者的所有共享排序記憶體請求都將獲得完成任務所必需的最低記憶體量。當活動共享排序記憶體使用者的共享記憶體總量達到此限制時,後續排序可能會失敗(SQL0955C)。當資料庫管理器配置引數 sheapthres 值為 0 時,資料庫的所有排序記憶體使用者都將使用 sheapthres_shr 控制的資料庫共享記憶體,而不是使用專用排序記憶體。當 sheapthres_shr 設定為 AUTOMATIC 時,就啟用了自調整功能。這允許記憶體調整器根據工作負載需求變化動態地調整此引數控制的記憶體區大小。由於記憶體調整器在不同記憶體使用者之間交換記憶體資源,所以,必須至少有兩個記憶體使用者啟用自調整功能才能使自調整功能有效。記憶體使用者包括 SHEAPTHRES_SHR、PCKCACHESZ、BUFFER POOL(每個緩衝池計數為一個)、LOCKLIST 和 DATABASE_MEMORY。僅當資料庫管理器配置引數 sheapthres 設定為 0 時,才允許自動調整 sheapthres_shr。sortheap 值是與 sheapthres_shr 引數一起調整的,因此,如果禁用 sortheap 引數自調整功能,也將自動禁用 sheapthres_shr 引數自調整功能。如果啟用 sheapthres_shr 引數自調整功能,也將自動啟用 sortheap 引數自調整功能。 

    清單2中所示的排序列表堆(SORTHEAP) 引數,是定義要用於專用排序的專用記憶體頁的最大數目或要用於共享排序的共享記憶體頁的最大數目。當排序完成時,如果排序為專用排序,那麼此引數將影響代理程式專用記憶體。如果排序為共享排序,那麼此引數將影響資料庫共享記憶體。每個排序都有一個獨立的排序堆,該排序堆由資料庫管理器根據需要分配。此排序堆是將資料排序的區域。如果由優化器定向,那麼將使用優化器提供的資訊分配一個比此引數指定的排序堆小的排序堆。當此引數設定為 AUTOMATIC 時,就啟用了自調整功能。這允許記憶體調整器根據工作負載需求變化動態地調整此引數控制的記憶體區大小。當使用排序堆時,應該考慮下列事項:
•適當的索引可使排序堆的使用減至最小程度。

•雜湊連線緩衝區、塊索引 AND 運算、合併連線、記憶體中的表以及動態位對映(用於索引 AND 運算和星型連線)使用排序堆記憶體。在使用這些技術時,增大此引數的大小。

•當需要進行頻繁的大型排序時,增大此引數的大小。

•當增大此引數的值時,應該檢查是否還需要調整資料庫管理器配置檔案中的 sheapthres 和 sheapthres_shr 引數。

•排序堆大小由優化器在確定訪問路徑時使用。在更改此引數後,應考慮重新繫結應用程式(使用 REBIND 命令)。 

    清單2中所示的資料庫共享記憶體大小 (DATABASE_MEMORY)引數,是用來設定對每個資料庫將使用的記憶體量的限制。在 DB2® V9.1 中,database_memory 配置引數的 COMPUTED 設定等價於 DB2 UDB V8 AUTOMATIC 設定。如果要保留 DB2 V8 行為,則將 database_memory 引數設定為 COMPUTED。在 DB2 V9.1 中,將 database_memory 引數設定為 AUTOMATIC 會啟用新增的自調整記憶體管理功能部件,它可自動調整資料庫記憶體使用。調整器在 database_memory 配置引數定義的記憶體限制範圍內工作。在 Windows® 和 AIX® 上,database_memory 值本身可以自動調整。database_memory 啟用自調整(設定為 AUTOMATIC)後,調整器確定資料庫的整體記憶體需求並根據當前資料庫需求增大或減小分配給資料庫共享記憶體的記憶體量。例如,如果當前資料庫需求很高,並且系統上有足夠的可用記憶體,則資料庫共享記憶體將消耗較多的記憶體。當資料庫記憶體需求下降時,或者當系統上的可用記憶體量降至過低水平時,就會釋放一些資料庫共享記憶體。database_memory 引數未啟用自調整(未設定為 AUTOMATIC)時,整個資料庫都將使用指定的記憶體量,從而根據需要在資料庫記憶體使用者之間分配記憶體。database_memory 未啟用自調整時,可以通過兩種方法指定資料庫使用的記憶體量:將 database_memory 設定為數值或者將其設定為 COMPUTED。在第二種情況下,總記憶體量是根據資料庫啟動時的資料庫記憶體堆初始值總計而計算的。一定要注意:database_memory 的 AUTOMATIC 設定僅在 AIX® 和 Windows® 作業系統上受支援。在其他平臺上,database_memory 的預設值是 COMPUTED。 

    接下來我們檢視一下預設建立的4K頁緩衝池IBMDEFAULTBP的自調整設定,具體如清單3所示:

--清單 3. 檢視預設建立的4K頁緩衝池IBMDEFAULTBP的自調整設定
 
C:\>db2 connect to mydb1
資料庫連線資訊
資料庫伺服器         = DB2/NT 9.1.0
SQL 授權標識         = RHETTE
本地資料庫別名       = MYDB1
C:\>db2 "select BPNAME, NPAGES from sysibm.sysbufferpools"
BPNAME                                      NPAGES
------------------------------------------------               -----------
IBMDEFAULTBP                                  -2
1 條記錄已選擇。
 

 

    當緩衝池啟用了自調整功能時,該特定緩衝池的 sysibm.sysbufferpools 表中的 NPAGES 欄位將設定為 -2。當自調整功能處於禁用狀態時,NPAGES 欄位將設定為緩衝池的當前大小。我們可以在清單2中看到,IBMDEFAULTBP的NPAGES 欄位將設定為 -2,由此我們可以確定,IBMDEFAULTBP啟用了自調整功能。 

    下面我們建立示例緩衝池MYBP1,其使用自調整功能(注意其create bufferpool語句使用了automatic),初始大小為400K,具體如清單4所示:

 
--清單 4. 建立使用自動自調整功能的示例緩衝池MYBP1
 
C:\>db2 create bufferpool mybp1 immediate size 100  automatic  pagesize 4k
DB20000I  SQL命令成功完成。

 

 

    接下來建立示例緩衝池MYBP2,其不使用自調整功能,,初始大小為400K,具體如清單5所示:

--清單 5. 建立不使用自動自調整功能的示例緩衝池MYBP2
 
C:\>db2 create bufferpool mybp2 immediate size 100  pagesize 4k
DB20000I  SQL命令成功完成。

 

 

    此時我們通過訪問sysibm.sysbufferpools可以看到mybp1的NPAGES欄位設定成了-2,而mybp2的NPAGES欄位都設定成了100,具體如清單6所示:

--清單 6. 檢視緩衝池
 
C:\>db2 "select BPNAME, NPAGES from sysibm.sysbufferpools"
BPNAME                              NPAGES
------------------------------------------------       -----------
IBMDEFAULTBP                            -2
MYBP1                                    -2
MYBP2                                    100
3 條記錄已選擇。

 

 

    現在我們將mybp2改成使用自調整功能,在DB2CMD環境中,執行ALTER BUFFERPOOL命令,具體如清單7所示:

--清單 7. 修改示例緩衝池MYBP2,使其啟用自調整功能
 
C:\>db2 alter bufferpool mybp2 immediate size 100 automatic
DB20000I  SQL命令成功完成。
 
    再次通過訪問sysibm.sysbufferpools可以看到mybp1和mybp2的NPAGES欄位都設定成了-2,具體如清單8所示:
--清單 8. 檢視緩衝池
 
C:\>db2 "select BPNAME, NPAGES from sysibm.sysbufferpools"
BPNAME                              NPAGES
------------------------------------------------       -----------
IBMDEFAULTBP                            -2
MYBP1                                    -2
MYBP2                                    -2
3 條記錄已選擇。

 

 

    如果資料庫是從V8遷移過來,或者被手工設定過禁止使用自調整記憶體功能,又想重新使用自動自調整記憶體功能,可以按如下步驟進行操作:

•通過將 self_tuning_mem 設定為 ON 來對資料庫啟用自調整功能。可以使用 UPDATE DATABASE CONFIGURATION 命令、SQLFUPD API 或通過控制中心中的更改資料庫配置引數視窗來將 self_tuning_mem 設定為 ON。

•要對由記憶體配置引數控制的記憶體區域啟用自調整功能,請使用 UPDATE DATABASE CONFIGURATION 命令、SQLFUPD API 或通過控制中心中的更改資料庫配置引數視窗將相關配置引數設定為 AUTOMATIC。

•要對緩衝池啟用自調整功能,請將緩衝池大小設定為 AUTOMATIC。可以使用 ALTER BUFFER POOL 語句(對於現有緩衝池)或 CREATE BUFFER POOL 語句(對於新緩衝池)來完成此操作。如果在 DPF 環境中將緩衝池大小設定為 AUTOMATIC,就不應該在 sysibm.sysbufferpoolnodes 中為該緩衝池定義任何條目。 

    需要注意:

•由於自調整功能在不同記憶體區域之間重新分配記憶體,所以,必須至少啟用兩個記憶體區域(例如鎖定記憶體區域和資料庫共享記憶體區域)才能使自調整功能起作用。唯一的例外是由 sortheap 配置引數控制的記憶體。當僅將 sortheap 設定為 AUTOMATIC 時,將啟用 sortheap 的自調整功能。

•要為自調整功能啟用 locklist 配置引數,還必須為自調整功能啟用 maxlocks,因此當 locklist 設定為 AUTOMATIC 時,maxlocks 也設定為 AUTOMATIC。要為自調整功能啟用 sheapthres_shr 配置引數,還必須為自調整功能啟用 sortheap,因此當 sheapthres_shr 設定為 AUTOMATIC 時,sortheap 也設定為 AUTOMATIC。

•僅當資料庫管理器配置引數 sheapthres 設定為 0 時,才允許自動調整 sheapthres_shr 或 sortheap。

•自調整記憶體功能僅在 HADR 主伺服器上執行。在 HARD 系統上啟用自調整記憶體功能後,永遠不會在輔助伺服器上執行此功能,並且,僅當正確地設定配置後,此功能才會在主伺服器上執行。如果執行了切換 HADR 資料庫角色的命令,自調整記憶體操作也會切換,從而在新的主伺服器上執行。

禁用自動自調整記憶體 

    對啟用自動自調整記憶體的資料庫,可以通過將將 self_tuning_mem 設定為 OFF 來對整個資料庫禁用自調整功能。當 self_tuning_mem 設定為 OFF 時,設定為 AUTOMATIC 的記憶體配置引數和緩衝池仍為 AUTOMATIC,並且記憶體區保持其當前大小不變。 

    接下來我們對示例資料庫MYDB1禁用自動自調整記憶體,使用UPDATE DB CFG命令先把self_tuning_mem設定成OFF,具體如清單9所示:

--清單 9. 禁用自動自調整記憶體
 
C:\>db2 update db cfg using self_tuning_mem off
DB20000I  UPDATE DATABASE CONFIGURATION命令成功完成。
 
 

    我們在上面啟動自調整記憶體的時候講過,由於自調整功能在不同記憶體區域之間重新分配記憶體,所以,必須至少啟用兩個記憶體區域(例如鎖定記憶體區域和資料庫共享記憶體區域)才能使自調整功能起作用。唯一的例外是由 sortheap 配置引數控制的記憶體。當僅將 sortheap 設定為 AUTOMATIC 時,將啟用 sortheap 的自調整功能。 所以,如果只有一個記憶體使用者啟用了自調整功能(sortheap除外),則還可以有效地對整個資料庫取消啟用自調整功能,這個時候雖然self_tuning_mem引數被設定成ON,但整個資料庫還是取消啟用自調整功能。這是因為,當僅啟用了一個記憶體區時,不能對記憶體進行再分佈。 

    當相互關聯的記憶體配置引數,比如locklist和maxlocks,當一個被禁止使用自調整功能,則另一個也將被停止自調整功能。我們對locklist禁用自調整功能,如清單10所示:

--清單 10. 對locklist禁用自動自調整記憶體功能

C:\>db2 update db cfg using locklist manual
SQL5146W  當 "LOCKLIST" 為 "MANUAL" 時,必須將 "MAXLOCKS" 設定為
"MANUAL"。"MAXLOCKS" 已設定為 "MANUAL"。
 

    如清單10所示,當把locklist禁用自調整功能後,maxlocks也被禁止使用自調整功能。把locklist設定成manual的意思是指對locklist禁用自調整功能,而locklist的當前值(動態調整的引數,在一段時間內是動態的,但在某一個時點,其是靜態的,都有一個當前值)保持不變。把maxlocks設定成manual也是同樣的意思,就是對maxlocks禁用自調整功能,而maxlocks的當前值也保持不變。此時我們用get db cfg show detail的方式檢視資料庫配置引數,可以發現locklist和maxlocks的值都被改成固定的值了,具體如清單11所示:

 

    如果要禁用sortheap自調整功能,並同時將sortheap的當前值更改為1000的話,可以如清單12所示進行修改:

--清單 12. 對sortheap禁用自調整功能
 
C:\>db2 update db cfg using sortheap 1000 SHEAPTHRES_SHR 260
SQL5155W  成功完成更新。SORTHEAP 的當前值可能對效能產生負面影響。

 

    對其他的記憶體配置引數也禁用自調整功能,具體如清單13所示:

--清單 13. 對DATABASE_MEMORY、PCKCACHESZ禁用自調整功能
 
C:\>db2 update db cfg using DATABASE_MEMORY manual
DB20000I  UPDATE DATABASE CONFIGURATION命令成功完成。
C:\>db2 update db cfg using PCKCACHESZ manual
DB20000I  UPDATE DATABASE CONFIGURATION命令成功完成。
 

 

    對緩衝池禁用自調整功能,可以通過將緩衝池的大小設成-1或固定值的方式,該緩衝池的 NPAGES 值為 -1 時,DB2 資料庫配置引數 BUFFPAGE 控制著緩衝池的大小。當值為-2的時候,代表啟用自調整功能(真正有效需要兩個方面的因素,第一,需要self_tuning_mem引數設定為ON,第二,至少還存在一個別的記憶體區域,比如DATABASE_MEMORY)。具體如清單14所示:

--清單 14. 對緩衝池禁用自調整功能
 
C:\>db2 alter bufferpool mybp1 size 100
DB20000I  SQL命令成功完成。
C:\>db2 alter bufferpool mybp2 size 100
DB20000I  SQL命令成功完成。
C:\>db2 alter bufferpool ibmdefaultbp size 100
DB20000I  SQL命令成功完成。

 

 

    此時我們通過訪問sysibm.sysbufferpools可以看到mybp1、mybp2和ibmdefaultbp的NPAGES欄位都設定成了100了,具體如清單15所示:

--清單 15. 檢視緩衝池

BPNAME                             NPAGES
----------------------------                  -----------
IBMDEFAULTBP
100
MYBP1
100
MYBP2
100
3 條記錄已選擇。

 

 

    以上,我們對自調整記憶體進行了詳細的介紹,不過,自調整記憶體也存在著侷限性,在少量記憶體可用的情況下(例如,因為 database_memory 的值設定得很小,或者因為多個資料庫、例項或其他應用程式正在伺服器上執行),自調整記憶體帶來的效能好處將有限。 

    因為自調整記憶體根據資料庫工作負載作出調整決定,所以記憶體特徵不斷變化的工作負載將限制自調整記憶體的能力以有效地進行調整。如果工作負載的記憶體特徵不斷變化,則自調整記憶體調整記憶體的頻率將會降低,並且將重複調整以改變目標條件。在這種情況下,自調整記憶體將無法獲得絕對匯合,而是嘗試維護調整為當前工作負載的記憶體配置。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9524210/viewspace-350605/,如需轉載,請註明出處,否則將追究法律責任。

相關文章