下面从系统层、PostgreSQL 配置层、SQL/索引层、运维层四个维度,系统性地说明如何优化 CentOS 上的 PostgreSQL,适用于 OLTP / OLAP / 混合场景。
编辑 /etc/sysctl.conf:
# 内存相关
vm.swappiness = 1
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
# 网络
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 共享内存
kernel.shmmax = 68719476736
kernel.shmall = 16777216
生效:
sysctl -p
PostgreSQL 不推荐 THP:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
写入开机:
vi /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
✅ 推荐:
noatime,nodiratime,data=writeback
示例:
mount -o noatime,nodiratime /dev/sdb /var/lib/pgsql
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
假设服务器内存 16G,可按比例调整
shared_buffers = 4GB # 25% 内存
work_mem = 32MB # 每个排序/哈希操作
maintenance_work_mem = 512MB
effective_cache_size = 12GB # 给优化器看的
wal_buffers = 16MB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
max_wal_size = 2GB
min_wal_size = 512MB
max_connections = 200
superuser_reserved_connections = 5
⚠️ 高并发建议:
random_page_cost = 1.1
seq_page_cost = 1.0
(SSD 场景)
log_min_duration_statement = 500ms
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d.log'
✅ 原则:
-- 复合索引
CREATE INDEX idx_user_status ON users(status, created_at);
-- 部分索引
CREATE INDEX idx_active_user ON users(id) WHERE status='active';
❌ 不推荐:
SELECT * FROM orders;
LIKE '%abc%'
✅ 推荐:
SELECT id, name FROM orders WHERE status = 'paid';
EXPLAIN (ANALYZE, BUFFERS) SELECT ...
关注:
VACUUM ANALYZE;
或自动:
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05
CREATE TABLE orders (
id serial,
created_at date
) PARTITION BY RANGE (created_at);
适合:
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 50
| 工具 | 用途 |
|---|---|
| pg_stat_statements | SQL 性能 |
| pg_top | 实时 |
| Prometheus + Grafana | 长期 |
| pgBadger | 日志分析 |
启用:
shared_preload_libraries = 'pg_stat_statements'
✅ 关闭 THP
✅ 调整 shared_buffers / work_mem
✅ SSD + XFS
✅ 使用连接池
✅ 慢 SQL 分析
✅ 定期 VACUUM
你可以直接告诉我:
我可以给你 一份精确参数配置表 或 针对某条 SQL 的优化方案。