青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

IBM DB2 內存分配與使用策略

Posted on 2010-05-19 23:23 Prayer 閱讀(1083) 評論(0)  編輯 收藏 引用 所屬分類: DB2DB2k
【彭建軍】IBM DB2 內存分配與使用策略 (上)
出處:根據 ChinaUnix 的相關文章整理。
        
        【導讀】本文將向您講解 DB2 內存使用的基礎,以及共享內存和私有內存的概念。這些內容同時適用于 32 位和 64 位的系統。 
        
        簡介
        
        理解 DB2 如何使用內存,可以防止過度分配內存,并有助于對內存的使用進行調優,從而獲得更好的性能。 
        
        本文將向您傳授 DB2 內存使用的基礎,以及共享內存和私有內存的概念。這些內容同時適用于 32 位和 64 位的系統。雖然對于 64 位系統有一些限制,但是在未來的一段時間內還不大可能觸及這些限制。因此,我們將焦點放在影響 32 位系統的內存限制,并對之進行詳細的討論。
        
        我們首先討論一般情況下 DB2 如何使用內存,接著討論內存管理如何隨著平臺(AIX、Sun、HP、Linux 和 Windows)的不同而變化,以及它們對 DB2 的影響。最后,我們將給出一些實際生活中客戶處境/問題以及他們的解決方案的有意義的例子。本文的內容適用于 DB2 version 8。
        
        DB2 內存結構概述
        
        圖 1中說明了 DB2 內存結構。這種內存結構在所有平臺上都是一致的。 注意:在多分區環境中,下面的圖適用于多分區實例中的每個分區。 
        
        圖 1 - DB2 內存結構
        

        
        DB2 在 4 種不同的內存集(memory set)內拆分和管理內存。這 4 種內存集分別是: 
        
        實例共享內存(instance shared memory) 
        數據庫共享內存(database shared memory) 
        應用程序組共享內存(application group shared memory) 
        代理私有內存(agent private memory)
        
        每種內存集由各種不同的內存池(亦稱堆)組成。圖 1 也給出了各內存池的名稱。例如, locklist是屬于數據庫共享內存集的一個內存池。 sortheap是屬于代理私有內存集的一個內存池。 
        
        我們將詳細討論每一種內存集。
        
        
實例共享內存
        
        每個 DB2 實例都有一個實例共享內存。實例共享內存是在數據庫管理器啟動(db2start)時分配的,并隨著數據庫管理器的停止(db2stop)而釋放。這種內存集用于實例級的任務,例如監控、審計和節點間通信。下面的數據庫管理器配置(dbm cfg)參數控制著對實例共享內存以及其中個別內存池的限制:
        
        實例內存( instance_memory)。 
        監視器堆( mon_heap_sz):用于監控。 
        Audit Buffer( audit_buf_sz):用于 db2audit 實用程序。 
        Fast Communication buffers ( fcm_num_buffers):用于分區之間的節點間通信。僅適用于分區的實例。
         
        instance_memory 參數指定為實例管理預留的內存數量。默認值是 AUTOMATIC。這意味著 DB2 將根據監視器堆、審計緩沖區和 FCM 緩沖區的大小計算當前配置所需的實例內存數量。此外,DB2 還將分配一些額外的內存,作為溢出緩沖區。每當某個堆超出了其配置的大小時,便可以使用溢出緩沖區來滿足實例共享內存區內任何堆的峰值需求。在這種情況下,個別堆的設置是 軟限制的,它們可以在內存使用的峰值期間進一步增長。 
        
        如果 instance_memory 被設置為某一個數字,則采用 instance_memory與 mon_heap_sz、 audit_buf_sz和 fcm_num_buffers的和之間的較大者。這時,對實例內存就施加了一個硬性的限制,而不是軟限制。當達到這個限制時,就會收到內存分配錯誤。出于這個原因,建議將 instance_memory 的設置保留為 AUTOMATIC。 
        
        如果 instance_memory 被設為 AUTOMATIC,則可以使用下面的命令來確定它的值: 
        
        db2 attach to instance_name(其中 instance_name是實例的名稱) 
        db2 get dbm cfg show detail
        
        下面的輸出表明有 42 MB 的內存被預留給實例共享內存集(10313 頁 * 4096 字節/頁): 
        
        Size of instance shared memory (4KB) (INSTANCE_MEMORY) = AUTOMATIC(10313) 
        
        instance_memory 參數只是設置了實例共享內存的限制。它并沒有說出當前使用了多少內存。要查明一個實例的內存使用情況,可以使用 DB2 內存跟蹤器工具 db2mtrk。例如, 
        
        db2start 
        db2mtrk -i -v
        
        Memory for instance 
        FCMBP Heap is of size 17432576 bytes 
        Database Monitor Heap is of size 180224 bytes 
        Other Memory is of size 3686400 bytes 
        Total: 21299200 bytes
        
        上面的例子表明,雖然預留給實例共享內存集的內存有 42 MB,但在 db2mtrk運行時只用到了大約 21 MB。
        
        注意:在某些情況下,db2mtrk 顯示的大小會大于指定給配置參數的值。在這種情況下,賦予配置參數的值被作為一種軟限制,內存池實際使用的內存可能會增長,從而超出配置的大小。 
        
        
數據庫共享內存
        
        每個數據庫有一個數據庫共享內存集。數據庫共享內存是在數據庫被激活或者第一次被連接上的時候分配的。該內存集將在數據庫處于非激活狀態時釋放(如果數據庫先前是處于激活狀態)或者最后一個連接被斷開的時候釋放。這種內存用于數據庫級的任務,例如備份/恢復、鎖定和 SQL 的執行。
        
        圖2展示了數據庫共享內存集內的各種內存池。括號中顯示了控制這些內存池大小的配置參數。 
        
        圖 2 - DB2 數據庫共享內存
        

        
        完整的綠色方框意味著,在數據庫啟動的時候,該內存池是完全分配的,否則,就只分配部分的內存。例如,當一個數據庫第一次啟動時,不管 util_heap_sz的值是多少,只有大約 16 KB 的內存被分配給實用程序堆。當一個數據庫實用程序(例如備份、恢復、導出、導入和裝載)啟動時,才會按 util_heap_sz指定的大小分配全額的內存。
        
        
主緩沖池
        
        數據庫緩沖池通常是數據庫共享內存中最大的一塊內存。DB2 在其中操縱所有常規數據和索引數據。一個數據庫必須至少有一個緩沖池,并且可以有多個緩沖池,這要視工作負載的特征、數據庫中使用的數據庫頁面大小等因素而定。例如,頁面大小為 8KB 的表空間只能使用頁面大小為 8KB 的緩沖池。
        
        可以通過 CREATE BUFFERPOOL 語句中的 EXTENDED STORAGE 選項“擴展”緩沖池。擴展的存儲(ESTORE)充當的是從緩沖池中被逐出的頁的輔助緩存,這樣可以減少 I/O。ESTORE 的大小由 num_estore_segs 和 estore_seg_sz 這兩個數據庫配置參數來控制。如果使用 ESTORE,那么就要從數據庫共享內存中拿出一定的內存,用于管理 ESTORE,這意味著用于其他內存池的內存將更少。
        
        這時您可能要問,為什么要這么麻煩去使用 ESTORE?為什么不分配一個更大的緩沖池呢?答案跟可尋址內存(而不是物理內存)的限制有關,我們在后面會加以討論。
        
        
隱藏的緩沖池 
        
        當數據庫啟動時,要分配 4 個頁寬分別為 4K、8K、16K 和 32K 的小型緩沖池。這些緩沖池是“隱藏”的,因為在系統編目中看不到它們(通過 SELECT * FROM SYSCAT.BUFFERPOOLS 顯示不出)。
        
        如果主緩沖池配置得太大,則可能出現主緩沖池不適合可尋址內存空間的情況。(我們在后面會談到可尋址內存。)這意味著 DB2 無法啟動數據庫,因為一個數據庫至少必須有一個緩沖池。如果數據庫沒有啟動,那么就不能連接到數據庫,也就不能更改緩沖池的大小。由于這個原因,DB2 預先分配了 4 個這樣的小型緩沖池。這樣,一旦主緩沖池無法啟動,DB2 還可以使用這些小型的緩沖池來啟動數據庫。(在此情況下,用戶將收到一條警告(SQLSTATE 01626))。這時,應該連接到數據庫,并減少主緩沖池的大小。 
        
        排序堆的閾值( sheapthres, sheapthres_shr) 
        
        如果沒有索引滿足所取的行的要求順序,或者優化器斷定排序的代價低于索引掃描,那么就需要進行排序。DB2 中有兩種排序,一種是私有排序,一種是共享排序。私有排序發生在代理的私有代理內存(在下一節討論)中,而共享排序發生在數據庫的數據庫共享內存中。
        
        對于私有排序,數據庫管理器配置參數 sheapthres 指定了私有排序在任何時刻可以消耗的內存總量在實例范圍內的 軟限制。如果一個實例總共消耗的私有排序內存達到了這一限制,那么為額外傳入的私有排序請求所分配的內存將大大減少。這樣就會在 db2diag.log 中看到如下消息: 
        
        "Not enough memory available for a (private) sort heap of size size of sortheap. Trying smaller size..." 
        
        如果啟用了內部分區并行性(intra-partition parallelism)或者集中器(concentrator),那么當 DB2 斷定共享排序比私有排序更有效時,DB2 就會選擇執行共享排序。如果執行共享排序,那么就會在數據庫共享內存中分配用于這種排序的排序堆。用于共享排序的最大內存量是由 sheapthres_shr 數據庫參數指定的。這是對共享排序在任何時刻可以消耗的內存總量在數據庫范圍內的 硬限制。當達到這個限制時,請求排序的應用程序將收到錯誤 SQL0955 (rc2)。之后,在共享內存總消耗量回落到低于由 sheapthres_shr 指定的限制之前,任何共享排序內存的請求都得不到允許。 
        
        下面的公式可以計算出數據庫共享內存集大致需要多少內存:數據庫共享內存 = (主緩沖池 + 4 個隱藏的緩沖池 + 數據庫堆 +實用程序堆 + locklist + 包緩存 + 編目緩存) + (estore 的頁數 * 100 字節) + 大約 10% 的開銷
        
        對于啟用了 intra_parallel 或集中器情況下的數據庫,共享排序內存必須作為數據庫共享內存的一部分預先分配,因而上述公式變為:數據庫共享內存 = (主緩沖池 + 4 個隱藏的緩沖池 + 數據庫堆 +實用程序堆 + locklist + 包緩存 + 編目緩存 + sheapthres_shr) + (estore 的頁數 * 100 字節) + 大約 10% 的開銷
        
        提示: 為了發現分配給主緩沖池的內存有多少,可以發出: 
        
        SELECT * FROM SYSCAT.BUFFERPOOLS 
        
        雖然大多數內存池的大小是由它們的配置參數預先確定的,但下面兩種內存池的大小在默認情況下卻是動態的:
        
        包緩存: pckcachesz = maxappls * 8 
        編目緩存: catalogcache_sz = maxappls * 4 
        活動應用程序的最大數量: maxappls = AUTOMATIC
        
        將 maxappls設為 AUTOMATIC的效果是,允許任意數量的連接數據庫的應用程序。DB2 將動態地分配所需資源,以支持新的應用程序。因此,包緩存和編目的大小可以隨著 maxappls的值而變化。 
        
        除了上述參數以外,還有一個參數也會影響數據庫共享內存的數量。這個參數就是 database_memory。該參數的缺省值是 AUTOMATIC。這意味著 DB2 將根據以上列出的各內存池的大小來計算當前配置所需的數據庫內存量。此外,DB2 還將為溢出緩沖區分配一些額外的內存。每當某個堆超出了其配置的大小時,便可以使用溢出緩沖區來滿足實例共享內存區內任何堆的峰值需求。 
        
        如果 database_memory 被設為某個數字,則采用 database_memory 與各內存池之和這兩者之間的較大者。 
        
        如果 database_memory 被設為 AUTOMATIC,則可以使用以下命令來顯示它的值: 
        
        db2 connect to dbnameuser useridusing pwd 
        db2 get db cfg for dbnameshow detail 
        
        使用 db2mtrk 工具顯示當前使用的內存量: db2mtrk -i -d -v (在 Windows 中,-i 必須指定。在 UNIX 中,-i 是可選的。) 
        
        Memory for database: SAMPLE
           Backup/Restore/Util Heap is of size 16384 bytes
           Package Cache is of size 81920 bytes
           Catalog Cache Heap is of size 65536 bytes
           Buffer Pool Heap is of size 4341760 bytes
           Buffer Pool Heap is of size 655360 bytes
           Buffer Pool Heap is of size 393216 bytes
           Buffer Pool Heap is of size 262144 bytes
           Buffer Pool Heap is of size 196608 bytes
           Lock Manager Heap is of size 491520 bytes
           Database Heap is of size 3637248 bytes
           Other Memory is of size 16384 bytes
           Application Control Heap is of size 327680 bytes
            Application Group Shared Heap is of size 57344000 bytes
           Total: 67829760 bytes 
        
        
應用程序組共享內存 
        
        這種共享內存集僅適用于以下環境。(對于其他環境,這種內存集不存在。)
        
        多分區(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
        
        不要被 app_ctrl_heap_sz 參數迷惑。這個參數不是一個應用程序組內用于每個應用程序的各應用程序控制堆的大小。它只是在計算這個應用程序組內可容納多少應用程序時用到的一個值。每個應用程序的實際應用程序控制堆大小都是通過 圖 3中給出的公式計算的,這個公式就是 ((100 - groupheap_ratio)% * app_ctrl_heap_sz)。 
        
        因此,groupheap_ratio 越高,應用程序組共享堆就越大,從而用于每個應用程序的應用程序控制堆就越小。
        
        例 2 假設在一天中最忙的時間里,有 200 個應用程序連接到例 1 中所描述的數據庫上。由于每個應用程序組可以容納 78 個應用程序,因此我們需要 200/78 = 3 個應用程序組來容納總共 200 個應用程序。這里應確保系統有足夠多的 RAM 來支持這一配置。否則就會發生 SQL10003N 錯誤。 
        
        代理私有內存
        
        每個 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 代理被“指派”執行任務時分配給該代理的。那么,私有內存何時釋放呢?答案取決于 dbm cfg 參數 num_poolagents的值。該參數的值指定任何時候可以保留的閑置代理的最大數目。如果該值為 0,那么就不允許有閑置代理。只要一個代理完成了它的工作,這個代理就要被銷毀,它的內存也要返回給操作系統。如果該參數被設為一個非零值,那么一個代理在完成其工作后不會被銷毀。相反,它將被返回到閑置代理池,直到閑置代理的數目到達 num_poolagents指定的最大值。當傳入一個新的請求時,就要調用這些閑置代理來服務該新請求。這樣就減少了創建和銷毀代理的開銷。 
        
        當代理變成閑置代理時,它仍然保留了其代理的私有內存。這樣設計是為了提高性能,因為當代理被再次調用時,它便有準備好的私有內存。如果有很多的閑置代理,并且所有這些閑置代理都保留了它們的私有內存,那么就可能導致系統耗盡內存。為了避免這種情況,DB2 使用一個注冊表變量來限制每個閑置代理可以保留的內存量。這個變量就是 DB2MEMMAXFREE。它的默認值是 8 388 608 字節。這意味著每個閑置代理可以保留最多 8MB 的私有內存。如果有 100 個閑置代理,那么這些代理將保留 800MB 的內存,因此它們很快就會耗盡 RAM。您可能希望降低或增加這一限制,這取決于 RAM 的大小。
        
        圖 1展示了一個 DB2 實例的 DB2 內存結構。 圖 4將展示在同一個系統上有兩個實例并發運行的情況。虛擬內存包括物理 RAM 和調頁空間(paging space)。共享內存“傾向于”留在 RAM 中,因為對它們的訪問更頻繁。如果代理閑置了較長的一段時間,則其代理私有內存將被調出。 
        
        圖 4 - 并發運行的兩個 DB2 實例
        

        
        
共享內存與私有內存
        
        至此,我們已經討論了實例共享內存、數據庫共享內存和應用程序組共享內存以及代理私有內存。但是共享內存和私有內存的意義是什么呢?
        
        為了理解共享內存與私有內存之間的不同之處,首先讓我們通過快速閱讀 DB2 進程 model來了解一下 DB2 代理進程。在 DB2 中,所有數據庫請求都是由 DB2 代理或子代理來服務的。例如,當一個應用程序連接到一個數據庫時,就有一個 DB2 代理指派給它。當該應用程序發出任何數據庫請求(例如一個 SQL 查詢)時,該代理就會出來執行完成這個查詢所需的所有任務 —— 它代表該應用程序工作。(如果數據庫是分區的,或者啟用了 intra-parallel,那么可以分配不止一個的代理來代表應用程序工作。這些代理叫做 子代理。) 
        
        每個代理或子代理都被當作一個 DB2 進程,它獲得一定數量的內存來執行工作。這種內存被稱作 代理私有內存—— 它不能與其他任何代理共享。之前我們曾提到過,代理私有內存包括一些內存池,例如應用程序堆大小、排序堆大小和語句堆大小。(參見 圖 1) 
        
        除了私有內存(代理在其中使用 排序堆執行“私有”任務,例如私有排序)外,代理還需要數據庫級的資源,例如緩沖池、 locklist 和日志緩沖區。這些資源在數據庫共享內存中(參見 圖 1)。 DB2 的工作方式是,數據庫共享內存中的所有資源都由連接到相同數據庫的所有代理或子代理共享。因此,該內存集被稱作共享內存,而不是私有內存。例如,連接到數據庫 A 的代理 x 使用數據庫 A 的數據庫共享內存中的資源。現在又有一個代理,即代理 y 也連接到數據庫 A。那么代理 y 將與代理 x 共享數據庫 A 的數據庫內存。(當然,代理 x 和代理 y 都有其自己的代理私有內存,這些代理私有內存不是共享的。) 
        
        這樣的邏輯同樣適用于實例共享內存和應用程序組共享內存。
        
        下圖展示了當兩個 DB2 代理(代理 x 和代理 y)連接到數據庫 A 時分配的 DB2 內存集。假設: 
        數據庫 A 屬于實例 db2inst1。 
        數據庫 A 為應用程序組 1 啟用了 intra-parallel。 
        代理 x 和 代理 y 都屬于應用程序組 1。
        
        圖 5 - DB2 代理進程內存地址空間
        


        
        圖 5 展示了在 RAM 中分配的以下內存集:
        
        用于實例 db2inst1 的實例共享內存集。 
        用于 數據庫 A 的數據庫共享內存集。 
        用于 應用程序組 1 的應用程序組共享內存。 
        用于代理 x 的代理私有內存集。 
        用于代理 y 的代理私有內存集。 
        為內核和庫之類的東西預留的內存。
        
        代理 x 和代理 y 共享相同的實例內存、數據庫內存和應用程序組內存,因為它們屬于相同的實例、相同的數據庫和相同的應用程序組。此外,它們有其自己的代理私有內存。
        
        每個 DB2 代理進程都有其自己的內存地址空間。在內存空間中的內存地址允許代理訪問物理 RAM 中的內存。我們可以把這些地址看作指向 RAM 的指針,如 圖 5所示。對于任何 DB2 進程,這個地址空間必須能夠容納上述所有 4 種內存集。 
        
        前面已提到,ESTORE 是用于擴展緩沖池的大小。那么您可能要問,為什么不創建一個更大的緩沖池呢。答案是:因為地址空間受到限制,地址空間可能容不下一個更大的緩沖池!在此情況下,需要定義一個較小的地址空間能夠容納的緩沖池。如果有過量的物理內存,那么可以用該內存來配置 ESTORE。
        
        那么,我們怎么知道一個 DB2 代理的地址空間是多大呢?地址空間的大小取決于當前的實例是 32 位的實例還是 64 位的實例。我們將在下一節對此進行解釋。
        
        32 位體系結構與 64 位體系結構中的可尋址內存
        
        如果有一個 64 位的 DB2 實例,則意味著 DB2 使用的是 64 位的內存體系結構。在這種體系結構中,對于所有平臺,每個進程的地址空間都是 2 的 64 次方,或者 18,446,744,073 GB。這是一個相當巨大的內存。將所有 DB2 內存集放入這個地址空間應該沒有問題。
        
        另一方面,如果有一個 32 位 DB2 實例,則對于所有平臺,地址空間只有 2 的 32 次方,或者 4 GB(Linux/390 平臺除外,在此平臺下地址空間實際上只有 2 的 31 次方。不過,在本文中我們不討論 Linux/390 中的 DB2)。所以,不管物理 RAM 有多大,要使一個 DB2 進程能夠訪問它所需的所有資源,包括實例共享內存、數據庫共享內存、應用程序組共享內存、它自己的代理私有內存以及用于內核的內存等,所有這些資源必須能放入到 4GB 的地址空間內。
        
        這就導致了兩個非常重要的問題:
        
        應該為實例內存、數據庫內存和應用程序共享內存分配多少的內存,以使它們能放入到 4GB 的可尋址空間? 
        應該如何配置 圖 1中列出的每個參數,以最有效地利用可用的內存? 
        雖然 4GB 的地址空間限制適用于所有平臺,但是對于上述問題的回答卻與平臺有關。例如,在 AIX 系統上可以分配給 DB2 數據庫的最大數據庫內存數就與 Solaris 系統上的數據庫不同。接下來的幾節將討論不同的平臺對 DB2 中的內存配置有何影響。注意:本文的后續部分只針對 32 位內存體系結構。我們即將討論的問題不適用于 64 位的體系結構。 
        
32-位 Sun Solaris Version 2.6 及及其更高版本中的 DB2 內存配置
        
        在 AIX 中,每個段的大小都是 256MB,而在 Solaris 中則有所不同,其內存段的大小不是固定的。32 位 Solaris 可尋址內存結構如 圖 9所示。 
        
        圖 9 - 32 位 Sun SolarisDB2 中的 32 位內存地址空間
        


        
        從 0x0 到 0x00010000 之間的地址不能使用。第一個段始于 0x00010000,這個段被預留給 db2sysc 可執行程序和代理私有內存。在缺省情況下,這個段結束于 0x10000000,因而這個段總共是 256MB。(我們可以通過設置 DB2DBMSADDR DB2 注冊表變量使這個段更大一些,見后面)。在這個段內,db2sysc 可執行程序只占用很小的一片內存,剩下的用于代理私有內存(200MB+)。
        
        在默認情況下,實例共享內存的起始地址固定于 0x10000000。不過,也可以將其改為一個更高的地址,以便有更多的空間留給代理私有內存。例如,如果實例共享內存始于 0x12000000,而不是 0x10000000,那么就有 0x12000000 減去 0x10000000 即 32MB 的額外內存被用于代理私有內存。要做到這一點,可以將 DB2DBMSADDR DB2 注冊表變量設為如下值: 
        
        db2set DB2DBMSADDR=0x12000000 
        
        注意: DB2DBMSADDR 值的范圍是從 0x10000000 到 0x10FFFFFF,每次遞增 0x10000。 
        
        實例共享內存的結束地址是不固定的。這意味著實例共享內存可能會很大。緊接著實例共享內存的是數據庫共享內存。因為實例共享內存的結束地址不固定,所以數據庫共享內存的起始地址也是不固定的。
        
        在數據庫共享內存之后的是用于 DB2 跟蹤、共享庫和堆棧(即將執行的指令)的內存。在 AIX 中,堆棧和代理私有內存共享相同的內存段,而在 Solaris 中則有所不同,其中代理私有內存和堆棧分別使用不同的內存段。因此,這里不存在兩者之間發生沖突的風險。
        
        由于這些內存段的大小不是固定的,我們只能估計實例共享內存和數據庫共享內存的大小為: 
        
        4GB - 代理私有內存 - DB2 跟蹤 - DB2 共享庫 - 堆棧 
        
        注意這個數量同時還包括實例共享內存和數據庫共享內存,并且它們的內存段必須是鄰接的。為了看一看實際中如何使用內存,可以對 db2sysc 或 db2agent 進程的 ID 運行 /usr/proc/bin/pmap 命令(以 root 的身份)。
        
        注意:在 Solaris 中,當使用 "pe -ef | grep instance_name" 命令顯示 DB2 進程時,所有進程都作為 db2sysc 進程顯示。可以使用 db2ptree命令來以“真實”名稱顯示 DB2 進程。 圖 9展示了 pmap 命令的一個示例輸出。 
        
        圖 10 - pmap 命令對于 db2sysc 進程的示例輸出(/usr/proc/bin/pmap -x 15444)   


        
        從 圖 10 中可以觀察到下面一些情況: 
        
        從 0x00010000 到 0x023F8000 這一部分被預留給 db2sysc 可執行程序(~36MB)。 
        橙色的那部分(堆),即從 0x023F8000 到 0x10000000,被用于代理私有內存(~220MB)。 
        實例共享內存,即綠色那部分,始于默認地址 0x10000000。這意味著沒有設置 DB2DBMSADDR。 
        所有 3 個綠色的段被用于共享內存,包括實例共享內存和數據庫共享內存。pmap 輸出并沒有說出哪一個段是實例共享內存,哪一個段是數據庫共享內存。我們只知道,數據庫共享內存在 0xFE002000 結束,因為從這個地址開始的是一個用于匿名內存的段。因此,實例共享內存和數據庫共享內存總共的大小是 0xFE002000 - 0x10000000 = 3,992,985,600 字節 = ~3.7 GB。 
        從 0xFFBC0000 到 0xFFFFFFFF 是用于堆棧的內存段(~4MB)。
        注意:在 32 位 Solaris 中,我們通常將 DB2 數據庫共享內存限制在大約 3.5 GB。 
        
        如果設置了 DB2DBMSADDR 注冊表變量,那么實例共享內存將從該變量指定的地址開始。下面的例子展示了這一點是如何實現的。
        
        例子 設置 DB2DBMSADDR 注冊表變量: 
        
        db2set DB2DBMSADDR = 0x12000000 
        db2stop 
        db2start (需要重新啟動實例,以使更改生效)。
        獲得 db2sys 進程的進程 ID 
        
        ps -ef | grep sylviaq ('sylviaq' 是實例名)。
        -ef | grep sylviaq 
        sylviaq 13166 1 0 13:09:12 pts/2 0:00 /export/home/sylviaq/sqllib/bin/db2bp 13049C11221 5 
        sylviaq 13263 13256 0 13:11:02 ? 0:00 db2sysc 
        sylviaq 13265 13256 0 13:11:03 ? 0:00 db2sysc 
        sylviaq 13257 13254 0 13:10:59 pts/3 0:00 -ksh 
        sylviaq 13256 13253 0 13:10:59 ? 0:00 db2sysc 
        sylviaq 13262 13256 0 13:11:00 ? 0:00 db2sysc 
        sylviaq 13360 13049 0 13:11:41 pts/2 0:00 grep sylviaq 
        sylviaq 13264 13256 0 13:11:02 ? 0:00 db2sysc 
        sylviaq 13266 13261 0 13:11:03 ? 0:00 db2sysc
        以 root 的身份 cd 到 /usr/proc/pmap,并對任何 db2sysc 進程運行 pmap: 
        
        ./pmap -x 13263 
        
        pmap 輸出: 
        
        13263: db2sysc 
        Address Kbytes Resident Shared Private Permissions Mapped File 
        00010000 35808 4064 1608 2456 read/exec db2sysc 
        02316000 896 168 48 120 read/write/exec db2sysc 
        023F6000 744 264 8 256 read/write/exec [ heap ] 
        12000000 243472 243472 - 243472 read/write/exec/shared [shmid=0xbc3] 
        21000000 22512 22512 - 22512 read/write/exec/shared [shmid=0xbc4] 
        FCC00000 8328 8328 - 8328 read/write/exec/shared [shmid=0xa96] 
        FE002000 8 - - - read/write/exec [ anon ]
        注意,實例共享內存現在從 0x12000000 開始,而不是從默認地址 0x10000000 開始。代理私有內存的大小(由 'heap' 標出)從 220MB ( 圖 10)增加到了 252 MB。(0x12000000 - 0x023F6000 = 0xFC0A000 = 264282112 (十進制) = ~252MB) 
        
        您可能注意到, 圖 9中給出的 4GB 地址空間沒有包括任何內核內存。這就對了,在 Solaris 中,內核有其自己的地址空間,該地址空間與進程的地址空間是分開的。這樣就將更多的空間留給了其他內存集,例如數據庫共享內存。 
        
        雖然與 AIX 相比,在 Solaris 中我們有更大的地址空間用于數據庫共享內存(在 AIX 上是 2GB),但是在 Solaris 上所有共享內存都是固定在物理 RAM 中。如果 RAM 比較小,那么對于可以并發運行的數據庫數目就有很大的影響。請參閱 “Sun Solaris 中與分配數據庫共享內存有關的常見問題”一節中的例 2。
        
        需要從這種結構中了解到的最重要的事情是: 
        
        與 AIX 不同,Solaris 的內存段其大小不是固定的。我們可以通過設置 DB2DBMSADDR DB2 注冊表變量,將實例共享內存移到更高的地址,從而增加代理私有內存。 
        數據庫共享內存的限制大約是 3.5GB。 
        功能內存與 RAM 固定,因而不能交換出去。
        32 位 Sun Solaris 中與分配數據庫共享內存有關的常見問題
        
        沒有充分配置內核參數以及初始化數據庫共享內存失敗可能導致如下失敗: 
        
        在數據庫啟動時(激活數據庫或第一次連接到數據庫) - SQL1478W, SQL1084C, hang condition 
        在運行時 - SQL2043N, 掛起條件
        在 Solaris 系統中,DB2 提供了一個叫做 db2osconf的工具。該工具根據系統的大小對內核參數的值給出建議。對于一個給定的系統,建議的值要足夠高,以便能夠容納最合理的工作負載。 
        
        最常見的未能正確設置的內核參數是 shmmax。該參數按字節指定系統中可以分配的共享內存段的最大大小。如果把 DB2 配置成創建大于這個值的數據庫共享內存,那么請求就會失敗。其他要知道的內核參數是 shmseg和 shmmni。 
        
        Solaris 中另一個與分配數據庫共享內存有關的常見問題是由于這樣的一個事實導致的,即共享內存段的所有頁都是固定在物理 RAM 中的。如果在 RAM 中沒有足夠的空閑頁可用,或者沒有足夠的可以被 OS 為滿足數據庫段而調出的其他頁,那么啟動數據庫的請求就會遭到失敗。
        
        下面的例子展示了會導致問題的不恰當配置。
        
        例 1 考慮如下配置: (所有頁的大小都為 4K)
        
        服務器: 
        
        服務器上的物理 RAM 16GB 
        shmsys:shminfo_shmmax = 2097152 (2GB)
        數據庫: 
        
        IBMDEFAULTBP 400,000 頁 
        UTILHEAP 17,500 頁 
        DBHEAP 30,000 頁 
        LOCKLIST 1000 頁 
        PCKCACHE 5000 頁 
        CATALOGCACHE 2500 頁
        限制: DB2 發出的任何創建大于 shmmax 值(這里是 2GB)的數據庫共享內存集的請求都將失敗,并返回一個 out of memory type 錯誤。
        
        計算: 
        
        數據庫共享內存 = (456,000 頁 x 4KB/頁) x 1.1 = ~2.0GB 
        
        問題: 可能仍然可以激活數據庫或者連接到數據庫。但是,嘗試運行一個應用程序時可能返回如下錯誤消息: 
        
        SQL1224N A database agent could not be started to service request, or was terminated as a result of a database system shutdown or a force command. SQLSTATE=55032 
        
        這是 DB2 經常返回的一個錯誤。不過,如果不是在 AIX 服務器上,而是在 UNIX 服務器上,那么這就很可能與內存資源問題有關。特別地,可能是內核參數沒有進行適當的調優。
        
        為解決這個問題,可以適當地配置內核參數。設置: 
        
        shmsys:shminfo_shmmax = 15099494 (~90% of 16GB) 
        
        例 2 考慮如下配置: (所有頁的大小都為 4K)
        
        服務器上的物理 RAM 是 1 GB。
        
        數據庫 A: 
        
        IBMDEFAULTBP 137,500 頁 
        INTRA_PARALLEL ON 
        UTILHEAP 10,000 頁 
        DBHEAP 10,000 頁 
        SHEAPTHRES_SHR 20,000 頁 
        LOCKLIST 1000 頁 
        PCKCACHE 5000 頁 
        CATALOGCACHE 2500 頁 
        APPGROUP_MEM_SZ 20,000 頁
        數據庫 B: 
        
        IBMDEFAULTBP 92,500 頁 
        INTRA_PARALLEL ON 
        UTILHEAP 5,000 頁 
        DBHEAP 10,000 頁 
        SHEAPTHRES_SHR 15,000 頁 
        LOCKLIST 1000 頁 
        PCKCACHE 5000 頁 
        CATALOGCACHE 2500 頁 
        APPGROUP_MEM_SZ 20,000 頁
        限制: 因為共享內存是固定到物理 RAM 的,所以這種內存不會被換出。因此,我們只能分配最多 1GB (可用的物理 RAM)的共享內存給數據庫使用。
        
        計算: 
        
        數據庫 A 共享內存 = (186,000 頁 x 4KB/頁) x 1.1% = ~818MB 
        數據庫 A 應用程序組內存 = 20,000 頁 x 4KB/頁 = 80MB 
        數據庫 B 共享內存 = (131,000 頁 x 4KB/頁) x 1.1% = ~576MB 
        數據庫 B 應用程序組內存 = 20,000 頁 x 4KB/頁 = 80MB
        為了啟動數據庫 A,要求: 818MB + 80MB = ~898MB 
        為了啟動數據庫 B,要求: 576MB + 80MB = ~656MB
        問題: 假設數據庫 A 是激活的。至少有 898MB 的共享內存固定在物理 RAM 中。當嘗試激活數據庫 B 時,就會碰到如下錯誤消息: 
        
        SQL1084C Shared memory segments cannot be allocated. SQLSTATE=57019 
        
        如果同時啟動數據庫 A 和數據庫 B,我們將請求至少 1.55GB (898MB + 656MB) 的可用物理 RAM,以便同樣地將共享內存固定在 RAM 中。顯然,1GB 的 RAM 不夠。為解決這一問題: 
        
        嘗試減少這兩個數據庫的緩沖池大小。或者 
        嘗試減少應用程序組內存。或者 
        更可能的是,增加更多的物理 RAM。在這種情況下,您將需要至少 1.55GB 的物理 RAM,才能同時啟動這兩個數據庫。
        在這種情況下,按照上面的數據庫配置參數,在任何時刻啟動某一個數據庫(數據庫 A 或數據庫 B)是可行的,但是不能同時啟動兩個數據庫。這是必須增加更多的物理 RAM。
        
        這個問題在 AIX 中不會出現,因為在 AIX 中共享內存沒有固定在物理 RAM 中。在這種場景中,可以啟動數據庫 B。但是,這意味著數據庫 A 的數據庫內存必須調出。當一個應用程序訪問數據庫 A 時,又得將數據庫 B 的數據庫內存調出。您可以想象未來要發生的調頁次數有多少。
        
        例 3 考慮如下配置: (所有頁的大小都是 4K) 
        服務器: 
        
        服務器上的物理 RAM 16GB 
        shmsys:shminfo_shmmax = 15099494 (16GB 的 ~90%)
        數據庫: 
        
        IBMDEFAULTBP 350,000 頁 
        UTILHEAP 17,500 頁 
        DBHEAP 10,000 頁 
        LOCKLIST 1000 頁 
        PCKCACHE 5000 頁 
        CATALOGCACHE 2500 頁 
        ESTORE_SEG_SZ = 400000 頁 
        NUM_ESTORE_SEGS = 1
        計算: 
        
        數據庫共享內存 = (386,000 頁 x 4KB/頁 + 400,000 頁的 estore * 100 字節) x 1.1 = ~1.66GB 
        ESTORE memory = 400000 x 4KB = 1.6GB
        問題: 數據庫共享內存是 1.66GB。這個數小于 3.35GB 的數據庫共享內存限制。shmmax 參數設置得比較恰當。但是在啟動數據庫時可能返回下面的錯誤消息!您可以在 db2diag.log 中看到如下錯誤消息: 
        
        2003-12-04-10.10.13.362027 Instance:db2inst1 Node:000 
        PID:18327(db2agent (SAMPLE) 0) TID:1 Appid:*LOCAL.sample.047844091013 
        oper system services sqloVLMAttachVLMSegment Probe:20 Database:SAMPLE 
        sqloVLMAttachVLMSegment - shmat failed 
        0xFFBE833C : 0x0000000C
        shmat 是一個 UNIX 函數,它將與 shmid(另一個 Solaris 函數)所標識的共享內存相關的共享內存段附加到調用進程的數據段上。shmat 失敗于 0x000000C,即 ENOMEM 或可用數據空間不足以容納共享內存段。
        
        換句話說,不能激活數據庫或連接到數據庫,因為沒有足夠的共享內存來滿足請求。
        
        那么該怎么辦呢?答案在于我們分配 ESTORE 的方式。每個 ESTORE 段必須是一個連續的塊。在我們的例子中,我們試圖為 ESTORE 分配很大的一塊(連續的)內存(1.6GB)。即使有 16GB 的 RAM,它也可能會被分段,從而沒有一塊連續的 1.6GB 的內存。
        
        為解決這個問題,在數據庫配置文件中像下面這樣設置 ESTORE 的值: 
        
        ESTORE_SEG_SZ = 40000 頁 
        NUM_ESTORE_SEGS = 10
        
        通過設置上面的 ESTORE 值,實際上我們仍然試圖為 ESTORE 分配總共 1.6 GB 的內存。然而,我們將嘗試為 ESTORE 分配 10 塊 160MB 的內存。這樣分配的連續空間就要小得多,因此最有可能解決問題。 

        全文完。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99国产精品久久久久久久| 国产精品视频xxxx| 欧美在线观看网址综合| 亚洲精品国偷自产在线99热| 亚洲欧美成人在线| 香蕉av福利精品导航| 国产美女诱惑一区二区| 亚洲欧美一区二区激情| 久久久之久亚州精品露出| 黄色一区二区三区| 亚洲一区二区三区中文字幕| 亚洲专区国产精品| 国产亚洲精品一区二区| 亚洲欧美一级二级三级| 亚洲欧美中文字幕| 久久本道综合色狠狠五月| 亚洲激情欧美激情| 亚洲视频精品| 美女视频网站黄色亚洲| 亚洲高清视频在线观看| 欧美国产成人精品| 一区二区不卡在线视频 午夜欧美不卡在| 99re这里只有精品6| 欧美午夜精品久久久久久浪潮| 亚洲欧美影音先锋| 美女网站在线免费欧美精品| 亚洲欧美在线aaa| 久久亚洲美女| 欧美一区激情| 99在线精品观看| 性欧美暴力猛交另类hd| 亚洲精选中文字幕| 免费欧美视频| 亚洲视频一区| 久久五月激情| 欧美三级不卡| 欧美日产在线观看| 蜜桃av一区| 国产精品vip| 亚洲激情成人| 亚洲成色最大综合在线| 国产专区一区| 国产亚洲一区二区三区在线观看| 亚洲电影专区| 欧美一区亚洲| 亚洲欧美一区二区视频| 99在线精品视频在线观看| 国产一区二区三区在线观看免费| 亚洲人成77777在线观看网| 亚洲第一精品福利| 亚洲一区亚洲二区| 欧美激情中文字幕一区二区| 欧美视频1区| 欧美大片在线影院| 另类天堂av| 久久先锋影音av| 国产精品h在线观看| 亚洲国产国产亚洲一二三| 欧美影院一区| 亚洲性感激情| 亚洲一区二区三区四区五区黄| 欧美风情在线观看| 亚洲成人在线| 欧美3dxxxxhd| 日韩亚洲欧美精品| 一本一本久久a久久精品牛牛影视| 久久精品免视看| 久久久精品午夜少妇| 国产精品美女主播| 国内精品久久久久影院薰衣草| 亚洲在线电影| 日韩视频久久| 国产精品ⅴa在线观看h| 亚洲欧美www| 欧美成人精品在线播放| 久久国产夜色精品鲁鲁99| 久久久久国产成人精品亚洲午夜| 久久青草久久| 欧美在线国产精品| 狠狠色2019综合网| 亚洲一区在线免费| 亚洲欧美成人一区二区在线电影| 欧美视频中文字幕| 欧美在线高清| 久久久久久久999精品视频| 欧美区日韩区| 国产亚洲一区二区三区| 麻豆成人在线播放| 亚洲一区二区三区免费视频| 国产欧美一区二区精品仙草咪| 在线免费观看视频一区| 欧美激情精品久久久久久黑人 | 欧美日韩亚洲激情| 国产欧美va欧美不卡在线| 久久福利精品| 在线视频精品一区| 国产精品天天摸av网| 久久久精彩视频| 欧美黄色免费网站| 午夜精品电影| 美女黄网久久| 亚洲一区二区三区在线播放| 蜜桃av久久久亚洲精品| 欧美电影美腿模特1979在线看| 亚洲欧美日韩综合| 久久免费国产| 亚洲欧美日韩成人| 蜜桃久久精品一区二区| 亚洲女人天堂av| 老**午夜毛片一区二区三区| 亚洲一级网站| 欧美88av| 亚洲精品视频一区| 亚洲香蕉在线观看| 亚洲国产99精品国自产| 亚洲一区二区三区乱码aⅴ蜜桃女| 国外精品视频| 在线视频你懂得一区二区三区| 亚洲成色www8888| 午夜精品成人在线| 亚洲香蕉视频| 欧美精品免费视频| 日韩一区二区电影网| 久久免费少妇高潮久久精品99| 亚洲视频一区二区在线观看| 亚洲国产欧美一区二区三区同亚洲| 久久精品国产亚洲5555| 亚洲婷婷综合色高清在线| 欧美成年人视频网站欧美| 久久久久久一区二区| 国产精品午夜春色av| 99精品国产99久久久久久福利| 亚洲青色在线| 欧美国产激情二区三区| 欧美91福利在线观看| 极品尤物av久久免费看| 午夜老司机精品| 亚洲欧美视频在线观看视频| 欧美午夜激情小视频| 一级成人国产| 午夜精品99久久免费| 国产精品午夜视频| 亚洲欧美日韩人成在线播放| 午夜精品视频在线观看| 国产精品推荐精品| 亚洲欧美日韩在线高清直播| 亚洲欧美日韩一区二区在线 | 亚洲午夜久久久久久久久电影院| 在线综合亚洲欧美在线视频| 亚洲一区二区三区777| 亚洲综合日韩在线| 国产精品久久久爽爽爽麻豆色哟哟| 中文av一区特黄| 久久不射电影网| 永久91嫩草亚洲精品人人| 亚洲黄色一区| 亚洲精品123区| 欧美日韩中文字幕日韩欧美| 日韩午夜黄色| 香蕉久久一区二区不卡无毒影院| 国产乱人伦精品一区二区| 欧美一区二区在线观看| 美女日韩在线中文字幕| 亚洲免费福利视频| 久久精品国产精品| 欧美凹凸一区二区三区视频| 99国产成+人+综合+亚洲欧美| 欧美福利视频网站| 亚洲一区二区三区四区视频| 久久综合婷婷| 欧美国产一区二区| 欧美日韩日韩| 久久国产精品99精品国产| 亚洲国产电影| 国产一区二区在线观看免费播放| 亚洲欧美日韩综合国产aⅴ| 国产欧美一区二区精品仙草咪| 久久这里只有| 亚洲自拍偷拍视频| 免费观看成人| 亚洲欧美日韩精品在线| 亚洲第一精品夜夜躁人人爽 | 蜜臀av性久久久久蜜臀aⅴ| 日韩亚洲欧美在线观看| 亚洲欧美另类在线观看| 久久精品国产久精国产一老狼| 亚洲国产婷婷香蕉久久久久久99| 国产精品99久久99久久久二8| 免费av成人在线| 午夜精品久久久久久久久久久| 亚洲精品欧美| 在线观看视频一区二区| 国产啪精品视频| 欧美日韩一卡二卡| 一本色道88久久加勒比精品| 久久精品国内一区二区三区| 亚洲一二三区精品| 国内精品久久久久久久影视麻豆 | 欧美精品aa| 欧美阿v一级看视频|