Skip to content

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. 使用连接池

  • 减少连接建立开销
  • 管理连接生命周期
  • 控制并发连接数
  • 提高连接利用率

并发问题排查

常见并发问题

  • 连接数不足:应用无法连接到数据库
  • 锁等待:事务等待锁释放
  • 死锁:事务互相等待锁
  • 长事务:事务长时间占用资源
  • 内存不足:并发连接导致内存耗尽

排查步骤

  1. 查看连接数使用情况
  2. 检查锁等待和死锁
  3. 分析慢查询
  4. 监控内存使用
  5. 检查并行查询情况
  6. 调整相关参数
  7. 验证优化效果

案例分析

案例一:高并发 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 值取决于:

  1. 可用内存容量
  2. 单个连接的内存消耗(约 10-20MB)
  3. 业务并发需求
  4. 系统预留内存

计算公式:

max_connections = (总内存 - 系统预留 - 共享缓冲区) / 单个连接内存消耗

Q2: 如何减少锁等待?

A2: 减少锁等待的方法:

  1. 缩短事务执行时间
  2. 优化查询,减少锁持有时间
  3. 调整隔离级别
  4. 适当设置锁超时
  5. 避免长事务
  6. 优化索引,减少全表扫描

Q3: 并行查询一定能提高性能吗?

A3: 并行查询不一定能提高性能,取决于:

  1. 查询复杂度
  2. 数据量大小
  3. CPU 核心数
  4. 内存容量
  5. I/O 性能

简单查询或小数据量查询使用并行查询可能会增加开销,反而降低性能。

Q4: 如何监控并发性能?

A4: 监控并发性能的方法:

  1. 监控连接数使用情况
  2. 查看锁等待和死锁
  3. 分析慢查询
  4. 监控 CPU 和内存使用率
  5. 查看并行查询统计
  6. 使用性能监控工具如 Prometheus + Grafana

Q5: 如何处理连接数不足的问题?

A5: 处理连接数不足的方法:

  1. 增加 max_connections 参数(如果内存允许)
  2. 使用连接池管理连接
  3. 优化应用程序,减少连接占用时间
  4. 关闭空闲连接
  5. 增加数据库实例,实现读写分离

Q6: 事务隔离级别对并发有什么影响?

A6: 不同隔离级别对并发的影响:

  • read uncommitted:并发最高,一致性最低
  • read committed:并发较高,一致性适中
  • repeatable read:并发较低,一致性较高
  • serializable:并发最低,一致性最高

高并发场景推荐使用 read committed 隔离级别。