opengauss教程FG071-openGauss性能监控与瓶颈定位生产实战解析
目录大纲
- Part01-基础概念与理论知识
- 1.1 性能监控的基本概念
- 1.2 性能瓶颈的类型
- 1.3 openGauss性能监控工具
- Part02-生产环境规划与建议
- 2.1 性能监控体系设计
- 2.2 性能基准与告警阈值
- Part03-生产环境项目实施方案
- 3.1 系统级监控配置
- 3.2 数据库级监控配置
- Part04-生产案例与实战讲解
- 4.1 系统资源监控实战
- 4.2 数据库性能监控实战
- 4.3 瓶颈定位与分析
- 4.4 性能监控自动化脚本
- Part05-风哥经验总结与分享
- 5.1 性能监控经验
- 5.2 瓶颈定位技巧
Part01-基础概念与理论知识
1.1 性能监控的基本概念
性能监控是数据库管理的重要组成部分,通过持续收集和分析系统指标,及时发现并解决性能问题。
1. 监控对象:系统资源、数据库实例、SQL语句、事务等
2. 监控指标:响应时间、吞吐量、资源利用率等
3. 监控频率:实时监控、定期检查、按需分析
4. 告警机制:阈值设置、通知方式、处理流程
1.2 性能瓶颈的类型
openGauss数据库常见的性能瓶颈类型:
1. CPU瓶颈:CPU使用率高,处理能力不足
2. 内存瓶颈:内存不足,频繁换页
3. IO瓶颈:磁盘读写速度慢,IO等待高
风哥提示:
4. 网络瓶颈:网络延迟高,带宽不足
5. 数据库瓶颈:锁竞争、死锁、慢SQL等
6. 应用瓶颈:应用逻辑不合理,连接管理不当
1.3 openGauss性能监控工具
openGauss提供多种性能监控工具:
SELECT viewname
FROM pg_views
WHERE viewname LIKE ‘pg_stat%’ OR viewname LIKE ‘pg_statistics%’
ORDER BY viewname;
————————-
pg_stat_activity
pg_stat_all_indexes
pg_stat_all_tables
pg_stat_archiver
pg_stat_bgwriter
pg_stat_database
pg_stat_database_conflicts
pg_stat_gssapi
pg_stat_replication
pg_stat_ssl
pg_stat_statements学习交流加群风哥微信: itpux-com
pg_stat_subscription
pg_stat_sys_indexes
pg_stat_sys_tables
pg_stat_user_indexes
pg_stat_user_tables
pg_stat_xact_all_tables
pg_stat_xact_sys_tables
pg_stat_xact_user_tables
(19 rows)
Part02-生产环境规划与建议
2.1 性能监控体系设计
建立完善的性能监控体系:
1. 数据采集层:收集系统和数据库指标
2. 数据存储层:存储历史监控数据
3. 数据分析层:分析性能趋势和异常
4. 告警通知层:及时通知性能问题
5. 可视化展示层:直观展示性能状态
2.2 性能基准与告警阈值
设置合理的性能基准和告警阈值:
1. CPU使用率:告警阈值80%,严重告警90%
2. 内存使用率:告警阈值85%,严重告警95%
3. 磁盘使用率:告警阈值75%,严重告警90%
4. IO等待:告警阈值20%,严重告警40%
5. 数据库连接数:告警阈值80%,严重告警90%
6. 慢SQL:执行时间超过1秒的SQL
Part03-生产环境项目实施方案
学习交流加群风哥QQ113257174
3.1 系统级监控配置
配置系统级监控工具:
# systemctl enable sysstat
# systemctl start sysstat
HISTORY=7
INTERVAL=10
COMPRESSAFTER=1
3.2 数据库级监控配置
配置openGauss数据库监控参数:
— 启用pg_stat_statements扩展
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
更多视频教程www.fgedu.net.cn
ALTER SYSTEM SET shared_preload_libraries = ‘pg_stat_statements’;
ALTER SYSTEM SET pg_stat_statements.track = ‘all’;
ALTER SYSTEM SET pg_stat_statements.max = 10000;
ALTER SYSTEM SET pg_stat_statements.track_utility = true;
ALTER SYSTEM SET log_min_duration_statement = 1000;
ALTER SYSTEM SET log_statement = ‘mod’;
— 重新加载配置
SELECT pg_reload_conf();
—————-
t
(1 row)
Part04-生产案例与实战讲解
4.1 系统资源监控实战
实战演示系统资源监控:
Tasks: 285 total, 1 running, 284 sleeping, 0 stopped, 0 zombie
%Cpu(s): 15.2 us, 5.8 sy, 0.0 ni, 76.5 id, 2.0 wa, 0.0 hi, 0.5 si, 0.0 st
KiB Mem : 32768000 total, 5120000 free, 22528000 used, 5120000 buff/cache
KiB Swap: 8388608 total, 8388608 free, 0 used. 8192000 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12345 omm 20 0 20.5g 5.2g 4.8g S 45.0 16.5 12:30.45 gaussdb
6789 root 20 0 120m 20m 15m S 5.0 0.1 0:30.12 sshd
1234 root 20 0 500m 50m 40m S 2.5 0.2 1:15.34 httpd
# iostat -x 1 3
avg-cpu: %user %nice %system %iowait %steal %idle
15.00 0.00 5.00 2.00 0.00 78.00
device r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 5.00 3.00 0.10 0.05 32.00 0.10 8.00 5.00 12.00 2.00 1.60
sdb 10.00 5.00 0.20 0.10 32.00 0.20 10.00 6.00 16.00 3.00 4.50
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 5120000 102400 409600 0 0 10 5 100 50 15 5 78 2 0
0 0 0 5119800 102400 409600 0 0 0 0 102 48 14 6 79 1 0
0 0 0 5119600 102400 409600 0 0 0 0 105 52 16 4 79 1 0
4.2 数据库性能监控实战
from DB视频:www.itpux.com
实战演示数据库性能监控:
— 监控数据库连接
SELECT
count(*) AS total_connections,
state,
application_name,
usename,
client_addr
FROM pg_stat_activity
GROUP BY state, application_name, usename, client_addr
ORDER BY total_connections DESC;
——————-+———————+——————+———-+————–
15 | active | app_server | fgedu01 | 192.168.1.20
10 | idle | psql | fgedu | 192.168.1.10
5 | idle in transaction | batch_job | fgedu02 | 192.168.1.21
(3 rows)
SELECT
pid,
usename,
application_name,
client_addr,
state,
now() – query_start AS duration,
query
FROM pg_stat_activity
WHERE state = ‘active’
ORDER BY duration DESC
LIMIT 10;
——-+———+——————+————-+——–+———-+——-
15234 | fgedu01 | app_server | 192.168.1.20 | active | 00:02:30 | SELECT * FROM fgedu_orders WHERE customer_id = 10001;
15289 | fgedu02 | batch_job | 192.168.1.21 | active | 00:01:15 | INSERT INTO fgedu_sales (order_id, amount) SELECT order_id, total_amount FROM fgedu_order_details WHERE create_date = current_date;
(2 rows)
SELECT
relname AS table_name,
n_live_tup AS live_rows,
n_dead_tup AS dead_rows,
last_vacuum,
last_analyze
FROM pg_stat_user_tables
WHERE n_live_tup > 0
ORDER BY n_dead_tup DESC
LIMIT 10;
—————-+———–+———–+—————————-+—————————–
fgedu_orders | 100000 | 25000 | 2024-01-14 23:00:00.000000 | 2024-01-14 23:00:00.000000
fgedu_inventory | 50000 | 10000 | 2024-01-14 22:00:00.000000 | 2024-01-14 22:00:00.000000
fgedu_sales | 200000 | 5000 | 2024-01-14 21:00:00.000000 | 2024-01-14 21:00:00.000000
(3 rows)
4.3 瓶颈定位与分析
实战演示性能瓶颈定位:
SELECT
queryid,
query,
calls,
total_exec_time / 1000 AS total_exec_time_sec,
mean_exec_time / 1000 AS mean_exec_time_sec,
rows,
shared_blks_hit,
shared_blks_read
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
—————+——————————————–+——-+———————+———————+——+—————–+——————
1234567890123 | SELECT * FROM fgedu_orders WHERE customer_id = $1 | 1000 | 125.5000 | 0.1255 | 1000 | 5000 | 2000
9876543210987 | INSERT INTO fgedu_sales (order_id, amount) SELECT order_id, total_amount FROM fgedu_order_details WHERE create_date = current_date | 10 | 60.2000 | 6.0200 | 5000 | 10000 | 5000
(2 rows)
SELECT
w.pid AS waiting_pid,
w.usename AS waiting_user,
w.query AS waiting_query,
b.pid AS blocking_pid,
b.usename AS blocking_user,
b.query AS blocking_query,
now() – w.query_start AS waiting_duration
FROM pg_stat_activity w
JOIN pg_locks l ON w.pid = l.pid
JOIN pg_locks l2 ON l.locktype = l2.locktype
AND l.relation = l2.relation
AND l.pid != l2.pid
JOIN pg_stat_activity b ON l2.pid = b.pid
WHERE w.waiting = true
AND l.granted = false
AND l2.granted = true
ORDER BY waiting_duration DESC;
————-+————–+—————+————–+—————+—————-+——————
15234 | fgedu01 | SELECT * FROM fgedu_orders WHERE customer_id = 10001; | 15289 | fgedu02 | INSERT INTO fgedu_sales (order_id, amount) SELECT order_id, total_amount FROM fgedu_order_details WHERE create_date = current_date;
| 00:01:30
(1 row)
SELECT
datname,
blks_read,
blks_hit,
blks_read / (blks_read + blks_hit)::float AS read_ratio
FROM pg_stat_database
WHERE datname = ‘fgedudb’;
———-+———–+———-+————————
fgedudb | 10000 | 90000 | 0.10000000000000000000
(1 row)
4.4 性能监控自动化脚本
编写性能监控自动化脚本:
# performance_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# openGauss性能监控脚本
DB_IP=”192.168.1.10″
DB_PORT=”5432″
DB_NAME=”fgedudb”
DB_USER=”fgedu”
LOG_DIR=”/opengauss/log/performance”
mkdir -p $LOG_DIR
log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1″ | tee -a $LOG_FILE
}
monitor_system() {
LOG_FILE=”$LOG_DIR/system_$(date ‘+%Y%m%d’).log”
log “=== 系统资源监控 ===”
# 系统负载
log “系统负载: $(uptime | awk ‘{print $10 $11 $12}’)”
# CPU使用率
cpu_usage=$(top -bn1 | grep “Cpu(s)” | sed “s/.*, *\([0-9.]*\)%* id.*/\1/” | awk ‘{print 100 – $1}’)
log “CPU使用率: ${cpu_usage}%”
# 内存使用
mem_usage=$(free -m | awk ‘/Mem:/ {print $3/$2 * 100.0}’)
log “内存使用率: ${mem_usage}%”
# 磁盘使用
disk_usage=$(df -h /opengauss | awk ‘/\// {print $5}’)
log “磁盘使用率: ${disk_usage}”
# IO状态
log “IO状态:”
iostat -x | grep -v “^Linux” | grep -v “^$” | tee -a $LOG_FILE
}
monitor_database() {
LOG_FILE=”$LOG_DIR/database_$(date ‘+%Y%m%d’).log”
log “=== 数据库性能监控 ===”
# 连接数
connections=$(gsql -h $DB_IP -p $DB_PORT -d $DB_NAME -U $DB_USER -t -c ”
SELECT count(*) FROM pg_stat_activity;
” | tr -d ‘ ‘)
log “数据库连接数: $connections”
# 活动事务
active_transactions=$(gsql -h $DB_IP -p $DB_PORT -d $DB_NAME -U $DB_USER -t -c ”
SELECT count(*) FROM pg_stat_activity WHERE state = ‘active’;
” | tr -d ‘ ‘)
log “活动事务数: $active_transactions”
# 慢SQL
log “慢SQL:
$(gsql -h $DB_IP -p $DB_PORT -d $DB_NAME -U $DB_USER -t -c ”
SELECT
pid,
usename,
now() – query_start AS duration,
query
FROM pg_stat_activity
WHERE state = ‘active’
AND now() – query_start > interval ‘1 second’
ORDER BY duration DESC
LIMIT 5;
“)”
# 表统计
log “表统计:
$(gsql -h $DB_IP -p $DB_PORT -d $DB_NAME -U $DB_USER -t -c ”
SELECT
relname AS table_name,
n_live_tup AS live_rows,
n_dead_tup AS dead_rows
FROM pg_stat_user_tables
WHERE n_live_tup > 0
ORDER BY n_dead_tup DESC
LIMIT 5;
“)”
}
main() {
monitor_system
monitor_database
}
main
# /opengauss/scripts/performance_monitor.sh
[2024-01-15 14:30:00] 系统负载: 1.25,1.10,0.95
[2024-01-15 14:30:00] CPU使用率: 22.5%
[2024-01-15 14:30:00] 内存使用率: 70.0%
[2024-01-15 14:30:00] 磁盘使用率: 60%
[2024-01-15 14:30:00] IO状态:
Linux 5.4.0-100-generic (fgedu.net.cn) 01/15/2024 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
15.00 0.00 5.00 2.00 0.00 78.00
device r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda 5.00 3.00 0.10 0.05 32.00 0.10 8.00 5.00 12.00 2.00 1.60
sdb 10.00 5.00 0.20 0.10 32.00 0.20 10.00 6.00 16.00 3.00 4.50
[2024-01-15 14:30:01] === 数据库性能监控 ===
[2024-01-15 14:30:01] 数据库连接数: 30
[2024-01-15 14:30:01] 活动事务数: 2
[2024-01-15 14:30:01] 慢SQL:
15234 | fgedu01 | 00:02:30 | SELECT * FROM fgedu_orders WHERE customer_id = 10001;
15289 | fgedu02 | 00:01:15 | INSERT INTO fgedu_sales (order_id, amount) SELECT order_id, total_amount FROM fgedu_order_details WHERE create_date = current_date;
[2024-01-15 14:30:01] 表统计:
fgedu_orders | 100000 | 25000
fgedu_inventory | 50000 | 10000
fgedu_sales | 200000 | 5000
*/10 * * * * /opengauss/scripts/performance_monitor.sh > /dev/null 2>&1
Part05-风哥经验总结与分享
5.1 性能监控经验
风哥提示:性能监控是一个持续的过程,需要建立系统化的监控体系,及时发现并解决性能问题。
1. 全面监控:同时监控系统和数据库层面的指标
2. 设置基线:建立正常运行时的性能基线
3. 趋势分析:分析性能指标的变化趋势
4. 告警及时:设置合理的告警阈值和通知机制
5. 自动化处理:对常见问题进行自动处理
1. 监控本身也会消耗系统资源,需要平衡监控频率和开销
2. 避免过度告警,设置合理的告警阈值和触发条件
3. 定期清理监控数据,避免存储压力
4. 建立监控数据的历史分析机制
5. 结合业务场景进行性能分析
5.2 瓶颈定位技巧
1. 自上而下分析:从系统级到数据库级再到SQL级
2. 对比分析:与历史数据和基线进行对比
3. 关联分析:关联不同指标之间的关系
4. 工具辅助:使用专业的性能分析工具
5. 模拟测试:在测试环境重现性能问题
1. 系统层面:
– 合理配置操作系统参数
– 优化存储配置,使用SSD
– 调整网络参数
2. 数据库层面:
– 优化数据库参数
– 合理设计索引
– 定期VACUUM和ANALYZE
3. SQL层面:
– 优化SQL语句
– 使用绑定变量
– 避免全表扫描
4. 应用层面:
– 优化应用逻辑
– 合理使用连接池
– 减少数据库访问次数
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
