Skip to content

DB2 数据库指标

概述

DB2数据库指标是衡量数据库性能、状态和资源使用情况的重要依据。通过监控这些指标,DBA可以及时发现数据库问题,优化系统性能,确保数据库的稳定运行。本文将详细介绍DB2数据库的关键指标、监控方法和优化策略。

指标分类

1. 缓冲池指标

缓冲池是DB2数据库的核心组件,用于缓存数据页和索引页,减少磁盘I/O。缓冲池指标直接影响数据库的查询性能。

缓冲池命中率

  • 定义:缓冲池命中次数占总访问次数的百分比
  • 计算公式(1 - (物理读取次数 / (逻辑读取次数 + 物理读取次数))) * 100%
  • 目标值:> 95%
  • 监控方法
    sql
    SELECT BP_NAME, 
           100.0 * (1 - (POOL_READS / (POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_READS))) AS HIT_RATIO
    FROM SYSIBMADM.SNAPBUF;

缓冲池写命中率

  • 定义:缓冲池写命中次数占总写次数的百分比
  • 计算公式(1 - (物理写入次数 / (逻辑写入次数 + 物理写入次数))) * 100%
  • 目标值:> 90%
  • 监控方法
    sql
    SELECT BP_NAME, 
           100.0 * (1 - (POOL_WRITES / (POOL_DATA_L_WRITES + POOL_INDEX_L_WRITES + POOL_WRITES))) AS WRITE_HIT_RATIO
    FROM SYSIBMADM.SNAPBUF;

缓冲池页使用率

  • 定义:缓冲池中已使用页占总页数的百分比
  • 计算公式(已使用页数 / 总页数) * 100%
  • 目标值:70%-80%
  • 监控方法
    sql
    SELECT BP_NAME, 
           (POOL_DATA_PAGES + POOL_INDEX_PAGES + POOL_TEMP_PAGES) AS USED_PAGES,
           POOL_PAGES AS TOTAL_PAGES,
           100.0 * (POOL_DATA_PAGES + POOL_INDEX_PAGES + POOL_TEMP_PAGES) / POOL_PAGES AS USAGE_PERCENT
    FROM SYSIBMADM.SNAPBUF;

2. 锁指标

锁指标用于监控数据库的并发控制情况,直接影响数据库的并发性能。

锁等待次数

  • 定义:单位时间内发生锁等待的次数
  • 目标值:< 10次/分钟
  • 监控方法
    sql
    SELECT DB_NAME, LOCK_WAITS, DEADLOCKS
    FROM SYSIBMADM.SNAPDB;

锁等待时间

  • 定义:锁等待的平均时间
  • 计算公式总锁等待时间 / 锁等待次数
  • 目标值:< 100ms
  • 监控方法
    sql
    SELECT APPL_ID, LOCK_OBJECT_TYPE, LOCK_MODE, LOCK_WAIT_TIME
    FROM SYSIBMADM.SNAPLOCK WHERE LOCK_WAIT_TIME > 0;

死锁次数

  • 定义:单位时间内发生死锁的次数
  • 目标值:0
  • 监控方法
    sql
    SELECT DB_NAME, DEADLOCKS
    FROM SYSIBMADM.SNAPDB;

3. I/O 指标

I/O指标用于监控数据库的磁盘读写性能,直接影响数据库的整体性能。

物理读取次数

  • 定义:单位时间内从磁盘读取数据的次数
  • 目标值:根据系统配置评估
  • 监控方法
    sql
    SELECT TBSP_NAME, PHYSICAL_READS, PHYSICAL_WRITES
    FROM SYSIBMADM.SNAPTBSP;

物理写入次数

  • 定义:单位时间内写入磁盘的数据次数
  • 目标值:根据系统配置评估
  • 监控方法
    sql
    SELECT TBSP_NAME, PHYSICAL_WRITES
    FROM SYSIBMADM.SNAPTBSP;

平均读取时间

  • 定义:每次物理读取的平均时间
  • 计算公式总物理读取时间 / 物理读取次数
  • 目标值:< 10ms
  • 监控方法
    sql
    SELECT TBSP_NAME, 
           PHYSICAL_READ_TIME / PHYSICAL_READS AS AVG_READ_TIME
    FROM SYSIBMADM.SNAPTBSP WHERE PHYSICAL_READS > 0;

平均写入时间

  • 定义:每次物理写入的平均时间
  • 计算公式总物理写入时间 / 物理写入次数
  • 目标值:< 10ms
  • 监控方法
    sql
    SELECT TBSP_NAME, 
           PHYSICAL_WRITE_TIME / PHYSICAL_WRITES AS AVG_WRITE_TIME
    FROM SYSIBMADM.SNAPTBSP WHERE PHYSICAL_WRITES > 0;

4. SQL 指标

SQL指标用于监控数据库的查询性能,直接影响应用程序的响应时间。

SQL执行时间

  • 定义:SQL语句的平均执行时间
  • 目标值:根据业务需求评估
  • 监控方法
    sql
    SELECT SUBSTR(STMT_TEXT, 1, 100) AS SQL_TEXT, 
           EXECUTION_TIME, CPU_TIME, 
           BUFFERPOOL_DATA_PHYSICAL_READS, BUFFERPOOL_INDEX_PHYSICAL_READS
    FROM SYSIBMADM.TOP_DYNAMIC_SQL
    ORDER BY EXECUTION_TIME DESC FETCH FIRST 10 ROWS ONLY;

SQL吞吐量

  • 定义:单位时间内执行的SQL语句数量
  • 目标值:根据系统配置评估
  • 监控方法
    sql
    SELECT DB_NAME, SQL_STMTS_COMPLETED, SQL_STMTS_STARTED
    FROM SYSIBMADM.SNAPDB;

命中率指标

  • 定义:SQL语句使用索引的比例
  • 计算公式使用索引的SQL语句数量 / 总SQL语句数量 * 100%
  • 目标值:> 90%
  • 监控方法
    sql
    SELECT SUBSTR(STMT_TEXT, 1, 100) AS SQL_TEXT, 
           INDEX_SCANS, TABLE_SCANS
    FROM SYSIBMADM.TOP_DYNAMIC_SQL;

5. 连接指标

连接指标用于监控数据库的连接情况,直接影响数据库的并发处理能力。

活动连接数

  • 定义:当前活跃的数据库连接数量
  • 目标值:根据系统配置评估,一般为CPU核心数的1-2倍
  • 监控方法
    sql
    SELECT DB_NAME, ACTIVE_CONNECTIONS, TOTAL_CONNECTIONS
    FROM SYSIBMADM.SNAPDB;

连接请求队列长度

  • 定义:等待连接到数据库的请求数量
  • 目标值:< 5
  • 监控方法
    sql
    SELECT DB_NAME, CONNECTIONS_WAITING
    FROM SYSIBMADM.SNAPDB;

6. 内存指标

内存指标用于监控数据库的内存使用情况,直接影响数据库的性能和稳定性。

数据库内存使用率

  • 定义:数据库使用的内存占总内存的百分比
  • 计算公式数据库使用的内存 / 系统总内存 * 100%
  • 目标值:60%-80%
  • 监控方法
    sql
    SELECT INSTANCE_NAME, TOTAL_MEMORY_USED, TOTAL_MEMORY_AVAILABLE
    FROM SYSIBMADM.INST_MEMORY_INFO;

代理内存使用率

  • 定义:代理进程使用的内存占总内存的百分比
  • 计算公式代理进程使用的内存 / 系统总内存 * 100%
  • 目标值:< 20%
  • 监控方法
    sql
    SELECT AGENT_ID, APPL_NAME, MEMORY_USAGE
    FROM SYSIBMADM.SNAPAPPL_MEMORY;

版本差异

版本指标特点
DB2 9.7支持基本的性能指标监控,提供快照命令和监控表
DB2 10.1增强了内存指标监控,引入更多内存相关的监控表
DB2 10.5改进了I/O指标监控,支持更详细的I/O统计信息
DB2 11.1增强了SQL指标监控,引入TOP_DYNAMIC_SQL视图
DB2 11.5引入了更多实时性能指标,支持更精细的性能监控

生产实践

1. 指标监控脚本

关键指标监控脚本

bash
#!/bin/bash
# DB2 关键指标监控脚本

db_name="sample"
output_file="key_metrics_$(date +%Y%m%d_%H%M%S).log"

# 输出监控头
echo "DB2 关键指标监控报告" > $output_file
echo "生成时间: $(date)" >> $output_file
echo "数据库: $db_name" >> $output_file
echo "========================================" >> $output_file

db2 connect to $db_name > /dev/null

# 1. 缓冲池指标
echo "1. 缓冲池指标:" >> $output_file
db2 -x "SELECT BP_NAME, 
       100.0 * (1 - (POOL_READS / (POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_READS))) AS HIT_RATIO, 
       (POOL_DATA_PAGES + POOL_INDEX_PAGES + POOL_TEMP_PAGES) / POOL_PAGES * 100 AS USAGE_PERCENT 
       FROM SYSIBMADM.SNAPBUF" >> $output_file
echo "========================================" >> $output_file

# 2. 锁指标
echo "2. 锁指标:" >> $output_file
db2 -x "SELECT DB_NAME, LOCK_WAITS, DEADLOCKS FROM SYSIBMADM.SNAPDB" >> $output_file
echo "   锁等待详情:" >> $output_file
db2 -x "SELECT APPL_ID, LOCK_OBJECT_TYPE, LOCK_MODE, LOCK_WAIT_TIME FROM SYSIBMADM.SNAPLOCK WHERE LOCK_WAIT_TIME > 0 FETCH FIRST 5 ROWS ONLY" >> $output_file
echo "========================================" >> $output_file

# 3. I/O指标
echo "3. I/O指标:" >> $output_file
db2 -x "SELECT TBSP_NAME, PHYSICAL_READS, PHYSICAL_WRITES, 
       CASE WHEN PHYSICAL_READS > 0 THEN PHYSICAL_READ_TIME / PHYSICAL_READS ELSE 0 END AS AVG_READ_TIME, 
       CASE WHEN PHYSICAL_WRITES > 0 THEN PHYSICAL_WRITE_TIME / PHYSICAL_WRITES ELSE 0 END AS AVG_WRITE_TIME 
       FROM SYSIBMADM.SNAPTBSP" >> $output_file
echo "========================================" >> $output_file

# 4. SQL指标
echo "4. SQL指标:" >> $output_file
db2 -x "SELECT SUBSTR(STMT_TEXT, 1, 100) AS SQL_TEXT, EXECUTION_TIME, CPU_TIME, BUFFERPOOL_DATA_PHYSICAL_READS, 
       BUFFERPOOL_INDEX_PHYSICAL_READS 
       FROM SYSIBMADM.TOP_DYNAMIC_SQL 
       ORDER BY EXECUTION_TIME DESC FETCH FIRST 5 ROWS ONLY" >> $output_file
echo "========================================" >> $output_file

# 5. 连接指标
echo "5. 连接指标:" >> $output_file
db2 -x "SELECT DB_NAME, ACTIVE_CONNECTIONS, TOTAL_CONNECTIONS FROM SYSIBMADM.SNAPDB" >> $output_file
echo "========================================" >> $output_file

db2 connect reset > /dev/null
echo "监控完成,结果保存到 $output_file" >> $output_file

性能趋势监控脚本

bash
#!/bin/bash
# DB2 性能趋势监控脚本

db_name="sample"
metrics_file="metrics_history.csv"

# 初始化文件(如果不存在)
if [ ! -f $metrics_file ]; then
    echo "时间戳,数据库,缓冲池命中率,锁等待次数,死锁次数,物理读取次数,物理写入次数,活动连接数" > $metrics_file
fi

db2 connect to $db_name > /dev/null

# 获取当前时间
timestamp=$(date +"%Y-%m-%d %H:%M:%S")

# 获取指标
bufferpool_hit_ratio=$(db2 -x "SELECT ROUND(100.0 * (1 - (POOL_READS / (POOL_DATA_L_READS + POOL_INDEX_L_READS + POOL_READS))), 2) 
       FROM SYSIBMADM.SNAPBUF WHERE BP_NAME = 'IBMDEFAULTBP'")

lock_waits=$(db2 -x "SELECT LOCK_WAITS FROM SYSIBMADM.SNAPDB")
deadlocks=$(db2 -x "SELECT DEADLOCKS FROM SYSIBMADM.SNAPDB")
physical_reads=$(db2 -x "SELECT SUM(PHYSICAL_READS) FROM SYSIBMADM.SNAPTBSP")
physical_writes=$(db2 -x "SELECT SUM(PHYSICAL_WRITES) FROM SYSIBMADM.SNAPTBSP")
active_connections=$(db2 -x "SELECT ACTIVE_CONNECTIONS FROM SYSIBMADM.SNAPDB")

# 写入文件
echo "$timestamp,$db_name,$bufferpool_hit_ratio,$lock_waits,$deadlocks,$physical_reads,$physical_writes,$active_connections" >> $metrics_file

db2 connect reset > /dev/null
echo "性能指标已记录到 $metrics_file"

2. 指标优化策略

缓冲池指标优化

  • 缓冲池命中率低

    • 增加缓冲池大小
    • 优化SQL语句,减少全表扫描
    • 增加索引覆盖,减少物理读取
    • 考虑使用多个缓冲池,分离不同类型的数据
  • 缓冲池页使用率高

    • 增加缓冲池大小
    • 优化SQL语句,减少临时表空间使用
    • 调整缓冲池页大小

锁指标优化

  • 锁等待次数多

    • 优化应用程序逻辑,减少锁持有时间
    • 调整事务隔离级别
    • 增加锁超时参数
    • 使用行级锁替代表级锁
  • 死锁次数多

    • 优化应用程序逻辑,避免循环锁
    • 统一事务访问顺序
    • 增加死锁检测间隔
    • 使用事件监控,分析死锁原因

I/O 指标优化

  • 物理读取次数多

    • 增加缓冲池大小
    • 优化SQL语句,减少全表扫描
    • 增加索引覆盖,减少物理读取
    • 优化存储系统,提高I/O性能
  • 平均读取时间长

    • 优化存储系统,提高I/O性能
    • 调整存储配置,如RAID级别
    • 考虑使用SSD存储
    • 优化表空间布局,分离热点数据

SQL 指标优化

  • SQL执行时间长

    • 优化SQL语句,减少复杂度
    • 增加适当的索引
    • 收集统计信息,优化查询计划
    • 考虑使用物化查询表
  • 索引命中率低

    • 优化SQL语句,增加索引覆盖
    • 重新设计索引策略
    • 收集统计信息,优化查询计划

连接指标优化

  • 活动连接数多

    • 启用连接池,减少连接创建开销
    • 优化应用程序,减少长连接
    • 调整MAXAPPLS参数
    • 考虑使用读写分离
  • 连接请求队列长度长

    • 增加数据库实例资源
    • 优化应用程序,减少连接请求
    • 考虑使用负载均衡

3. 指标监控最佳实践

建立性能基线

  • 收集正常运行时的指标数据,建立性能基线
  • 定期分析指标趋势,预测系统瓶颈
  • 对比不同时期的指标数据,评估优化效果

设置合理的阈值

  • 根据性能基线和业务需求,设置合理的指标阈值
  • 当指标超过阈值时,及时发出告警
  • 定期调整阈值,适应系统变化

综合分析指标

  • 单一指标不能完全反映系统性能,需要综合分析多个指标
  • 例如:缓冲池命中率低可能是由于锁等待导致的,而不是缓冲池大小不足
  • 结合应用程序日志和数据库日志,全面分析问题

定期生成报告

  • 定期生成性能报告,分析系统性能趋势
  • 向管理层汇报数据库性能状况
  • 记录优化措施和效果,形成知识库

常见问题(FAQ)

Q1: 如何确定指标的合理阈值?

A1: 确定指标的合理阈值需要考虑以下因素:

  • 系统硬件配置
  • 数据库版本和特性
  • 应用程序类型和负载
  • 业务需求和性能目标

建议先收集一段时间的正常运行数据,建立性能基线,然后根据基线和业务需求设置合理的阈值。

Q2: 监控指标的频率应该是多少?

A2: 监控指标的频率取决于系统的重要性和性能需求:

  • 对于关键业务系统,建议每5-15分钟监控一次
  • 对于一般业务系统,建议每30-60分钟监控一次
  • 对于非关键系统,建议每2-4小时监控一次

对于实时性要求高的指标,如死锁次数,可以适当提高监控频率。

Q3: 如何处理指标异常情况?

A3: 处理指标异常情况的步骤:

  1. 确认异常:检查监控数据,确认指标是否真的异常
  2. 分析原因:结合多个指标和日志,分析异常的根本原因
  3. 采取措施:根据分析结果,采取相应的优化措施
  4. 验证效果:监控指标变化,验证优化措施的效果
  5. 记录总结:记录异常情况、分析过程和优化措施,形成知识库

Q4: 哪些指标对DB2性能影响最大?

A4: 对DB2性能影响最大的指标包括:

  • 缓冲池命中率:直接影响数据库的查询性能
  • 锁等待时间:直接影响数据库的并发性能
  • 物理I/O:直接影响数据库的整体性能
  • SQL执行时间:直接影响应用程序的响应时间
  • 死锁次数:直接影响数据库的稳定性

Q5: 如何使用指标进行容量规划?

A5: 使用指标进行容量规划的步骤:

  1. 收集历史指标数据,分析增长趋势
  2. 预测未来的资源需求,如CPU、内存、存储等
  3. 考虑业务增长和新应用上线的影响
  4. 制定容量扩展计划,包括硬件升级和数据库优化
  5. 定期评估容量规划的准确性,调整规划策略

Q6: DB2 11.5版本在指标监控方面有哪些改进?

A6: DB2 11.5版本在指标监控方面的改进包括:

  • 引入了更多实时性能指标,如SQL执行计划稳定性
  • 增强了内存指标监控,支持更详细的内存使用分析
  • 改进了I/O指标监控,支持更精细的I/O统计
  • 增强了事件监控功能,支持更多事件类型
  • 提供了更好的集成监控工具,如IBM Data Server Manager

总结

DB2数据库指标是衡量数据库性能、状态和资源使用情况的重要依据。通过监控和分析这些指标,DBA可以及时发现数据库问题,优化系统性能,确保数据库的稳定运行。

建议DBA建立完善的指标监控体系,包括实时监控、历史趋势分析和告警机制。同时,要结合应用程序和系统环境,综合分析指标数据,采取针对性的优化措施。

定期生成性能报告,向管理层汇报数据库性能状况,为数据库的长期规划和优化提供依据。通过持续的监控和优化,确保DB2数据库始终处于最佳运行状态,满足业务需求。