db2與oracle的全面對比3

征、數據庫中使用的數據庫頁面大小等因素而定。例如,頁面大小為 8KB 的表空間只能使用頁面大小為 8KB 的緩衝池。

可以通過 CREATE BUFFERPOOL 語句中的 EXTENDED STORAGE 選項擴展緩衝池。擴展的存儲(ESTORE)充當的是從緩衝池中被逐出的頁的輔助緩存,這樣可以減少 I/OESTORE 的大小由 num_estore_segs estore_seg_sz 這兩個數據庫配置參數來控制。如果使用 ESTORE,那麼就要從數據庫共享內存中拿出一定的內存,用於管理 ESTORE,這意味着用於其他內存池的內存將更少。

 

    隱藏的緩衝池

 

當數據庫啟動時,要分配 4 個頁寬分別為 4K8K16K 32K 的小型緩衝池。這些緩衝池是隱藏的,因為在系統編目中看不到它們(通過 SELECT * FROM SYSCAT.BUFFERPOOLS 顯示不出)。

如果主緩衝池配置得太大,則可能出現主緩衝池不適合可尋址內存空間的情況。(我們在後面會談到可尋址內存。)這意味着 DB2 無法啟動數據庫,因為一個數據庫至少必須有一個緩衝池。如果數據庫沒有啟動,那麼就不能連接到數據庫,也就不能更改緩衝池的大小。由於這個原因,DB2 預先分配了 4 個這樣的小型緩衝池。這樣,一旦主緩衝池無法啟動,DB2 還可以使用這些小型的緩衝池來啟動數據庫。(在此情況下,用戶將收到一條警告(SQLSTATE 01626))。這時,應該連接到數據庫,並減少主緩衝池的大小。

 

    排序堆的閾值(
sheapthres

sheapthres_shr

DB2 中有兩種排序,一種是私有排序,一種是共享排序。私有排序發生在代理的私有代理內存(在下一節討論)中,而共享排序發生在數據庫的數據庫共享內存中

 

對於私有排序,數據庫管理器配置參數
sheapthres
指定了私有排序在任何時刻可以消耗的內存總量在實例範圍內的
限制

 

果啟用了內部分區並行性(intra-partition parallelism)或者集中器(concentrator),那麼當 DB2 斷定共享排序比私有排序更有效時,DB2 就會選擇執行共享排序。如果執行共享排序,那麼就會在數據庫共享內存中分配用於這種排序的排序堆。用於共享排序的最大內存量是由
sheapthres_shr
數據庫參數指定的。這是對共享排序在任何時刻可以消耗的內存總量在數據庫範圍內的
限制

 

 

除了上述參數以外,還有一個參數也會影響數據庫共享內存的數量。這個參數就是
database_memory
。該參數的缺省值是
AUTOMATIC
。這意味着 DB2 將根據以上列出的各內存池的大小來計算當前配置所需的數據庫內存量。此外,DB2 還將為溢出緩衝區分配一些額外的內存。每當某個堆超出了其配置的大小時,便可以使用溢出緩衝區來滿足實例共享內存區內任何堆的峰值需求。

如果
database_memory
被設為某個數字,則採用
database_memory
與各內存池之和這兩者之間的較大者。

如果
database_memory
被設為
AUTOMATIC
,則可以使用以下命令來顯示它的值

db2mtrk -i -d -v

2.4    應用程序共享內存

這種共享內存集僅適用於以下環境。(對於其他環境,這種內存集不存在。)

    多分區(multi-partitioned)數據庫。

    啟用了內部並行(intra-parallel)處理的未分區(non-partitioned)數據庫。

    支持連接集中器的數據庫。

 

這種共享內存集僅適用於以下環境。(對於其他環境,這種內存集不存在。)

    多分區(multi-partitioned)數據庫。

    啟用了內部並行(intra-parallel)處理的未分區(non-partitioned)數據庫。

    支持連接集中器的數據庫。

注意:
max_connections
的值大於
max_coordagents
的值時,連接集中器便被啟用。這兩個參數可以在數據庫管理器配置中找到。(使用 GET DBM CFG 顯示數據庫管理器配置。)

在以上環境中,應用程序通常需要不止一個的代理來執行其任務。允許這些代理之間能夠彼此通信(相互發送/接收數據)很有必要。為了實現這一點,我們將這些代理放入到一個稱作
應用程序組的組中。屬於相同應用程序組的所有 DB2 代理都使用
應用程序組共享內存進行通信。

應用程序組內存集是從數據庫共享內存集中分配的。其大小由
appgroup_mem_sz
數據庫配置參數決定。

多個應用程序可以指派給同一個應用程序組。一個應用程序組內可以容納的應用程序數可以這樣計算:
appgroup_mem_sz / app_ctl_heap_sz

在應用程序組內,每個應用程序都有其自己的
應用程序控制堆。此外,應用程序組共享內存中有一部分要預留給應用程序組共享堆。如下圖所示:


3 – DB2 應用程序組共享內存

1

考慮以下數據庫配置:

    最大應用程序內存集大小 (4KB) (APPGROUP_MEM_SZ) = 40000

    最大應用程序控制堆大小 (4KB) (APP_CTL_HEAP_SZ) = 512

    用於應用程序組堆的內存所佔百分比 (GROUPHEAP_RATIO) = 70

可以計算出下面的值:

    應用程序組共享內存集是: 40000 * 4K/ = 160 MB

    應用程序組共享堆的大小是: 40000 * 70% = 28000 4K = 114MB

    該應用程序組內可容納的應用程序數為: 40000/512 = 78

    用於每個應用程序的應用程序控制堆為: (100-70)% * 512 = 153 4K = 0.6MB

 

2.5    代理私有內存

每個 DB2 代理進程都需要獲得內存,以執行其任務。代理進程將代表應用程序使用內存來優化、構建和執行訪問計劃,執行排序,記錄游標信息(例如位置和狀態),收集統計信息,等等。為響應並行環境中的一個連接請求或一個新的 SQL 請求,要為一個 DB2 代理分配代理私有內存。

代理的數量受下面兩者中的較低者限制:

    所有活動數據庫的數據庫配置參數 maxappls 的總和,這指定了允許的活動應用程序的最大數量。

    數據庫管理器配置參數 maxagents 的值,這指定了允許的最大代理數。

代理私有內存集由以下內存池組成。這些內存池的大小由括號中的數據庫配置參數指定:

    Application Heap
applheapsz

    Sort Heap
sortheap

    Statement Heap
stmtheap

    Statistics Heap
stat_heap_sz

    Query Heap
query_heap_sz

    Java Interpreter Heap
java_heap_sz

    Agent Stack Size
agent_stack_sz

(僅適用於 Windows

 

DB2 代理進程內存地址空間


 

2.6    注意事項

    實例共享內存是在數據庫管理器啟動(db2start)時分配的,並隨着數據庫管理器的停止(db2stop)而釋放

    在某些情況下,db2mtrk 顯示的大小會大於指定給配置參數的值。在這種情況下,賦予配置參數的值被作為一種軟限制,內存池實際使用的內存可能會增長,從而超出配置的大小。

    不要被 app_ctrl_heap_sz 參數迷惑。這個參數不是一個應用程序組內用於每個應用程序的各應用程序控制堆的大小。它只是在計算這個應用程序組內可容納多少應用程序時用到的一個值。每個應用程序的實際應用程序控制堆大小都是通過
3中給出的公式計算的,這個公式就是 ((100 – groupheap_ratio)% * app_ctrl_heap_sz)

因此,groupheap_ratio 越高,應用程序組共享堆就越大,從而用於每個應用程序的應用程序控制堆就越

 

 

 

 

 


 

以下文章點擊率最高

Loading…

     

如果這文章對你有幫助,請掃左上角微信支付-支付寶,給於打賞,以助博客運營

發表評論

您的電子郵箱地址不會被公開。 必填項已用*標註