2.6 DB2 pureScale环境中内存管理
DB2性能管理与实战
本节将要介绍与pureScale特性相关的内存管理,可以对比前面的单节点环境下的内存管理,来分析它们之间的异同点。本节为学习后续章节中的相关案例奠定了基础。
2.6.1 集群高速缓存设施
在DB2 pureScale环境中,又引入了集群高速缓存设施(CF),CF将不同内存堆用于以下用途。
1.组缓冲池内存
组缓冲池内存被用于DB2pureScale实例的组缓冲池。如果以一致方式将此类型的内存用至最大已配置能力,那么可能会对性能有负面影响。但是,内存可能被用至极限的事实本身并不指示性能可能受到影响。请检查组缓冲池的命中速率以确保性能是否降低。低命中速率与高组缓冲池内存使用情况一起出现可能指示需要增加此类型的内存。此类型的内存由CF_GBP_SZ配置参数配置。
2.锁定内存
锁定内存用于管理DB2 pureScale实例中的页锁定。如果CF上的锁定没有足够的内存可用,那么可能会发生以下情况。
boll 锁定升级可能发生,这会降低所涉及对象的并行性。
boll 锁定请求可能被拒绝,从而导致返回SQL0912消息。
此类型的内存由cf_lock_sz配置参数配置。
3.共享通信区(SCA)内存
SCA内存包含表、索引、表空间和目录的数据库范围信息。每个数据库在CF中都有自己的SCA内存。此内存是第一次在任何DB2成员上激活数据库期间分配的,直到数据库被废弃或CF停止时才会释放。如果使用表分区,那么使CF与成员间的表分区数据同步时所需的信息也存储在SCA内存中。
如果此类型的内存被用至极限,那么表可能会无法装入,并且会返回错误。此类型的内存由CF_SCA_SZ配置参数配置。
4.整体CF内存
整体CF内存是对CF可用的总物理内存量,它由CF_MEM_SIZE配置参数设置。组缓冲池、锁定和共享通信区的内存都分配自此内存池。因此,为这些特定类型的内存分配的总内存量不能超过使用CF_MEM_SIZE配置参数配置的内存量。
缺省情况下,系统会自动配置其中每个类型的内存。DB2 pureScale Feature提供了一些监视元素,可使用这些监视元素来检查当前正由系统使用的每个类型的内存的量。还有一些相关元素,可使用这些元素来确定每个类型的内存的最大大小以及是否正在执行调整内存大小操作。
可使用MON_GET_CF表函数来检索各种报告DB2 pureScale实例中集群高速缓存设施的内存使用情况的监视器元素。
SELECT SUBSTR(HOST_NAME,1,10)AS HOST,
ID as HOSTID,
CURRENT_CF_LOCK_SIZE,
CONFIGURED_CF_LOCK_SIZE,
TARGET_CF_LOCK_SIZE
FROM TABLE( MON_GET_CF( NULL ))
运行上述管理视图,可以得到以下结果。
HOST HOSTID CURRENT_CF_LOCK_SIZE CONFIGURED_CF_LOCK_SIZE
-----------------------------------------------------------
HOSTA 128 133852 564224
HOSTB 129 133852 564224
TARGET_CF_LOCK_SIZE
-------------------
564224
564224
2 record(s)selected.
可以通过下列语句查看所有系统上所有集群高速缓存设施的组缓冲池内存大小的信息。
SELECT SUBSTR(HOST_NAME,1,20)AS HOST,
ID as HOSTID,
CURRENT_CF_GBP_SIZE,
CONFIGURED_CF_GBP_SIZE,
TARGET_CF_GBP_SIZE
FROM TABLE( MON_GET_CF(NULL))
在此示例中,当前GBP大小为367,611个4KB页或1,505,734,656字节。分配给GBP的内存为500,224个4KB页或2,048,917,504字节。
H```javascript
OST HOSTID CURRENT_CF_GBP_SIZE CONFIGURED_CF_GBP_SIZE TARGET_CF_GBP_SIZE
HOSTA 128 367611 500224 500224
HOSTB 129 367611 500224 500224
2 record(s)selected.
检索特定主机的共享通信区(SCA)内存使用情况数据,可以通过下列语句。
```javascript
SELECT SUBSTR(HOST_NAME,1,8)AS HOST,
ID as HOSTID,
CURRENT_CF_SCA_SIZE,
CONFIGURED_CF_SCA_SIZE,
TARGET_CF_SCA_SIZE
FROM TABLE(MON_GET_CF(128))
在此示例中,当前正使用的SCA内存为43个4KB页。检索这些监视器元素时,最大SCA内存大小为16,128个4KB页。但是,所配置大小和目标大小不同,这意味着SCA内存的大小正从先前最大所配置大小增加至23,280页。
HOST HOSTID CURRENT_CF_SCA_SIZE CONFIGURED_CF_SCA_SIZE
-------------------------------------------------------
HOSTA 128 43 16128
TARGET_CF_SCA_SIZE
------------------
23280
1 record(s)selected.
2.6.2 pureScale环境中的缓冲池命中速率和命中率
在DB2 pureScale环境中,DB2 Agent读取数据页的方式发生了变化。图2-7所示为当DB2搜寻一个数据页时,GBP和LBP的搜寻顺序和相互关系。
当Agent搜索数据页时,首先在LBP中搜索,如果搜索到了有效的数据页即返回。如果在LBP中搜索到无效的数据页,就转到GBP中搜寻。如果在LBP中没有搜到,也会到GBP中搜寻。如果在GBP中搜到即返回给LBP。如果在GBP中也无法搜到,那么就到磁盘中搜寻。
在DB2 pureScale环境中,访问整体性能时,本地缓冲池和组缓冲池命中速率和命中率都是重要因素。
本地缓冲池(LBP)命中率反映可在本地缓冲池中找到成员所需并处于有效状态的页的程度。如果成员的LBP中的页在装入到LBP中之后未被另一成员更改,那么此页被认为处于有效状态。如果另一成员已更改此页(更改可能会在此页被释放至磁盘之前发生),那么此页被认为无效。如果具有无效页的成员需要此页才能执行事务,那么成员必须访问CF才能请求此页的新的有效版本。
低LBP命中率指示未在本地找到这些页,必须向CF请求这些页。但是,在DB2 pureScale环境中,查看LBP命中率只能了解缓冲池状况的一个方面。还需要考虑组缓冲池(GBP)在检索页时充当的角色以及GBP本身的命中率。如果某个成员在其LBP中找不到某页的有效副本,那么它会向CF请求在GBP中搜索此页的有效副本。GBP执行下列其中一个操作:
boll 如果GBP包含此页的有效副本,那么它会向发出此请求的成员提供此页;
boll 否则,GBP会告诉请求成员它必须从磁盘读取此页。
使用LBP的另一注意事项是独立于GBP的页的概念。独立于GBP的页是仅曾经通过成员的LBP访问但从未存在于GBP中的页。一些页可能是独立于GBP的,因为只有本地成员访问使用这些页的操作或这些页源自的对象。
组缓冲池命中率反映在组缓冲池中找到成员所需但没有其有效本地副本的页(相对于必须从磁盘读取)的程度。GBP的低命中率指示GBP中提供的实例中成员所需的页数相对较少。增加GBP的大小可改进命中速率和整体性能。因此,计算成员的本地缓冲池(LBP)中的数据页的命中率时,需要考虑成员尝试从LBP读取页的次数相对于尝试读取但在LBP中找不到有效页的次数。
提示:
命中率可能会根据许多因素(例如,数据库中的数据特性、对其运行的查询以及硬件和软件配置)而变化。一般来讲,缓冲池命中率越高,反映查询性能越好。如果发现命中率好像很低,或者随时间变化不断下降,那么增加缓冲池大小会有帮助。要增加组缓冲池的大小,请在CF上调整CF_GBP_SZ配置参数。要调整本地缓冲池,请在具有需要校正的缓冲池的成员上运行ALTER BUFFERPOOL语句。
1.缓冲池监视元素报告
在DB2 pureScale环境中,与其他DB2环境一样,每个成员都会报告它自己的本地缓冲池。在某些情况下,您可能想要计算特定成员的命中率。在其他情况下,可能想要一起查看所有成员的数据,以整体了解DB2 pureScale环境的命中速率和命中率。
例如,如果通过将pool_data_gbp_p_reads监视元素与MON_GET_BUFFERPOOL表函数配合使用来提交查询,以返回表示将数据页从磁盘读取到本地缓冲池中(因为在GBP中找不到此数据页)的次数的数据,并且您未指定要返回的成员,那么您会见到如下所示的结果。
MEMBER BP_NAME POOL_DATA_GBP_P_READS
-----------------------------------------------
0 IBMDEFAULTBP 408
0 IBMSYSTEMBP4K 0
0 IBMSYSTEMBP8K 0
0 IBMSYSTEMBP16K 0
0 IBMSYSTEMBP32K 0
1 IBMDEFAULTBP 108
1 IBMSYSTEMBP4K 0
1 IBMSYSTEMBP8K 0
1 IBMSYSTEMBP16K 0
1 IBMSYSTEMBP32K 0
2 IBMDEFAULTBP 112
2 IBMSYSTEMBP4K 0
2 IBMSYSTEMBP8K 0
2 IBMSYSTEMBP16K 0
2 IBMSYSTEMBP32K 0
15 record(s)selected.
要点:
在以上示例中,可见到针对临时缓冲池报告的数据全部显示为零,这并非巧合。在DB2 pureScale实例中,临时对象和表空间在它们的关联成员的本地。它们在CF上不使用GBP。如果关心所有成员的结果,可使用SUM聚集函数将所有成员的数目加到一起。
SELECT VARCHAR(BP_NAME,15)AS BP_NAME,
SUM(POOL_DATA_GBP_P_READS)AS TOTAL_P_READS
FROM TABLE(MON_GET_BUFFERPOOL('',-2))
GROUP BY BP_NAME
以上查询返回类似以下输出的结果:
BP_NAME TOTAL_P_READS
-----------------------------------
IBMDEFAULTBP 310
IBMSYSTEMBP16K 0
IBMSYSTEMBP32K 0
IBMSYSTEMBP4K 0
IBMSYSTEMBP8K 0
5 record(s)selected.
2.用于计算缓冲池命中率的公式
可使用基于缓冲池监视元素的公式来计算命中速率和命中率。
boll 本地缓冲池(DB2 pureScale环境)
在DB2 pureScale环境中计算LBP命中率时,还必须考虑独立于GBP的数据页命中率。成员请求数据页时,会先检查LBP。如果LBP中发现该页,那么pool_data_lbp_pages_found监视元素会递增。如果LBP中未发现该页,那么直接从磁盘读取,并且pool_data_p_reads监视元素会递增。但是,如果在本地缓冲池中发现依赖于GBP的页,那么pool_data_lbp_pages_found监视计数器也会递增。新监视元素pool_data_gbp_indep_pages_found_in_lbp是区分这些情况下的页访问计数的唯一方法。
对于独立于GBP的页,调整LBP大小将影响命中率。对于独立于GBP的某些类型的操作,例如,临时页访问或NOT LOGGED INITIALLY操作,那么要监视独立于GBP的页命中率。或者,要计算独立于GBP的页代理程序的本地缓冲池命中率,可使用以下公式。
您需要比较LBP命中率与GBP命中率,以决定如何调整这两个缓冲池,或在调整GBP和LBP后验证结果。
boll 组缓冲池(DB2 pureScale环境)
用于计算DB2 pureScale环境中的组缓冲池命中率的公式与其他DB2环境中使用的命中率公式不同。不同是因为集群高速缓存设施中的组缓冲池使用每个成员中的本地缓冲池来检索数据页。以下基于缓冲池监视元素的公式可用于计算本地缓冲池和组缓冲池的数据页、索引页和XML存储对象页的命中率。
除先前用于计算缓冲池命中率的公式之外,还可使用以下公式来显示在GBP中发现预取页的次数的百分比。
boll 预取的命中率
数据页预取的命中率可以通过下列公式计算:
((pool_async_data_gbp_l_reads- pool_async_data_gbp_p_reads)/ pool_async_data_gbp_l_reads)×100
索引页预取的命中率可以通过下列公式计算:
((pool_async_index_gbp_l_reads- pool_async_index_gbp_p_reads )/ pool_async_index_gbp_l_reads)× 100
XML存储对象(XDA)页的预取命中率可以通过下列公式计算:
((pool_async_xda_gbp_l_reads- pool_async_xda_gbp_p_reads )/ pool_async_xda_gbp_l_reads)×100
以上这些参数都可以通过InfoSphere Optim Performance Manager的仪表板查看相应的结果。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。