在 CentOS 上优化 PostgreSQL,通常从 系统层、数据库参数、SQL/索引、运维策略 四个方面入手。下面给你一套实用、可落地的调优指南(适用于 CentOS 7/8、Rocky / Alma 也类似)。
free -h
vm.swappiness = 1
编辑:
vi /etc/sysctl.conf
vm.swappiness = 1
sysctl -p
# /etc/sysctl.conf
kernel.shmmax = 17179869184
kernel.shmall = 4194304
net.core.somaxconn = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
sysctl -p
ulimit -n
建议 ≥ 65535
编辑:
vi /etc/security/limits.conf
postgres soft nofile 65535
postgres hard nofile 65535
noatime,nodiratime,data=writeback
假设服务器内存 16GB,生产环境示例
# 内存配置
shared_buffers = 4GB # 25% 内存
work_mem = 32MB # 复杂查询排序
maintenance_work_mem = 512MB # VACUUM / CREATE INDEX
# 缓存
effective_cache_size = 12GB # 留给 OS + PG 的缓存
wal_buffers = 16MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
max_wal_size = 2GB
min_wal_size = 512MB
max_connections = 200
⚠️ 不要盲目调大
logging_collector = on
log_min_duration_statement = 500ms
log_checkpoints = on
log_connections = off
log_disconnections = off
cat /proc/meminfo | grep Huge
如启用:
huge_pages = try
SELECT * FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
需开启:
shared_preload_libraries = 'pg_stat_statements'
✅ 适合加索引:
❌ 不适合:
常见索引类型:
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_order_date ON orders(created_at DESC);
SELECT *LIKE '%abc%'WHERE DATE(create_time) = '2024-01-01' ❌
WHERE create_time >= '2024-01-01' ❌
VACUUM ANALYZE;
或自动:
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
CREATE TABLE orders PARTITION BY RANGE (created_at);
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 50
shared_buffers = 4GB
work_mem = 32MB
maintenance_work_mem = 512MB
effective_cache_size = 12GB
max_connections = 200
checkpoint_timeout = 15min
max_wal_size = 2GB
pg_stat_statements 慢 SQL你可以直接告诉我:
服务器内存多少?PostgreSQL 版本?主要用途(OLTP / 报表 / 日志)?