优化 Debian 上的 PostgreSQL,可以从系统层面、数据库配置、SQL/索引、维护与监控几个方面入手。下面按“实用优先级”给你一套可操作的优化清单。
free -h
swapon --show
sysctl vm.swappiness=10
noatime,nodiratime,barrier=0 (仅当电池保护的 RAID)
sysctl -w kernel.shmmax=17179869184
sysctl -w kernel.shmall=4194304
⚠️ 修改后需重启或 reload:
systemctl reload postgresql
shared_buffers = 25% ~ 40% 物理内存
effective_cache_size = 50% ~ 75% 物理内存
work_mem = 16MB ~ 64MB(按并发调整)
maintenance_work_mem = 512MB ~ 2GB
示例(16G 内存):
shared_buffers = 4GB
effective_cache_size = 12GB
work_mem = 32MB
maintenance_work_mem = 1GB
max_connections = 100 ~ 300
⚠️ 高并发建议使用 PgBouncer
wal_buffers = 16MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
synchronous_commit = off # 非关键数据可关
random_page_cost = 1.1 # SSD
seq_page_cost = 1.0
default_statistics_target = 100
CREATE INDEX idx_name ON table USING gin (col gin_trgm_ops);
EXPLAIN ANALYZE SELECT ...;
开启慢日志:
log_min_duration_statement = 500
ANALYZE;
VACUUM ANALYZE;
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
vacuumdb --all --analyze
[databases]
mydb = host=127.0.0.1 dbname=mydb
[pgbouncer]
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20
pg_stat_statementspg_topprometheus + grafana + postgres_exporterhtop, iotop, dstat启用统计:
shared_preload_libraries = 'pg_stat_statements'
systemd 正确管理:systemctl status postgresql
如果你愿意,可以告诉我:
我可以给你一份精准的 postgresql.conf 配置。