计算 DB2 pureScale 环境中的缓冲池命中率

计算 DB2 pureScale实例的缓冲池命中率可帮助您了解是否有机会调整缓冲池以提高 I/O 效率。

开始之前

确定您所关心的比率。如果要查看实例中所有成员中的比率,请考虑制定 SQL 以使用 SUM 聚集函数来聚集成员中的数据。如果您只想查看特定成员的数据,那么可在 MON_GET_BUFFERPOOL 表函数中指定要查看其数据的成员。

过程

要计算缓冲池命中率,请执行以下步骤:

  1. 检索必需监视元素的信息。
    此示例使用 MON_GET_BUFFERPOOL 表函数来检索监视元素,这些监视元素包含计算 GBP、pool_data_gbp_l_readspool_data_gbp_p_reads 的数据页的命中率时所需的值。
    SELECT varchar(bp_name,20) AS bp_name,
           pool_data_gbp_l_reads,
           pool_data_gbp_p_reads,
           member 
    FROM TABLE(MON_GET_BUFFERPOOL('',-2)) 
    以上查询返回类似以下示例的数据:
    BP_NAME              POOL_DATA_GBP_L_READS POOL_DATA_GBP_P_READS MEMBER
    -------------------- --------------------- --------------------- ------
    IBMDEFAULTBP                       1814911                456990      1
    IBMSYSTEMBP4K                            0                     0      1
    IBMSYSTEMBP8K                            0                     0      1
    IBMSYSTEMBP16K                           0                     0      1
    IBMSYSTEMBP32K                           0                     0      1
    IBMDEFAULTBP                       1807959                455287      3
    IBMSYSTEMBP4K                            0                     0      3
    IBMSYSTEMBP8K                            0                     0      3
    IBMSYSTEMBP16K                           0                     0      3
    IBMSYSTEMBP32K                           0                     0      3
    IBMDEFAULTBP                       1813932                455225      2
    IBMSYSTEMBP4K                            0                     0      2
    IBMSYSTEMBP8K                            0                     0      2
    IBMSYSTEMBP16K                           0                     0      2
    IBMSYSTEMBP32K                           0                     0      2
    IBMDEFAULTBP                       1113396                278845      0
    IBMSYSTEMBP4K                            0                     0      0
    IBMSYSTEMBP8K                            0                     0      0
    IBMSYSTEMBP16K                           0                     0      0
    IBMSYSTEMBP32K                           0                     0      0
    
      20 record(s) selected.
    要点: 在以上示例中,可见到针对临时缓冲池报告的数据全部显示为零。这并非巧合;在 DB2 pureScale实例中,临时对象和表空间在它们的关联成员的本地。它们在 CF 上不使用 GBP。
  2. 使用针对监视元素返回的值来计算命中率。
    用于计算 GBP 的命中率(表示为百分比)的公式为
    ((pool_data_gbp_l_reads - pool_data_gbp_p_reads ) ÷ pool_data_gbp_l_reads) × 100
    所以,使用对步骤 1 中的监视元素返回的数据:
        (((1,814,911+1,807,959  + 1,813,932+1,113,396) - (456,990+455,287 + 455,225+278,845)) ÷ (1,814,911+1,807,959 + 1,813,932+1,113,396)) × 100
        = ((6,550,198 - 1,646,347) ÷ 6,550,198) × 100
        = 74.9%
    在此示例中,GBP 的命中率为 74.9%
    注: 查询输出中显示的值仅供展示。

示例

示例 1:查找所有成员中的整体命中速率

此示例与上一个过程中显示的示例类似,只是它使用聚集函数来提供所有成员中的整体命中速率。

SELECT VARCHAR(BP_NAME,20) AS BP, 
       SUM(POOL_DATA_GBP_L_READS) AS POOL_DATA_GBP_L_READS, 
       SUM(POOL_DATA_GBP_P_READS) AS POOL_DATA_GBP_P_READS 
FROM TABLE(MON_GET_BUFFERPOOL('',-2))
GROUP BY BP_NAME
结果:
BP                   POOL_DATA_GBP_L_READS POOL_DATA_GBP_P_READS
-------------------- --------------------- ---------------------
IBMDEFAULTBP                       6550198               1646347
IBMSYSTEMBP16K                           0                     0
IBMSYSTEMBP32K                           0                     0
IBMSYSTEMBP4K                            0                     0
IBMSYSTEMBP8K                            0                     0

  5 record(s) selected.
示例 2:确定所有数据、索引和 XML 存储器对象 (XDA) 页的 GBP 命中率

要计算所有数据、索引和 XDA 页的 GBP 命中率,请使用以下公式:

((pool_data_gbp_l_reads + pool_index_gbp_l_reads+pool_xda_gbp_l_reads)
  - (pool_data_gbp_p_reads + pool_index_gbp_p_reads+pool_xda_gbp_p_reads ))
  ÷ (pool_data_gbp_l_reads + pool_index_gbp_l_reads+pool_xda_gbp_l_reads) × 100

以下示例使用 MON_GET_BUFFERPOOL 表函数来检索必需监视元素中包含的数据并针对每个成员计算命中率:
WITH BPMETRICS AS (
     SELECT BP_NAME, 
            POOL_DATA_GBP_L_READS +
              POOL_INDEX_GBP_L_READS +
              POOL_XDA_GBP_L_READS
            AS LOGICAL_READS, 
            POOL_DATA_GBP_P_READS + 
              POOL_INDEX_GBP_P_READS + 
              POOL_XDA_GBP_P_READS
            AS PHYSICAL_READS,
            MEMBER 
     FROM TABLE(MON_GET_BUFFERPOOL('',-2)) AS METRICS)
     SELECT VARCHAR(BP_NAME,20) AS BP_NAME,
            LOGICAL_READS,
            PHYSICAL_READS,
     CASE WHEN LOGICAL_READS > 0 
          THEN DEC(((FLOAT(LOGICAL_READS) - FLOAT(PHYSICAL_READS))/FLOAT(LOGICAL_READS))
* 100,5,2)
          ELSE NULL END AS HIT_RATIO,
          MEMBER 
     FROM BPMETRICS
结果:
BP_NAME              LOGICAL_READS        PHYSICAL_READS       HIT_RATIO MEMBER
---------------- ------------- -------------- --------- ------
IBMDEFAULTBP                      5730213               617628     89.22      1
IBMSYSTEMBP4K                           0                    0         -      1
IBMSYSTEMBP8K                           0                    0         -      1
IBMSYSTEMBP16K                          0                    0         -      1
IBMSYSTEMBP32K                          0                    0         -      1
IBMDEFAULTBP                      5724845               615395     89.25      3
IBMSYSTEMBP4K                           0                    0         -      3
IBMSYSTEMBP8K                           0                    0         -      3
IBMSYSTEMBP16K                          0                    0         -      3
IBMSYSTEMBP32K                          0                    0         -      3
IBMDEFAULTBP                      5731714               615814     89.25      2
IBMSYSTEMBP4K                           0                    0         -      2
IBMSYSTEMBP8K                           0                    0         -      2
IBMSYSTEMBP16K                          0                    0         -      2
IBMSYSTEMBP32K                          0                    0         -      2
IBMDEFAULTBP                      5024809               409159     91.85      0
IBMSYSTEMBP4K                           0                    0         -      0
IBMSYSTEMBP8K                           0                    0         -      0
IBMSYSTEMBP16K                          0                    0         -      0
IBMSYSTEMBP32K                          0                    0         -      0

  20 record(s) selected.
示例 3:使用 SUM 聚集函数来计算整体命中率
还可使用 SUM 聚集函数来计算所有成员中的整体命中率,如下所示:
WITH BPMETRICS AS (
     SELECT SUM(POOL_DATA_GBP_L_READS) + 
       SUM(POOL_INDEX_GBP_L_READS) + 
       SUM(POOL_XDA_GBP_L_READS) 
     AS LOGICAL_READS, 
     SUM(POOL_DATA_GBP_P_READS)+SUM(POOL_INDEX_GBP_P_READS)+SUM(POOL_XDA_GBP_P_READS)
AS PHYSICAL_READS
     FROM TABLE(MON_GET_BUFFERPOOL('',-2)) AS METRICS)
     SELECT LOGICAL_READS,
            PHYSICAL_READS,
     CASE WHEN LOGICAL_READS > 0 
     THEN DEC(((FLOAT(LOGICAL_READS) - FLOAT(PHYSICAL_READS))/FLOAT(LOGICAL_READS))
* 100,5,2)
     ELSE NULL END AS HIT_RATIO 
FROM BPMETRICS
结果:
LOGICAL_READS        PHYSICAL_READS       HIT_RATIO
-------------------- -------------------- ---------
            22211581              2255996     89.84

  1 record(s) selected.

下一步做什么

如果命中率看起来很低,或者它们随时间变化下降,那么您可能要在成员和/或 CF 上增加缓冲池的大小。如果见到低于 DB2 pureScale实例整体的 LBP 的预期命中率,请分别查看每个成员的命中速率,因为每个成员上的缓冲池可能会有不同大小。如果一个成员上的 LBP 较小,那么可能会对实例的平均命中速率产生不良影响。
提示: 命中率可能会根据许多因素(例如,数据库中的数据特性、对其运行的查询以及硬件和软件配置)而变化。一般来讲,缓冲池命中率越高,反映查询性能越好。如果发现命中率好像很低,或者随时间变化不断下降,那么增加缓冲池大小会有帮助。要增加组缓冲池的大小,请在 CF 上调整 cf_gbp_sz 配置参数。要调整本地缓冲池,请在具有需要校正的缓冲池的成员上运行 ALTER BUFFERPOOL 语句。