1. 首页 > DB2教程 > 正文

DB2教程FG079-DB2内存池优化实战

风哥教程参考DB2官方文档Memory Management、Performance Tuning等内容,详细介绍内存池配置、缓冲池优化、内存监控等。更多视频教程www.fgedu.net.cn

目录大纲

Part01-内存池架构

1.1 内存池类型

DB2内存池类型:

  • 缓冲池:缓存数据页
  • 排序堆:排序操作
  • 包缓存:缓存SQL包
  • 锁列表:存储锁信息
  • 日志缓冲区:日志缓存

1.2 内存管理

  • 实例级内存:INSTANCE_MEMORY
  • 数据库级内存:DATABASE_MEMORY
  • 应用级内存:APPL_MEMORY

Part02-缓冲池配置

2.1 缓冲池创建

# 创建默认页面大小缓冲池
CREATE BUFFERPOOL BP_DEFAULT SIZE 100000;

# 创建8K页面大小缓冲池
CREATE BUFFERPOOL BP8K SIZE 50000 PAGESIZE 8K;

# 创建16K页面大小缓冲池
CREATE BUFFERPOOL BP16K SIZE 25000 PAGESIZE 16K;

# 创建32K页面大小缓冲池
CREATE BUFFERPOOL BP32K SIZE 12500 PAGESIZE 32K;

# 查看缓冲池配置
SELECT
BPNAME,
PAGESIZE,
NPAGES,
CURRENTSIZE
FROM SYSIBMADM.BP_HITRATIO;

# 修改缓冲池大小
ALTER BUFFERPOOL BP_DEFAULT SIZE 200000;

# 删除缓冲池
DROP BUFFERPOOL BP8K;

2.2 缓冲池优化

# 查看缓冲池命中率
SELECT
BPNAME,
DATA_HIT_RATIO_PERCENT,
INDEX_HIT_RATIO_PERCENT,
XDA_HIT_RATIO_PERCENT
FROM SYSIBMADM.BP_HITRATIO;

# 查看缓冲池使用情况
SELECT
BPNAME,
POOL_DATA_L_READS,
POOL_DATA_P_READS,
POOL_DATA_WRITES,
POOL_INDEX_L_READS,
POOL_INDEX_P_READS
FROM SYSIBMADM.SNAPBP;

# 计算命中率
SELECT
BPNAME,
CASE
WHEN POOL_DATA_L_READS > 0
THEN ROUND((POOL_DATA_L_READS – POOL_DATA_P_READS) * 100.0 / POOL_DATA_L_READS, 2)
ELSE 0
END AS DATA_HIT_RATIO,
CASE
WHEN POOL_INDEX_L_READS > 0
THEN ROUND((POOL_INDEX_L_READS – POOL_INDEX_P_READS) * 100.0 / POOL_INDEX_L_READS, 2)
ELSE 0
END AS INDEX_HIT_RATIO
FROM SYSIBMADM.SNAPBP;

# 缓冲池建议
# 命中率 > 95%:缓冲池大小合适
# 命中率 < 95%:考虑增大缓冲池 # 命中率 < 90%:必须增大缓冲池

Part03-内存参数优化

3.1 数据库内存参数

# 配置数据库内存
UPDATE DATABASE CONFIGURATION USING DATABASE_MEMORY AUTOMATIC;

# 配置缓冲池内存
UPDATE DATABASE CONFIGURATION USING BUF_PAGE_SZ 4096;

# 配置排序堆
UPDATE DATABASE CONFIGURATION USING SORTHEAP 8192;
UPDATE DATABASE CONFIGURATION USING SHEAPTHRES 65536;

# 配置包缓存
UPDATE DATABASE CONFIGURATION USING PCKCACHESZ 8192;

# 配置锁列表
UPDATE DATABASE CONFIGURATION USING LOCKLIST 4096;
UPDATE DATABASE CONFIGURATION USING MAXLOCKS 20;

# 配置日志缓冲区
UPDATE DATABASE CONFIGURATION USING LOGBUFSZ 1024;

# 配置应用内存
UPDATE DATABASE CONFIGURATION USING APPL_MEMORY AUTOMATIC;

# 查看内存配置
GET DATABASE CONFIGURATION;

3.2 实例内存参数

# 配置实例内存
UPDATE DATABASE MANAGER CONFIGURATION USING INSTANCE_MEMORY AUTOMATIC;

# 配置代理内存
UPDATE DATABASE MANAGER CONFIGURATION USING AGENT_STACK_SZ 256;

# 配置共享内存
UPDATE DATABASE MANAGER CONFIGURATION USING SHEAPTHRES_INST 0;

# 配置监控内存
UPDATE DATABASE MANAGER CONFIGURATION USING MON_HEAP_SZ 1024;

# 配置查询堆
UPDATE DATABASE MANAGER CONFIGURATION USING QUERY_HEAP_SZ 32768;

# 查看实例内存配置
GET DATABASE MANAGER CONFIGURATION;

# 查看内存使用情况
SELECT
MEMORY_SET_TYPE,
MEMORY_SET_SIZE,
MEMORY_SET_USED,
MEMORY_SET_FREE
FROM SYSIBMADM.SNAPDB_MEMORY_POOL;

Part04-内存监控

4.1 内存使用监控

# 查看数据库内存使用
SELECT
MEMORY_SET_TYPE,
MEMORY_SET_SIZE / 1024 / 1024 AS SIZE_MB,
MEMORY_SET_USED / 1024 / 1024 AS USED_MB,
MEMORY_SET_FREE / 1024 / 1024 AS FREE_MB,
ROUND(MEMORY_SET_USED * 100.0 / MEMORY_SET_SIZE, 2) AS USAGE_PERCENT
FROM SYSIBMADM.SNAPDB_MEMORY_POOL
WHERE MEMORY_SET_TYPE = ‘DATABASE’;

# 查看缓冲池内存使用
SELECT
BPNAME,
CURRENTSIZE / 1024 / 1024 AS SIZE_MB,
POOL_DATA_LBPAGES,
POOL_INDEX_LBPAGES,
POOL_XDA_LBPAGES
FROM SYSIBMADM.SNAPBP;

# 查看排序堆使用
SELECT
TOTAL_SORTS,
TOTAL_SORT_OVERFLOWS,
POST_THRESHOLD_SORTS,
POST_SHRTHRESHOLD_SORTS
FROM SYSIBMADM.SNAPDB;

# 查看锁列表使用
SELECT
LOCK_LIST_IN_USE,
LOCKS_HELD,
LOCK_WAITS,
LOCK_TIMEOUTS,
DEADLOCKS
FROM SYSIBMADM.SNAPDB;

# 查看包缓存使用
SELECT
PKG_CACHE_LOOKUPS,
PKG_CACHE_INSERTS,
PKG_CACHE_NUM_OVERFLOWS
FROM SYSIBMADM.SNAPDB;

4.2 内存性能分析

# 内存性能基线
SELECT
SNAPSHOT_TIMESTAMP,
MEMORY_SET_TYPE,
MEMORY_SET_SIZE,
MEMORY_SET_USED
FROM SYSIBMADM.SNAPDB_MEMORY_POOL
ORDER BY SNAPSHOT_TIMESTAMP DESC;

# 内存增长趋势
SELECT
DATE(SNAPSHOT_TIMESTAMP) AS SNAP_DATE,
MAX(MEMORY_SET_USED) AS MAX_USED,
MIN(MEMORY_SET_USED) AS MIN_USED,
AVG(MEMORY_SET_USED) AS AVG_USED
FROM SYSIBMADM.SNAPDB_MEMORY_POOL
WHERE MEMORY_SET_TYPE = ‘DATABASE’
GROUP BY DATE(SNAPSHOT_TIMESTAMP)
ORDER BY SNAP_DATE DESC;

# 内存告警
CREATE OR REPLACE PROCEDURE SP_CHECK_MEMORY_USAGE()
LANGUAGE SQL
BEGIN
DECLARE v_usage_percent DECIMAL(5, 2);

SELECT MAX(MEMORY_SET_USED * 100.0 / MEMORY_SET_SIZE)
INTO v_usage_percent
FROM SYSIBMADM.SNAPDB_MEMORY_POOL
WHERE MEMORY_SET_TYPE = ‘DATABASE’;

IF v_usage_percent > 80 THEN
INSERT INTO ALERT_LOG (
ALERT_TIME, ALERT_TYPE, ALERT_MESSAGE
) VALUES (
CURRENT TIMESTAMP, ‘MEMORY’,
‘Database memory usage exceeds 80%: ‘ || CHAR(v_usage_percent) || ‘%’
);
END IF;
END;

# 定期执行监控
CALL SP_CHECK_MEMORY_USAGE();

Part05-风哥经验总结与分享

5.1 内存优化要点

  • 合理配置缓冲池大小
  • 监控缓冲池命中率
  • 配置合适的排序堆
  • 监控内存使用情况
  • 定期调整内存参数
  • 建立内存监控机制

5.2 配置建议

内存组件 建议配置 监控指标
缓冲池 物理内存的50-70% 命中率 > 95%
排序堆 8192-16384 排序溢出率 < 5%
锁列表 4096-8192 锁等待少

5.3 运维要点

  • 定期监控内存使用
  • 监控缓冲池命中率
  • 监控排序溢出
  • 监控锁等待
  • 定期调整内存参数
  • 建立内存性能基线
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
风哥Oracle/MySQL/PostgreSQL/Greenplum/DB2/Redis等数据库培训课程,10年一线实战经验,企业级培训,真正掌握数据库核心技术!

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息