在 CentOS 上优化 PostgreSQL,通常可以从系统层面、数据库配置、硬件与文件系统、运维监控几个方面入手。下面给你一套比较实用、可落地的优化思路(以 CentOS 7/8 + PostgreSQL 12/13/14 为例)。
getenforce
# 如果是 Enforcing,可临时关闭
setenforce 0
# 永久关闭(生产谨慎)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
确保 PostgreSQL 端口(默认 5432)开放:
firewall-cmd --add-port=5432/tcp --permanent
firewall-cmd --reload
编辑 /etc/sysctl.conf:
# 共享内存
kernel.shmmax = 68719476736
kernel.shmall = 16777216
# 文件句柄
fs.file-max = 1000000
# 网络
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
生效:
sysctl -p
/etc/security/limits.conf:
postgres soft nofile 65536
postgres hard nofile 65536
mount -o noatime,nodiratime /dev/sdb /var/lib/pgsql
/var/lib/pgsql配置文件位置(以 RPM 安装为例):
/var/lib/pgsql/14/data/postgresql.conf
shared_buffers = 25% ~ 40% 内存
work_mem = 16MB ~ 64MB(复杂查询可调大)
maintenance_work_mem = 512MB ~ 1GB
effective_cache_size = 50% ~ 75% 内存
示例(32GB 内存):
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
random_page_cost = 1.1 # SSD
seq_page_cost = 1.0
default_statistics_target = 100
VACUUM ANALYZE;
或配置自动清理:
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05
yum install pgbouncer
模式建议:
transaction 模式(Web 应用)top
iostat -x 1
vmstat 1
SELECT * FROM pg_stat_activity;
SELECT * FROM pg_stat_statements;
启用:
shared_preload_libraries = 'pg_stat_statements'
| 问题 | 可能原因 |
|---|---|
| CPU 高 | 缺少索引 / 慢 SQL |
| IO 高 | checkpoint 频繁 |
| 内存爆 | work_mem 过大 |
| 连接满 | 没用连接池 |
shared_buffers = 4GB
effective_cache_size = 12GB
work_mem = 16MB
maintenance_work_mem = 512MB
max_connections = 200
wal_buffers = 16MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
如果你能告诉我:
我可以直接给你一套可复制的配置文件。