在 CentOS 上调优 PostgreSQL,通常从系统层面、数据库参数、SQL 与索引、监控四个方面入手。下面给你一份较实用的调优指南(以 CentOS 7/8 + PostgreSQL 12/13/14 为例,其他版本类似)。
# 共享内存
kernel.shmmax = 68719476736
kernel.shmall = 16777216
# 网络
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
# 文件句柄
fs.file-max = 655360
执行:
sysctl -p
postgres soft nofile 65536
postgres hard nofile 65536
postgres soft nproc 65536
postgres hard nproc 65536
echo never > /sys/kernel/mm/transparent_hugepage/enabled
并写入开机脚本。
noatime,nodiratime,barrier=0(有UPS时)
配置文件位置:
/var/lib/pgsql/14/data/postgresql.conf
shared_buffers = 25% ~ 40% 内存
effective_cache_size = 50% ~ 75% 内存
work_mem = 16MB ~ 64MB(按并发调整)
maintenance_work_mem = 512MB ~ 2GB
示例(32G 内存):
shared_buffers = 8GB
effective_cache_size = 24GB
work_mem = 32MB
maintenance_work_mem = 1GB
wal_buffers = 16MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
max_wal_size = 4GB
min_wal_size = 1GB
max_connections = 200 ~ 500
superuser_reserved_connections = 5
⚠️ 高并发建议配合 PgBouncer
max_parallel_workers_per_gather = 4
max_parallel_workers = 8
max_parallel_maintenance_workers = 4
SELECT * FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
启用:
shared_preload_libraries = 'pg_stat_statements'
SELECT *EXPLAIN ANALYZEVACUUM / ANALYZEVACUUM ANALYZE;
或自动:
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
pg_stat_activitypg_stat_statementspg_top✅ 内存参数是否合理
✅ 是否启用 pg_stat_statements
✅ 是否有慢 SQL
✅ 是否使用连接池
✅ 是否定期 VACUUM
如果你能提供:
我可以给你一份可直接用的 postgresql.conf 配置。