在CentOS上优化PostgreSQL,通常从系统层、数据库参数、硬件与存储、SQL与索引、监控与维护几个方面入手。下面给你一套实战型优化清单,适合生产环境。
PostgreSQL 不推荐 THP,会导致延迟抖动。
# 查看
cat /sys/kernel/mm/transparent_hugepage/enabled
# 临时关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 永久关闭(CentOS 7/8)
vim /etc/default/grub
# 在 GRUB_CMDLINE_LINUX 后加
transparent_hugepage=never
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
vim /etc/sysctl.conf
常用优化项:
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.overcommit_memory = 2
kernel.shmmax = 17179869184
kernel.shmall = 4194304
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
生效:
sysctl -p
vim /etc/security/limits.conf
postgres soft nofile 65535
postgres hard nofile 65535
cat /sys/block/sda/queue/scheduler
echo deadline > /sys/block/sda/queue/scheduler
shared_buffers = 25% ~ 40% 内存
work_mem = 4MB ~ 64MB(复杂查询可调大)
maintenance_work_mem = 512MB ~ 2GB
effective_cache_size = 50% ~ 75% 内存
示例(32GB 内存服务器):
shared_buffers = 8GB
work_mem = 32MB
maintenance_work_mem = 1GB
effective_cache_size = 24GB
wal_buffers = 16MB
checkpoint_timeout = 15min ~ 30min
max_wal_size = 4GB
min_wal_size = 1GB
synchronous_commit = off # 非金融场景可关闭
max_connections = 200 ~ 500
superuser_reserved_connections = 10
⚠️ 高并发建议配合 pgbouncer
random_page_cost = 1.1 # SSD
seq_page_cost = 1.0
default_statistics_target = 200
mkfs.xfs /dev/sdb
/var/lib/pgsql/data
/var/lib/pgsql/wal
CREATE INDEX idx_order_time ON orders(created_at);
EXPLAIN ANALYZE SELECT * FROM orders WHERE id = 1;
关注:
ANALYZE orders;
或自动:
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05
REINDEX INDEX idx_name;
启用:
shared_preload_libraries = 'pg_stat_statements'
你可以直接告诉我:
我可以给你一份完全定制的 postgresql.conf 配置。