外观
GaussDB 并发参数优化
连接管理参数优化
最大连接数
参数说明
- 参数名:
max_connections - 默认值:5000
- 说明:控制数据库允许的最大连接数
优化建议
# 根据内存容量和业务需求调整
# 公式:max_connections = (可用内存 - 系统预留 - 共享缓冲区) / 单个连接内存消耗
max_connections = 2000注意事项
- 连接数过多会消耗大量内存
- 建议使用连接池管理连接
- 监控连接数使用情况sql
SELECT count(*) FROM pg_stat_activity;
连接超时参数
参数说明
- 参数名:
idle_in_transaction_session_timeout - 默认值:0(无限制)
- 说明:控制空闲事务的超时时间
优化建议
# 避免长事务占用连接
idle_in_transaction_session_timeout = 300000 # 5分钟其他连接超时参数
# 连接建立超时
deadlock_timeout = 1000 # 1秒
# 锁等待超时
lock_timeout = 30000 # 30秒
# 语句执行超时
statement_timeout = 300000 # 5分钟锁管理参数优化
死锁检测
参数说明
- 参数名:
deadlock_timeout - 默认值:1000
- 说明:死锁检测的超时时间
优化建议
# 根据业务场景调整
# 高并发场景可适当缩短
deadlock_timeout = 500 # 500毫秒锁升级
参数说明
- 参数名:
update_lock_default_timeout - 默认值:10000
- 说明:更新锁的默认超时时间
优化建议
# 根据业务场景调整
update_lock_default_timeout = 5000 # 5秒锁等待监控
sql
-- 查看锁等待情况
SELECT
wait_event_type,
wait_event,
count(*)
FROM pg_stat_activity
WHERE wait_event_type = 'Lock'
GROUP BY wait_event_type, wait_event;内存管理参数优化
工作内存
参数说明
- 参数名:
work_mem - 默认值:4MB
- 说明:每个查询操作可使用的内存
优化建议
# 根据查询复杂度和并发数调整
# 公式:work_mem = (可用内存 * 0.2) / max_connections
work_mem = 8MB注意事项
- 过大的 work_mem 会导致内存不足
- 复杂查询可能使用多个 work_mem
- 监控内存使用情况sql
SELECT name, setting, unit FROM pg_settings WHERE name IN ('work_mem', 'shared_buffers', 'maintenance_work_mem');
维护工作内存
参数说明
- 参数名:
maintenance_work_mem - 默认值:64MB
- 说明:维护操作(如 VACUUM、CREATE INDEX)可使用的内存
优化建议
# 建议为系统内存的 5%-10%
maintenance_work_mem = 256MB临时缓冲区
参数说明
- 参数名:
temp_buffers - 默认值:8MB
- 说明:每个会话的临时缓冲区大小
优化建议
# 根据临时表使用情况调整
temp_buffers = 16MB并行度参数优化
最大并行工作者数
参数说明
- 参数名:
max_parallel_workers - 默认值:8
- 说明:系统级别的最大并行工作者数
优化建议
# 建议为 CPU 核心数的 75%
max_parallel_workers = 12每个 gather 节点的最大并行工作者数
参数说明
- 参数名:
max_parallel_workers_per_gather - 默认值:4
- 说明:每个查询 gather 节点的最大并行工作者数
优化建议
# 根据查询复杂度调整
max_parallel_workers_per_gather = 4并行扫描
参数说明
- 参数名:
force_parallel_mode - 默认值:off
- 说明:控制是否强制使用并行查询
优化建议
# 建议保持默认值,让优化器自动决定
force_parallel_mode = off并行度监控
sql
-- 查看并行查询情况
SELECT
query,
workers_planned,
workers_active
FROM pg_stat_activity
WHERE state = 'active'
AND query LIKE '%SELECT%';事务管理参数优化
隔离级别
参数说明
- 参数名:
default_transaction_isolation - 默认值:read committed
- 说明:默认的事务隔离级别
优化建议
# 根据业务一致性要求调整
# 高并发场景推荐 read committed
default_transaction_isolation = 'read committed'事务同步
参数说明
- 参数名:
synchronous_commit - 默认值:on
- 说明:控制事务提交是否等待 WAL 写入磁盘
优化建议
# 高并发场景可适当放宽
synchronous_commit = local其他事务参数
# 事务超时
transaction_timeout = 0 # 无限制
# 事务只读模式
default_transaction_read_only = off资源管理参数优化
资源组
参数说明
- GaussDB 支持资源组管理
- 可根据用户或应用分配资源
- 控制 CPU、内存、IO 等资源
优化建议
sql
-- 创建资源组
CREATE RESOURCE GROUP rg_high WITH (cpu_core_limit=8, memory_limit=50, io_limit=50);
-- 将用户分配到资源组
ALTER USER username RESOURCE GROUP rg_high;
-- 查看资源组使用情况
SELECT * FROM pg_resource_group_status;语句队列
参数说明
- 参数名:
statement_queue_depth - 默认值:0(关闭)
- 说明:控制语句队列的深度
优化建议
# 高并发场景可开启
statement_queue_depth = 100并发参数监控
连接数监控
sql
SELECT
count(*) AS current_connections,
setting AS max_connections,
round(count(*)::numeric / setting::numeric * 100, 2) AS used_percent
FROM pg_stat_activity,
pg_settings
WHERE name = 'max_connections'
GROUP BY setting;锁监控
sql
-- 查看锁等待情况
SELECT
a.datname,
a.usename,
a.application_name,
a.client_addr,
a.wait_event_type,
a.wait_event,
a.query
FROM pg_stat_activity a
WHERE a.wait_event_type = 'Lock';
-- 查看锁持有情况
SELECT
locktype,
database,
relation::regclass,
mode,
granted,
pid,
usename
FROM pg_locks
WHERE relation IS NOT NULL;内存监控
sql
-- 查看内存使用情况
SELECT
name,
setting,
unit,
short_desc
FROM pg_settings
WHERE name IN ('shared_buffers', 'work_mem', 'maintenance_work_mem', 'temp_buffers');并行查询监控
sql
-- 查看并行查询统计
SELECT
relname,
seq_scan,
seq_tup_read,
idx_scan,
idx_tup_fetch,
n_tup_ins,
n_tup_upd,
n_tup_del
FROM pg_stat_user_tables
ORDER BY seq_scan DESC;并发参数优化最佳实践
1. 建立基准
- 收集当前系统的并发参数设置
- 建立性能基线
- 记录并发处理能力
2. 逐步调整
- 一次只调整少数几个参数
- 每次调整后监控效果
- 根据监控结果决定是否继续调整
3. 监控和分析
- 实时监控并发指标
- 分析慢查询和锁等待
- 识别性能瓶颈
- 调整优化策略
4. 结合业务场景
- OLTP 场景:优化连接数、锁等待、事务隔离级别
- OLAP 场景:优化并行度、内存参数
- 混合场景:平衡各种参数
5. 使用连接池
- 减少连接建立开销
- 管理连接生命周期
- 控制并发连接数
- 提高连接利用率
并发问题排查
常见并发问题
- 连接数不足:应用无法连接到数据库
- 锁等待:事务等待锁释放
- 死锁:事务互相等待锁
- 长事务:事务长时间占用资源
- 内存不足:并发连接导致内存耗尽
排查步骤
- 查看连接数使用情况
- 检查锁等待和死锁
- 分析慢查询
- 监控内存使用
- 检查并行查询情况
- 调整相关参数
- 验证优化效果
案例分析
案例一:高并发 OLTP 系统优化
问题描述
- 系统并发连接数高
- 经常出现锁等待
- 偶尔发生死锁
优化措施
# 调整连接参数
max_connections = 1500
idle_in_transaction_session_timeout = 300000
# 调整锁参数
deadlock_timeout = 500
lock_timeout = 10000
# 调整事务参数
default_transaction_isolation = 'read committed'
synchronous_commit = local
# 调整内存参数
work_mem = 6MB
maintenance_work_mem = 128MB优化效果
- 锁等待时间减少 60%
- 死锁发生频率降低 80%
- 系统吞吐量提高 30%
案例二:OLAP 系统并行度优化
问题描述
- 复杂查询执行时间长
- CPU 利用率低
- 内存使用不均衡
优化措施
# 调整并行度参数
max_parallel_workers = 16
max_parallel_workers_per_gather = 6
force_parallel_mode = on
# 调整内存参数
work_mem = 32MB
maintenance_work_mem = 512MB
shared_buffers = 8GB优化效果
- 查询执行时间减少 50%
- CPU 利用率提高 40%
- 系统处理能力提高 60%
常见问题(FAQ)
Q1: 如何确定最佳的 max_connections 值?
A1: 最佳 max_connections 值取决于:
- 可用内存容量
- 单个连接的内存消耗(约 10-20MB)
- 业务并发需求
- 系统预留内存
计算公式:
max_connections = (总内存 - 系统预留 - 共享缓冲区) / 单个连接内存消耗Q2: 如何减少锁等待?
A2: 减少锁等待的方法:
- 缩短事务执行时间
- 优化查询,减少锁持有时间
- 调整隔离级别
- 适当设置锁超时
- 避免长事务
- 优化索引,减少全表扫描
Q3: 并行查询一定能提高性能吗?
A3: 并行查询不一定能提高性能,取决于:
- 查询复杂度
- 数据量大小
- CPU 核心数
- 内存容量
- I/O 性能
简单查询或小数据量查询使用并行查询可能会增加开销,反而降低性能。
Q4: 如何监控并发性能?
A4: 监控并发性能的方法:
- 监控连接数使用情况
- 查看锁等待和死锁
- 分析慢查询
- 监控 CPU 和内存使用率
- 查看并行查询统计
- 使用性能监控工具如 Prometheus + Grafana
Q5: 如何处理连接数不足的问题?
A5: 处理连接数不足的方法:
- 增加 max_connections 参数(如果内存允许)
- 使用连接池管理连接
- 优化应用程序,减少连接占用时间
- 关闭空闲连接
- 增加数据库实例,实现读写分离
Q6: 事务隔离级别对并发有什么影响?
A6: 不同隔离级别对并发的影响:
- read uncommitted:并发最高,一致性最低
- read committed:并发较高,一致性适中
- repeatable read:并发较低,一致性较高
- serializable:并发最低,一致性最高
高并发场景推荐使用 read committed 隔离级别。
