1. 首页 > DB2教程 > 正文

DB2教程FG092-DB2性能基线管理实战

风哥教程参考DB2官方文档Performance、Monitoring等内容,详细介绍性能基线建立、性能监控、性能分析等。更多视频教程www.fgedu.net.cn

目录大纲

Part01-性能基线概述

1.1 性能基线定义

性能基线是在正常负载下系统性能指标的参考值:

  • 响应时间:SQL执行时间、事务响应时间
  • 吞吐量:TPS、QPS
  • 资源使用:CPU、内存、磁盘I/O
  • 并发数:连接数、活跃会话数

1.2 基线作用

  • 性能问题诊断
  • 容量规划参考
  • 优化效果评估
  • SLA制定依据

Part02-基线建立

2.1 基线数据采集

# 创建性能基线表
CREATE TABLE PERFORMANCE_BASELINE (
BASELINE_ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
METRIC_NAME VARCHAR(100) NOT NULL,
METRIC_VALUE DECIMAL(18, 2) NOT NULL,
METRIC_UNIT VARCHAR(50),
COLLECT_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
PERIOD_TYPE VARCHAR(20) NOT NULL,
CONSTRAINT PK_PERFORMANCE_BASELINE PRIMARY KEY (BASELINE_ID)
);

# 采集性能指标存储过程
CREATE OR REPLACE PROCEDURE SP_COLLECT_BASELINE()
LANGUAGE SQL
BEGIN
DECLARE v_metric_value DECIMAL(18, 2);

— 缓冲池命中率
SELECT AVG(DATA_HIT_RATIO_PERCENT) INTO v_metric_value
FROM SYSIBMADM.BP_HITRATIO;

INSERT INTO PERFORMANCE_BASELINE (METRIC_NAME, METRIC_VALUE, METRIC_UNIT, PERIOD_TYPE)
VALUES (‘BUFFERPOOL_HIT_RATIO’, v_metric_value, ‘%’, ‘HOURLY’);

— 排序溢出率
SELECT TOTAL_SORT_OVERFLOWS * 100.0 / NULLIF(TOTAL_SORTS, 0) INTO v_metric_value
FROM SYSIBMADM.SNAPDB;

INSERT INTO PERFORMANCE_BASELINE (METRIC_NAME, METRIC_VALUE, METRIC_UNIT, PERIOD_TYPE)
VALUES (‘SORT_OVERFLOW_RATIO’, v_metric_value, ‘%’, ‘HOURLY’);

— 平均响应时间
SELECT AVG(TOTAL_EXEC_TIME / NULLIF(NUM_EXECUTIONS, 0)) INTO v_metric_value
FROM SYSIBMADM.TOP_DYNAMIC_SQL;

INSERT INTO PERFORMANCE_BASELINE (METRIC_NAME, METRIC_VALUE, METRIC_UNIT, PERIOD_TYPE)
VALUES (‘AVG_RESPONSE_TIME’, v_metric_value, ‘MS’, ‘HOURLY’);

— 连接数
SELECT COUNT(*) INTO v_metric_value
FROM SYSIBMADM.APPLICATIONS;

INSERT INTO PERFORMANCE_BASELINE (METRIC_NAME, METRIC_VALUE, METRIC_UNIT, PERIOD_TYPE)
VALUES (‘CONNECTION_COUNT’, v_metric_value, ‘COUNT’, ‘HOURLY’);
END;

2.2 基线计算

# 计算基线统计值
SELECT
METRIC_NAME,
AVG(METRIC_VALUE) AS AVG_VALUE,
MIN(METRIC_VALUE) AS MIN_VALUE,
MAX(METRIC_VALUE) AS MAX_VALUE,
STDDEV(METRIC_VALUE) AS STDDEV_VALUE
FROM PERFORMANCE_BASELINE
WHERE COLLECT_TIME >= CURRENT DATE – 30 DAYS
GROUP BY METRIC_NAME;

# 创建基线统计表
CREATE TABLE BASELINE_STATISTICS (
STAT_ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
METRIC_NAME VARCHAR(100) NOT NULL,
AVG_VALUE DECIMAL(18, 2) NOT NULL,
MIN_VALUE DECIMAL(18, 2) NOT NULL,
MAX_VALUE DECIMAL(18, 2) NOT NULL,
STDDEV_VALUE DECIMAL(18, 2) NOT NULL,
CALCULATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_BASELINE_STATISTICS PRIMARY KEY (STAT_ID)
);

# 计算并保存基线统计
INSERT INTO BASELINE_STATISTICS (METRIC_NAME, AVG_VALUE, MIN_VALUE, MAX_VALUE, STDDEV_VALUE)
SELECT
METRIC_NAME,
AVG(METRIC_VALUE),
MIN(METRIC_VALUE),
MAX(METRIC_VALUE),
STDDEV(METRIC_VALUE)
FROM PERFORMANCE_BASELINE
WHERE COLLECT_TIME >= CURRENT DATE – 30 DAYS
GROUP BY METRIC_NAME;

Part03-性能监控

3.1 实时监控

# 性能监控脚本
#!/bin/bash
# performance_monitor.sh

DBNAME=FGEDB
LOG_FILE=/db2/logs/performance_$(date +%Y%m%d).log

while true; do
echo “=== $(date) ===” >> $LOG_FILE

# 1. 缓冲池命中率
db2 connect to $DBNAME
db2 “SELECT bpname, data_hit_ratio_percent FROM sysibmadm.bp_hitratio” >> $LOG_FILE

# 2. 慢查询
db2 “SELECT substr(stmt_text,1,100), total_exec_time
FROM sysibmadm.top_dynamic_sql
ORDER BY total_exec_time DESC FETCH FIRST 10 ROWS ONLY” >> $LOG_FILE

# 3. 锁等待
db2 “SELECT COUNT(*) FROM sysibmadm.lockwaits” >> $LOG_FILE

# 4. 连接数
db2 “SELECT COUNT(*) FROM sysibmadm.applications” >> $LOG_FILE

# 5. 表空间使用
db2 “SELECT tbsp_name, round(tbsp_used_pages*100.0/tbsp_total_pages,2)
FROM sysibmadm.tbsp_utilization” >> $LOG_FILE

db2 connect reset

sleep 300
done

3.2 告警机制

# 性能告警存储过程
CREATE OR REPLACE PROCEDURE SP_CHECK_PERFORMANCE_ALERT()
LANGUAGE SQL
BEGIN
DECLARE v_bufferpool_hit DECIMAL(5, 2);
DECLARE v_sort_overflow DECIMAL(5, 2);
DECLARE v_connection_count INTEGER;
DECLARE v_tablespace_usage DECIMAL(5, 2);

— 检查缓冲池命中率
SELECT AVG(DATA_HIT_RATIO_PERCENT) INTO v_bufferpool_hit
FROM SYSIBMADM.BP_HITRATIO;

IF v_bufferpool_hit < 95 THEN INSERT INTO PERFORMANCE_ALERTS (ALERT_TIME, ALERT_TYPE, ALERT_MESSAGE) VALUES (CURRENT TIMESTAMP, 'BUFFERPOOL', 'Bufferpool hit ratio is below 95%: ' || v_bufferpool_hit || '%'); END IF; -- 检查排序溢出率 SELECT TOTAL_SORT_OVERFLOWS * 100.0 / NULLIF(TOTAL_SORTS, 0) INTO v_sort_overflow FROM SYSIBMADM.SNAPDB; IF v_sort_overflow > 5 THEN
INSERT INTO PERFORMANCE_ALERTS (ALERT_TIME, ALERT_TYPE, ALERT_MESSAGE)
VALUES (CURRENT TIMESTAMP, ‘SORT’,
‘Sort overflow ratio is above 5%: ‘ || v_sort_overflow || ‘%’);
END IF;

— 检查连接数
SELECT COUNT(*) INTO v_connection_count
FROM SYSIBMADM.APPLICATIONS;

IF v_connection_count > 500 THEN
INSERT INTO PERFORMANCE_ALERTS (ALERT_TIME, ALERT_TYPE, ALERT_MESSAGE)
VALUES (CURRENT TIMESTAMP, ‘CONNECTION’,
‘Connection count is above 500: ‘ || v_connection_count);
END IF;

— 检查表空间使用率
SELECT MAX(TBSP_USED_PAGES * 100.0 / TBSP_TOTAL_PAGES) INTO v_tablespace_usage
FROM SYSIBMADM.TBSP_UTILIZATION;

IF v_tablespace_usage > 85 THEN
INSERT INTO PERFORMANCE_ALERTS (ALERT_TIME, ALERT_TYPE, ALERT_MESSAGE)
VALUES (CURRENT TIMESTAMP, ‘TABLESPACE’,
‘Tablespace usage is above 85%: ‘ || v_tablespace_usage || ‘%’);
END IF;
END;

Part04-性能分析

4.1 性能对比分析

# 对比当前性能与基线
SELECT
CURRENT.METRIC_NAME,
CURRENT.METRIC_VALUE AS CURRENT_VALUE,
BASELINE.AVG_VALUE AS BASELINE_AVG,
BASELINE.MIN_VALUE AS BASELINE_MIN,
BASELINE.MAX_VALUE AS BASELINE_MAX,
(CURRENT.METRIC_VALUE – BASELINE.AVG_VALUE) / BASELINE.AVG_VALUE * 100 AS DEVIATION_PERCENT
FROM (
SELECT METRIC_NAME, METRIC_VALUE
FROM PERFORMANCE_BASELINE
WHERE COLLECT_TIME >= CURRENT TIMESTAMP – 1 HOUR
) CURRENT
JOIN BASELINE_STATISTICS BASELINE ON CURRENT.METRIC_NAME = BASELINE.METRIC_NAME
WHERE ABS((CURRENT.METRIC_VALUE – BASELINE.AVG_VALUE) / BASELINE.AVG_VALUE * 100) > 20;

# 性能趋势分析
SELECT
METRIC_NAME,
DATE(COLLECT_TIME) AS COLLECT_DATE,
AVG(METRIC_VALUE) AS DAILY_AVG
FROM PERFORMANCE_BASELINE
WHERE COLLECT_TIME >= CURRENT DATE – 30 DAYS
GROUP BY METRIC_NAME, DATE(COLLECT_TIME)
ORDER BY METRIC_NAME, COLLECT_DATE;

4.2 性能报告生成

# 性能报告生成脚本
#!/bin/bash
# generate_performance_report.sh

DBNAME=FGEDB
REPORT_DATE=$(date +%Y%m%d)
REPORT_FILE=/db2/reports/performance_report_$REPORT_DATE.txt

echo “=== DB2 Performance Report ===” > $REPORT_FILE
echo “Date: $(date)” >> $REPORT_FILE
echo “” >> $REPORT_FILE

db2 connect to $DBNAME

echo “1. Bufferpool Hit Ratio” >> $REPORT_FILE
db2 “SELECT bpname, data_hit_ratio_percent FROM sysibmadm.bp_hitratio” >> $REPORT_FILE
echo “” >> $REPORT_FILE

echo “2. Top 10 Slow Queries” >> $REPORT_FILE
db2 “SELECT substr(stmt_text,1,100), total_exec_time
FROM sysibmadm.top_dynamic_sql
ORDER BY total_exec_time DESC FETCH FIRST 10 ROWS ONLY” >> $REPORT_FILE
echo “” >> $REPORT_FILE

echo “3. Lock Waits” >> $REPORT_FILE
db2 “SELECT COUNT(*) FROM sysibmadm.lockwaits” >> $REPORT_FILE
echo “” >> $REPORT_FILE

echo “4. Connection Count” >> $REPORT_FILE
db2 “SELECT COUNT(*) FROM sysibmadm.applications” >> $REPORT_FILE
echo “” >> $REPORT_FILE

echo “5. Tablespace Usage” >> $REPORT_FILE
db2 “SELECT tbsp_name, round(tbsp_used_pages*100.0/tbsp_total_pages,2)
FROM sysibmadm.tbsp_utilization” >> $REPORT_FILE
echo “” >> $REPORT_FILE

echo “6. Performance Alerts” >> $REPORT_FILE
db2 “SELECT * FROM performance_alerts
WHERE alert_time >= CURRENT DATE – 1 DAY” >> $REPORT_FILE

db2 connect reset

echo “Performance report generated: $REPORT_FILE”

Part05-风哥经验总结与分享

5.1 性能基线管理要点

  • 建立全面的性能基线
  • 定期采集性能数据
  • 实时监控性能指标
  • 及时告警异常情况
  • 定期分析性能趋势
  • 持续优化性能基线

5.2 基线指标建议

指标 基线值 告警阈值
缓冲池命中率 >95% <90%
排序溢出率 <5% >10%
平均响应时间 <100ms >200ms

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,节假日休息